{
"require": [
"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js",
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js",
"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js",
"$:/plugins/tiddlywiki/codemirror/keymap/vim.js",
"$:/plugins/tiddlywiki/codemirror/keymap/emacs.js"
],
"configuration": {
"keyMap": "emacs",
"matchBrackets":true,
"showCursorWhenSelecting": true
}
}
{
"filesystem": {
"PATH": "SocialCalc/Demos"
},
"graphics": "native",
"grid": "yes",
"LANG": "en-GB",
"heightInTiddlerEditor": 500,
"":""
}
{
"filesystem": {
"PATH": "Three.js/Tests"
},
"":""
}
{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"type": "text/vnd.tiddlywiki",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007\nCopyright © UnaMesa Association 2007-2014\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of the UnaMesa Association nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n"
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z M85.1274062,95.4080042 C81.5494069,95.3047989 79.9756384,95.3136745 78.1534289,92.2560668 L76.733228,92.2975844 C75.0801573,92.2226776 75.7690718,92.256631 74.6662332,92.2006037 C72.822332,92.1273894 73.1177105,90.3396383 72.7933215,89.3950941 C72.2744094,86.1888106 73.4800004,82.9659571 73.4419681,79.7590415 C73.428503,78.6206623 71.8498363,74.5912119 71.2858469,73.150598 C69.5178104,73.490271 67.7401827,73.5550323 65.9465048,73.6462337 C61.8120677,73.6358996 57.7056703,73.1192806 53.628962,72.4632293 C52.8345141,75.8119659 50.473106,80.4990751 52.4249964,83.9024219 C54.794228,87.4227874 56.45684,88.3980868 59.0339286,88.6103485 C61.6109895,88.8224384 62.1929077,91.7913467 61.5694236,92.8517379 C61.0175661,93.5845847 60.0476425,93.7176093 59.2235739,93.8951553 L57.5752147,93.9742093 C56.2780933,93.9296822 55.1187057,93.5723203 53.9629071,93.0211763 C52.0327307,91.9217335 50.0392154,89.6360411 48.5580719,87.9950695 C48.9028934,88.6503604 49.1085703,89.9296134 48.7958122,90.5249222 C47.9200982,91.7907825 44.1326257,91.7830485 42.3980986,90.996433 C40.4277043,90.1030197 35.6664658,83.8299171 34.9303347,79.1316435 C36.8887135,75.3525836 39.7416856,72.0607931 41.1850909,67.9459622 C38.038852,65.8974525 36.3537697,62.5626501 36.5725198,58.7851619 L36.6514762,58.3478913 C33.5557196,58.9392548 35.1611076,58.7192345 31.8308843,58.9762949 C21.2252017,58.9431831 11.8983553,51.6054609 17.1501626,40.2013394 C17.4916881,39.5260388 17.8165752,38.9120742 18.3955298,39.205288 C18.8602051,39.440565 18.793457,40.3843583 18.5597268,41.4309776 C15.5577203,55.057365 30.2297484,55.161659 39.2489049,52.6401668 C40.1440491,52.3898612 41.9243599,50.7040626 43.1576153,50.1452033 C45.1734825,49.231769 47.3615008,48.8611654 49.5329344,48.5941256 C54.9337165,47.9661653 61.4247946,50.8693254 64.7228943,50.9641212 C68.0210328,51.0589131 72.7127563,50.1582941 75.5928121,50.3479196 C77.6825379,50.4454833 79.734518,50.8303777 81.7507717,51.3786556 C83.0558682,44.8897102 83.1481363,40.1071855 86.2420439,39 C88.0578592,39.2926449 89.4570618,41.8175853 90.4927503,43.1666676 C92.6062592,43.0809984 94.6134653,43.6270518 96.6091885,44.233091 C100.222332,43.7098824 103.254293,41.6394732 106.445091,40.0288813 C103.211767,42.7223157 102.77315,47.1042714 103.142605,51.1564486 C103.280001,53.2591496 102.697713,55.5420684 101.977868,57.6949551 C100.630795,61.2025356 98.0292951,64.8997754 95.009908,64.7101481 C93.868464,64.673306 93.2053722,64.0138 92.3570101,63.3096933 C92.1924386,64.7358711 91.5456263,66.0084523 90.9221089,67.2697748 C89.4822206,70.066388 85.7194927,71.2987762 82.2354164,74.2849828 C78.7515768,77.2712347 83.3502408,87.9363951 84.4652464,89.8796277 C85.5800708,91.8230453 88.6922789,92.5339992 87.484639,94.28798 C87.1151913,94.8672415 86.5502884,95.0744181 85.9465544,95.2991347 L85.1274062,95.4080042 Z M45.0303574,86.5575217 L45.5828655,86.699414 C46.277142,86.4290005 47.6727292,86.8469317 48.4130246,87.0512628 C47.0498362,85.7357167 44.9960929,83.8038623 43.5164417,82.5859671 C43.0307739,81.1115156 43.2380006,79.6278431 43.3424927,78.122648 L43.3634516,77.9981264 C42.7802099,79.2030731 42.040056,80.3743566 41.6422405,81.6426885 C41.176708,83.3537773 43.7112632,85.1999538 44.6940603,86.2580263 L45.0303574,86.5575217 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-advanced-search-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M74.5651535,87.9848361 C66.9581537,93.0488876 57.8237115,96 48,96 C21.490332,96 0,74.509668 0,48 C0,21.490332 21.490332,0 48,0 C74.509668,0 96,21.490332 96,48 C96,57.8541369 93.0305793,67.0147285 87.9377231,74.6357895 L122.284919,108.982985 C125.978897,112.676963 125.973757,118.65366 122.284271,122.343146 C118.593975,126.033442 112.613238,126.032921 108.92411,122.343793 L74.5651535,87.9848361 Z M48,80 C65.673112,80 80,65.673112 80,48 C80,30.326888 65.673112,16 48,16 C30.326888,16 16,30.326888 16,48 C16,65.673112 30.326888,80 48,80 Z\"></path>\n <circle cx=\"48\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"28\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"68\" cy=\"48\" r=\"8\"></circle>\n </g>\n</svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-blank tc-image-button\" viewBox=\"63 152 64 64\" width=\"22pt\" height=\"22pt\"></svg>\n"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n\t<g fill-rule=\"evenodd\">\n\t <path d=\"M64,76.3137085 L47.0294734,93.2842351 C43.9038742,96.4098343 38.8399231,96.4084656 35.7157288,93.2842712 C32.5978915,90.166434 32.5915506,85.0947409 35.7157649,81.9705266 L52.6862915,65 L35.7157649,48.0294734 C32.5901657,44.9038742 32.5915344,39.8399231 35.7157288,36.7157288 C38.833566,33.5978915 43.9052591,33.5915506 47.0294734,36.7157649 L64,53.6862915 L80.9705266,36.7157649 C84.0961258,33.5901657 89.1600769,33.5915344 92.2842712,36.7157288 C95.4021085,39.833566 95.4084494,44.9052591 92.2842351,48.0294734 L75.3137085,65 L92.2842351,81.9705266 C95.4098343,85.0961258 95.4084656,90.1600769 92.2842712,93.2842712 C89.166434,96.4021085 84.0947409,96.4084494 80.9705266,93.2842351 L64,76.3137085 Z M64,129 C99.346224,129 128,100.346224 128,65 C128,29.653776 99.346224,1 64,1 C28.653776,1 1.13686838e-13,29.653776 1.13686838e-13,65 C1.13686838e-13,100.346224 28.653776,129 64,129 Z M64,113 C90.509668,113 112,91.509668 112,65 C112,38.490332 90.509668,17 64,17 C37.490332,17 16,38.490332 16,65 C16,91.509668 37.490332,113 64,113 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-down tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 40.500000) rotate(-270.000000) translate(-64.000000, -40.500000) translate(-22.500000, -26.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-left tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\" version=\"1.1\">\n <g fill-rule=\"evenodd\" transform=\"translate(92.500000, 64.000000) rotate(-180.000000) translate(-92.500000, -64.000000) translate(6.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-right tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-48.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-up tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 89.500000) rotate(-90.000000) translate(-64.000000, -89.500000) translate(-22.500000, 22.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-clone-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M32.2650915,96 L32.2650915,120.002359 C32.2650915,124.419334 35.8432884,128 40.2627323,128 L120.002359,128 C124.419334,128 128,124.421803 128,120.002359 L128,40.2627323 C128,35.8457573 124.421803,32.2650915 120.002359,32.2650915 L96,32.2650915 L96,48 L108.858899,48 C110.519357,48 111.853018,49.3405131 111.853018,50.9941198 L111.853018,108.858899 C111.853018,110.519357 110.512505,111.853018 108.858899,111.853018 L50.9941198,111.853018 C49.333661,111.853018 48,110.512505 48,108.858899 L48,96 L32.2650915,96 Z\"></path>\n <path d=\"M40,56 L32.0070969,56 C27.5881712,56 24,52.418278 24,48 C24,43.5907123 27.5848994,40 32.0070969,40 L40,40 L40,32.0070969 C40,27.5881712 43.581722,24 48,24 C52.4092877,24 56,27.5848994 56,32.0070969 L56,40 L63.9929031,40 C68.4118288,40 72,43.581722 72,48 C72,52.4092877 68.4151006,56 63.9929031,56 L56,56 L56,63.9929031 C56,68.4118288 52.418278,72 48,72 C43.5907123,72 40,68.4151006 40,63.9929031 L40,56 Z M7.9992458,0 C3.58138434,0 0,3.5881049 0,7.9992458 L0,88.0007542 C0,92.4186157 3.5881049,96 7.9992458,96 L88.0007542,96 C92.4186157,96 96,92.4118951 96,88.0007542 L96,7.9992458 C96,3.58138434 92.4118951,0 88.0007542,0 L7.9992458,0 Z M19.0010118,16 C17.3435988,16 16,17.336731 16,19.0010118 L16,76.9989882 C16,78.6564012 17.336731,80 19.0010118,80 L76.9989882,80 C78.6564012,80 80,78.663269 80,76.9989882 L80,19.0010118 C80,17.3435988 78.663269,16 76.9989882,16 L19.0010118,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-close-all-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-23.000000, -23.000000)\">\n <path d=\"M43,131 L22.9976794,131 C18.5827987,131 15,127.418278 15,123 C15,118.590712 18.5806831,115 22.9976794,115 L43,115 L43,94.9976794 C43,90.5827987 46.581722,87 51,87 C55.4092877,87 59,90.5806831 59,94.9976794 L59,115 L79.0023206,115 C83.4172013,115 87,118.581722 87,123 C87,127.409288 83.4193169,131 79.0023206,131 L59,131 L59,151.002321 C59,155.417201 55.418278,159 51,159 C46.5907123,159 43,155.419317 43,151.002321 L43,131 Z\" transform=\"translate(51.000000, 123.000000) rotate(-45.000000) translate(-51.000000, -123.000000) \"></path>\n <path d=\"M43,59 L22.9976794,59 C18.5827987,59 15,55.418278 15,51 C15,46.5907123 18.5806831,43 22.9976794,43 L43,43 L43,22.9976794 C43,18.5827987 46.581722,15 51,15 C55.4092877,15 59,18.5806831 59,22.9976794 L59,43 L79.0023206,43 C83.4172013,43 87,46.581722 87,51 C87,55.4092877 83.4193169,59 79.0023206,59 L59,59 L59,79.0023206 C59,83.4172013 55.418278,87 51,87 C46.5907123,87 43,83.4193169 43,79.0023206 L43,59 Z\" transform=\"translate(51.000000, 51.000000) rotate(-45.000000) translate(-51.000000, -51.000000) \"></path>\n <path d=\"M115,59 L94.9976794,59 C90.5827987,59 87,55.418278 87,51 C87,46.5907123 90.5806831,43 94.9976794,43 L115,43 L115,22.9976794 C115,18.5827987 118.581722,15 123,15 C127.409288,15 131,18.5806831 131,22.9976794 L131,43 L151.002321,43 C155.417201,43 159,46.581722 159,51 C159,55.4092877 155.419317,59 151.002321,59 L131,59 L131,79.0023206 C131,83.4172013 127.418278,87 123,87 C118.590712,87 115,83.4193169 115,79.0023206 L115,59 Z\" transform=\"translate(123.000000, 51.000000) rotate(-45.000000) translate(-123.000000, -51.000000) \"></path>\n <path d=\"M115,131 L94.9976794,131 C90.5827987,131 87,127.418278 87,123 C87,118.590712 90.5806831,115 94.9976794,115 L115,115 L115,94.9976794 C115,90.5827987 118.581722,87 123,87 C127.409288,87 131,90.5806831 131,94.9976794 L131,115 L151.002321,115 C155.417201,115 159,118.581722 159,123 C159,127.409288 155.419317,131 151.002321,131 L131,131 L131,151.002321 C131,155.417201 127.418278,159 123,159 C118.590712,159 115,155.419317 115,151.002321 L115,131 Z\" transform=\"translate(123.000000, 123.000000) rotate(-45.000000) translate(-123.000000, -123.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M65.0864256,75.4091629 L14.9727349,125.522854 C11.8515951,128.643993 6.78104858,128.64922 3.65685425,125.525026 C0.539017023,122.407189 0.5336324,117.334539 3.65902635,114.209145 L53.7727171,64.0954544 L3.65902635,13.9817637 C0.537886594,10.8606239 0.532659916,5.79007744 3.65685425,2.6658831 C6.77469148,-0.451954124 11.8473409,-0.457338747 14.9727349,2.66805521 L65.0864256,52.7817459 L115.200116,2.66805521 C118.321256,-0.453084553 123.391803,-0.458311231 126.515997,2.6658831 C129.633834,5.78372033 129.639219,10.8563698 126.513825,13.9817637 L76.4001341,64.0954544 L126.513825,114.209145 C129.634965,117.330285 129.640191,122.400831 126.515997,125.525026 C123.39816,128.642863 118.32551,128.648248 115.200116,125.522854 L65.0864256,75.4091629 L65.0864256,75.4091629 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-others-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 127\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z M64,96 C81.673112,96 96,81.673112 96,64 C96,46.326888 81.673112,32 64,32 C46.326888,32 32,46.326888 32,64 C32,81.673112 46.326888,96 64,96 Z M64,80 C72.836556,80 80,72.836556 80,64 C80,55.163444 72.836556,48 64,48 C55.163444,48 48,55.163444 48,64 C48,72.836556 55.163444,80 64,80 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\" transform=\"translate(12.000000, 0.000000)\">\n <rect x=\"0\" y=\"11\" width=\"105\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"28\" y=\"0\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"112\" width=\"88\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"56\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"32\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n </g>\n</svg>\n"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M3.52445141,76.8322939 C2.07397484,75.3828178 1.17514421,73.3795385 1.17514421,71.1666288 L1.17514421,23.1836596 C1.17514421,18.7531992 4.75686621,15.1751442 9.17514421,15.1751442 C13.5844319,15.1751442 17.1751442,18.7606787 17.1751442,23.1836596 L17.1751442,63.1751442 L119.173716,63.1751442 C123.590457,63.1751442 127.175144,66.7568662 127.175144,71.1751442 C127.175144,75.5844319 123.592783,79.1751442 119.173716,79.1751442 L9.17657227,79.1751442 C6.96796403,79.1751442 4.9674142,78.279521 3.51911285,76.8315312 Z\" id=\"Rectangle-285\" transform=\"translate(64.175144, 47.175144) rotate(-45.000000) translate(-64.175144, -47.175144) \"></path>\n </g>\n</svg>\n"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <path d=\"M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z\" transform=\"translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) \"></path>\n</svg>\n"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-download-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 128\"><g fill-rule=\"evenodd\"><path class=\"tc-image-download-button-ring\" d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"/><path d=\"M34.3496823,66.4308767 L61.2415823,93.634668 C63.0411536,95.4551107 65.9588502,95.4551107 67.7584215,93.634668 L94.6503215,66.4308767 C96.4498928,64.610434 96.4498928,61.6588981 94.6503215,59.8384554 C93.7861334,58.9642445 92.6140473,58.4731195 91.3919019,58.4731195 L82.9324098,58.4731195 C80.3874318,58.4731195 78.3243078,56.3860674 78.3243078,53.8115729 L78.3243078,38.6615466 C78.3243078,36.0870521 76.2611837,34 73.7162058,34 L55.283798,34 C52.7388201,34 50.675696,36.0870521 50.675696,38.6615466 L50.675696,38.6615466 L50.675696,53.8115729 C50.675696,56.3860674 48.612572,58.4731195 46.0675941,58.4731195 L37.608102,58.4731195 C35.063124,58.4731195 33,60.5601716 33,63.134666 C33,64.3709859 33.4854943,65.5566658 34.3496823,66.4308767 L34.3496823,66.4308767 Z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M116.870058,45.3431458 L108.870058,45.3431458 L108.870058,45.3431458 L108.870058,61.3431458 L116.870058,61.3431458 L116.870058,45.3431458 Z M124.870058,45.3431458 L127.649881,45.3431458 C132.066101,45.3431458 135.656854,48.9248678 135.656854,53.3431458 C135.656854,57.7524334 132.07201,61.3431458 127.649881,61.3431458 L124.870058,61.3431458 L124.870058,45.3431458 Z M100.870058,45.3431458 L15.6638275,45.3431458 C15.5064377,45.3431458 15.3501085,45.3476943 15.1949638,45.3566664 L15.1949638,45.3566664 C15.0628002,45.3477039 14.928279,45.3431458 14.7913977,45.3431458 C6.68160973,45.3431458 -8.34314575,53.3431458 -8.34314575,53.3431458 C-8.34314575,53.3431458 6.85614548,61.3431458 14.7913977,61.3431458 C14.9266533,61.3431458 15.0596543,61.3384973 15.190398,61.3293588 C15.3470529,61.3385075 15.5049057,61.3431458 15.6638275,61.3431458 L100.870058,61.3431458 L100.870058,45.3431458 L100.870058,45.3431458 Z\" transform=\"translate(63.656854, 53.343146) rotate(-45.000000) translate(-63.656854, -53.343146) \"></path>\n <path d=\"M35.1714596,124.189544 C41.9594858,123.613403 49.068777,121.917633 58.85987,118.842282 C60.6854386,118.268877 62.4306907,117.705515 65.1957709,116.802278 C81.1962861,111.575575 87.0734839,109.994907 93.9414474,109.655721 C102.29855,109.242993 107.795169,111.785371 111.520478,118.355045 C112.610163,120.276732 115.051363,120.951203 116.97305,119.861518 C118.894737,118.771832 119.569207,116.330633 118.479522,114.408946 C113.146151,105.003414 104.734907,101.112919 93.5468356,101.66546 C85.6716631,102.054388 79.4899908,103.716944 62.7116783,109.197722 C59.9734132,110.092199 58.2519873,110.64787 56.4625698,111.20992 C37.002649,117.322218 25.6914684,118.282267 16.8654804,112.957098 C14.9739614,111.815848 12.5154166,112.424061 11.3741667,114.31558 C10.2329168,116.207099 10.84113,118.665644 12.7326489,119.806894 C19.0655164,123.627836 26.4866335,124.926678 35.1714596,124.189544 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-export-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00348646,127.999999 C8.00464867,128 8.00581094,128 8.00697327,128 L119.993027,128 C122.205254,128 124.207939,127.101378 125.657096,125.651198 L125.656838,125.65759 C127.104563,124.210109 128,122.21009 128,119.999949 L128,56.0000511 C128,51.5817449 124.409288,48 120,48 C115.581722,48 112,51.5797863 112,56.0000511 L112,112 L16,112 L16,56.0000511 C16,51.5817449 12.4092877,48 8,48 C3.581722,48 7.10542736e-15,51.5797863 7.10542736e-15,56.0000511 L7.10542736e-15,119.999949 C7.10542736e-15,124.418255 3.59071231,128 8,128 C8.00116233,128 8.0023246,128 8.00348681,127.999999 Z M56.6235633,27.3113724 L47.6580188,36.2769169 C44.5333664,39.4015692 39.4634864,39.4061295 36.339292,36.2819351 C33.2214548,33.1640979 33.2173444,28.0901742 36.3443103,24.9632084 L58.9616908,2.34582788 C60.5248533,0.782665335 62.5748436,0.000361191261 64.624516,2.38225238e-14 L64.6193616,0.00151809229 C66.6695374,0.000796251595 68.7211167,0.781508799 70.2854358,2.34582788 L92.9028163,24.9632084 C96.0274686,28.0878607 96.0320289,33.1577408 92.9078345,36.2819351 C89.7899973,39.3997724 84.7160736,39.4038827 81.5891078,36.2769169 L72.6235633,27.3113724 L72.6235633,88.5669606 C72.6235633,92.9781015 69.0418413,96.5662064 64.6235633,96.5662064 C60.2142756,96.5662064 56.6235633,92.984822 56.6235633,88.5669606 L56.6235633,27.3113724 L56.6235633,27.3113724 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-full-screen-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g>\n <g>\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 104.000000) rotate(-180.000000) translate(-104.000000, -104.000000) translate(80.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(24.000000, 104.000000) rotate(-90.000000) translate(-24.000000, -104.000000) translate(0.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 24.000000) rotate(90.000000) translate(-104.000000, -24.000000) translate(80.000000, 0.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n </g>\n</svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-globe tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M72.8111354,37.1275855 C72.8111354,37.9789875 72.8111354,38.8303894 72.8111354,39.6817913 C72.8111354,41.8784743 73.7885604,46.5631866 72.8111354,48.5143758 C71.3445471,51.4420595 68.1617327,52.0543531 66.4170946,54.3812641 C65.2352215,55.9575873 61.7987417,64.9821523 62.7262858,67.3005778 C66.6959269,77.2228204 74.26087,70.4881886 80.6887657,76.594328 C81.5527211,77.415037 83.5758191,78.8666631 83.985137,79.8899578 C87.2742852,88.1128283 76.4086873,94.8989524 87.7419325,106.189751 C88.9872885,107.430443 91.555495,102.372895 91.8205061,101.575869 C92.6726866,99.0129203 98.5458765,96.1267309 100.908882,94.5234439 C102.928056,93.1534443 105.782168,91.8557166 107.236936,89.7775886 C109.507391,86.5342557 108.717505,82.2640435 110.334606,79.0328716 C112.473794,74.7585014 114.163418,69.3979002 116.332726,65.0674086 C120.230862,57.2857361 121.054075,67.1596684 121.400359,67.5059523 C121.757734,67.8633269 122.411167,67.5059523 122.916571,67.5059523 C123.011132,67.5059523 124.364019,67.6048489 124.432783,67.5059523 C125.0832,66.5705216 123.390209,49.5852316 123.114531,48.2089091 C121.710578,41.1996597 116.17083,32.4278331 111.249523,27.7092761 C104.975994,21.6942076 104.160516,11.5121686 92.9912146,12.7547535 C92.7872931,12.7774397 87.906794,22.9027026 85.2136766,26.2672064 C81.486311,30.9237934 82.7434931,22.1144904 78.6876623,22.1144904 C78.6065806,22.1144904 77.5045497,22.0107615 77.4353971,22.1144904 C76.8488637,22.9942905 75.9952305,26.0101404 75.1288269,26.5311533 C74.8635477,26.6906793 73.4071369,26.2924966 73.2826811,26.5311533 C71.0401728,30.8313939 81.5394677,28.7427264 79.075427,34.482926 C76.7225098,39.9642538 72.747373,32.4860199 72.747373,43.0434079\"></path>\n <path d=\"M44.4668556,7.01044608 C54.151517,13.1403033 45.1489715,19.2084878 47.1611905,23.2253896 C48.8157833,26.5283781 51.4021933,28.6198851 48.8753629,33.038878 C46.8123257,36.6467763 42.0052989,37.0050492 39.251679,39.7621111 C36.2115749,42.8060154 33.7884281,48.7028116 32.4624592,52.6732691 C30.8452419,57.5158356 47.0088721,59.5388126 44.5246867,63.6811917 C43.1386839,65.9923513 37.7785192,65.1466282 36.0880227,63.8791519 C34.9234453,63.0059918 32.4946425,63.3331166 31.6713597,62.0997342 C29.0575851,58.1839669 29.4107339,54.0758543 28.0457962,49.9707786 C27.1076833,47.1493864 21.732611,47.8501656 20.2022714,49.3776393 C19.6790362,49.8998948 19.8723378,51.1703278 19.8723378,51.8829111 C19.8723378,57.1682405 26.9914913,55.1986414 26.9914913,58.3421973 C26.9914913,72.9792302 30.9191897,64.8771867 38.1313873,69.6793121 C48.1678018,76.3618966 45.9763926,76.981595 53.0777543,84.0829567 C56.7511941,87.7563965 60.8192437,87.7689005 62.503478,93.3767069 C64.1046972,98.7081071 53.1759798,98.7157031 50.786754,100.825053 C49.663965,101.816317 47.9736094,104.970571 46.5680513,105.439676 C44.7757187,106.037867 43.334221,105.93607 41.6242359,107.219093 C39.1967302,109.040481 37.7241465,112.151588 37.6034934,112.030935 C35.4555278,109.88297 34.0848666,96.5511248 33.7147244,93.7726273 C33.1258872,89.3524817 28.1241923,88.2337027 26.7275443,84.7420826 C25.1572737,80.8164061 28.2518481,75.223612 25.599097,70.9819941 C19.0797019,60.557804 13.7775712,56.4811506 10.2493953,44.6896152 C9.3074899,41.5416683 13.5912267,38.1609942 15.1264825,35.8570308 C17.0029359,33.0410312 17.7876232,30.0028946 19.8723378,27.2224065 C22.146793,24.1888519 40.8551166,9.46076832 43.8574051,8.63490613 L44.4668556,7.01044608 Z\"></path>\n <path d=\"M64,126 C98.2416545,126 126,98.2416545 126,64 C126,29.7583455 98.2416545,2 64,2 C29.7583455,2 2,29.7583455 2,64 C2,98.2416545 29.7583455,126 64,126 Z M64,120 C94.927946,120 120,94.927946 120,64 C120,33.072054 94.927946,8 64,8 C33.072054,8 8,33.072054 8,64 C8,94.927946 33.072054,120 64,120 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112.9847,119.501583 C112.99485,119.336814 113,119.170705 113,119.003406 L113,67.56802 C116.137461,70.5156358 121.076014,70.4518569 124.133985,67.3938855 C127.25818,64.2696912 127.260618,59.2068102 124.131541,56.0777326 L70.3963143,2.34250601 C68.8331348,0.779326498 66.7828947,-0.000743167069 64.7337457,1.61675364e-05 C62.691312,-0.00409949529 60.6426632,0.777559815 59.077717,2.34250601 L33,28.420223 L33,28.420223 L33,8.00697327 C33,3.58484404 29.4092877,0 25,0 C20.581722,0 17,3.59075293 17,8.00697327 L17,44.420223 L5.3424904,56.0777326 C2.21694607,59.2032769 2.22220878,64.2760483 5.34004601,67.3938855 C8.46424034,70.5180798 13.5271213,70.5205187 16.6561989,67.3914411 L17,67.04764 L17,119.993027 C17,119.994189 17.0000002,119.995351 17.0000007,119.996514 C17.0000002,119.997675 17,119.998838 17,120 C17,124.418278 20.5881049,128 24.9992458,128 L105.000754,128 C109.418616,128 113,124.409288 113,120 C113,119.832611 112.99485,119.666422 112.9847,119.501583 Z M97,112 L97,51.5736087 L97,51.5736087 L64.7370156,19.3106244 L33,51.04764 L33,112 L97,112 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-import-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M105.449437,94.2138951 C105.449437,94.2138951 110.049457,94.1897106 110.049457,99.4026111 C110.049457,104.615512 105.163246,104.615511 105.163246,104.615511 L45.0075072,105.157833 C45.0075072,105.157833 0.367531803,106.289842 0.367532368,66.6449212 C0.367532934,27.0000003 45.0428249,27.0000003 45.0428249,27.0000003 L105.532495,27.0000003 C105.532495,27.0000003 138.996741,25.6734987 138.996741,55.1771866 C138.996741,84.6808745 105.727102,82.8457535 105.727102,82.8457535 L56.1735087,82.8457535 C56.1735087,82.8457535 22.6899229,85.1500223 22.6899229,66.0913753 C22.6899229,47.0327282 56.1735087,49.3383013 56.1735087,49.3383013 L105.727102,49.3383013 C105.727102,49.3383013 111.245209,49.3383024 111.245209,54.8231115 C111.245209,60.3079206 105.727102,60.5074524 105.727102,60.5074524 L56.1735087,60.5074524 C56.1735087,60.5074524 37.48913,60.5074528 37.48913,66.6449195 C37.48913,72.7823862 56.1735087,71.6766023 56.1735087,71.6766023 L105.727102,71.6766029 C105.727102,71.6766029 127.835546,73.1411469 127.835546,55.1771866 C127.835546,35.5304025 105.727102,38.3035317 105.727102,38.3035317 L45.0428249,38.3035317 C45.0428249,38.3035317 11.5287276,38.3035313 11.5287276,66.6449208 C11.5287276,94.9863103 45.0428244,93.9579678 45.0428244,93.9579678 L105.449437,94.2138951 Z\" transform=\"translate(69.367532, 66.000000) rotate(-45.000000) translate(-69.367532, -66.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(0.049406, 0.000000)\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"></path>\n <circle cx=\"64\" cy=\"32\" r=\"8\"></circle>\n <rect x=\"56\" y=\"48\" width=\"16\" height=\"56\" rx=\"8\"></rect>\n </g>\n </g>\n </g>\n</svg>\n"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-locked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M96.4723753,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L32.0000269,64 C32.0028554,48.2766389 32.3030338,16.2688026 64.1594984,16.2688041 C95.9543927,16.2688056 96.4648869,48.325931 96.4723753,64 Z M80.5749059,64 L48.4413579,64 C48.4426205,47.71306 48.5829272,31.9999996 64.1595001,31.9999996 C79.8437473,31.9999996 81.1369461,48.1359182 80.5749059,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <rect x=\"0\" y=\"16\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"56\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"96\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n</svg>\n"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M56,72 L8.00697327,72 C3.59075293,72 0,68.418278 0,64 C0,59.5907123 3.58484404,56 8.00697327,56 L56,56 L56,8.00697327 C56,3.59075293 59.581722,0 64,0 C68.4092877,0 72,3.58484404 72,8.00697327 L72,56 L119.993027,56 C124.409247,56 128,59.581722 128,64 C128,68.4092877 124.415156,72 119.993027,72 L72,72 L72,119.993027 C72,124.409247 68.418278,128 64,128 C59.5907123,128 56,124.415156 56,119.993027 L56,72 L56,72 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-here-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n \t<g transform=\"translate(52.233611, 64.389922) rotate(75.000000) translate(-52.233611, -64.389922) translate(-7.734417, 3.702450)\">\n\t <path d=\"M18.9270186,45.959338 L18.9080585,49.6521741 C18.8884833,53.4648378 21.0574548,58.7482162 23.7526408,61.4434022 L78.5671839,116.257945 C81.2617332,118.952495 85.6348701,118.950391 88.3334363,116.251825 L115.863237,88.7220241 C118.555265,86.0299959 118.564544,81.6509578 115.869358,78.9557717 L61.0548144,24.1412286 C58.3602652,21.4466794 53.0787224,19.2788426 49.2595808,19.3006519 L25.9781737,19.4336012 C22.1633003,19.4553862 19.0471195,22.5673232 19.0275223,26.3842526 L18.9871663,34.2443819 C19.0818862,34.255617 19.1779758,34.2665345 19.2754441,34.2771502 C22.6891275,34.6489512 27.0485594,34.2348566 31.513244,33.2285542 C31.7789418,32.8671684 32.075337,32.5211298 32.4024112,32.1940556 C34.8567584,29.7397084 38.3789778,29.0128681 41.4406288,30.0213822 C41.5958829,29.9543375 41.7503946,29.8866669 41.9041198,29.8183808 L42.1110981,30.2733467 C43.1114373,30.6972371 44.0473796,31.3160521 44.8614145,32.1300869 C48.2842088,35.5528813 48.2555691,41.130967 44.7974459,44.5890903 C41.4339531,47.952583 36.0649346,48.0717177 32.6241879,44.9262969 C27.8170558,45.8919233 23.0726921,46.2881596 18.9270186,45.959338 Z\"></path>\n\t <path d=\"M45.4903462,38.8768094 C36.7300141,42.6833154 26.099618,44.7997354 18.1909048,43.9383587 C7.2512621,42.7468685 1.50150083,35.8404432 4.66865776,24.7010202 C7.51507386,14.6896965 15.4908218,6.92103848 24.3842626,4.38423012 C34.1310219,1.60401701 42.4070208,6.15882777 42.4070209,16.3101169 L34.5379395,16.310117 C34.5379394,11.9285862 31.728784,10.3825286 26.5666962,11.8549876 C20.2597508,13.6540114 14.3453742,19.4148216 12.2444303,26.8041943 C10.4963869,32.9523565 12.6250796,35.5092726 19.0530263,36.2093718 C25.5557042,36.9176104 35.0513021,34.9907189 42.7038419,31.5913902 L42.7421786,31.6756595 C44.3874154,31.5384763 47.8846101,37.3706354 45.9274416,38.6772897 L45.9302799,38.6835285 C45.9166992,38.6895612 45.9031139,38.6955897 45.8895238,38.7016142 C45.8389288,38.7327898 45.7849056,38.7611034 45.7273406,38.7863919 C45.6506459,38.8200841 45.571574,38.8501593 45.4903462,38.8768094 Z\"></path>\n </g>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n </g>\n </g>\n</svg>\n"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-journal-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M102.545455,112.818182 L102.545455,124.636364 L102.545455,124.636364 L102.545455,124.636364 C102.545455,125.941761 103.630828,127 104.969697,127 L111.030303,127 C112.369172,127 113.454545,125.941761 113.454545,124.636364 L113.454545,112.818182 L125.575758,112.818182 C126.914626,112.818182 128,111.759982 128,110.454545 L128,104.545455 C128,103.240018 126.914626,102.181818 125.575758,102.181818 L113.454545,102.181818 L113.454545,90.3636364 C113.454545,89.0582 112.369172,88 111.030303,88 L104.969697,88 L104.969697,88 C103.630828,88 102.545455,89.0582 102.545455,90.3636364 L102.545455,102.181818 L90.4242424,102.181818 L90.4242424,102.181818 C89.0853705,102.181818 88,103.240018 88,104.545455 L88,110.454545 L88,110.454545 L88,110.454545 C88,111.759982 89.0853705,112.818182 90.4242424,112.818182 L102.545455,112.818182 Z\"></path>\n <g transform=\"translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)\">\n <g transform=\"translate(0.000000, 0.000000)\">\n <path d=\"M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z\"></path>\n <text font-family=\"Helvetica\" font-size=\"47.1724138\" font-weight=\"bold\" fill=\"#FFFFFF\">\n <tspan x=\"42\" y=\"77.4847912\" text-anchor=\"middle\"><<now \"DD\">></tspan>\n </text>\n </g>\n </g>\n </g>\n</svg>\n"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-options-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M110.48779,76.0002544 C109.354214,80.4045063 107.611262,84.5641217 105.354171,88.3838625 L105.354171,88.3838625 L112.07833,95.1080219 C115.20107,98.2307613 115.210098,103.299824 112.089164,106.420759 L106.420504,112.089418 C103.301049,115.208874 98.2346851,115.205502 95.1077675,112.078585 L88.3836082,105.354425 C84.5638673,107.611516 80.4042519,109.354468 76,110.488045 L76,110.488045 L76,119.993281 C76,124.409501 72.4220153,128.000254 68.0083475,128.000254 L59.9916525,128.000254 C55.5800761,128.000254 52,124.41541 52,119.993281 L52,110.488045 C47.5957481,109.354468 43.4361327,107.611516 39.6163918,105.354425 L32.8922325,112.078585 C29.7694931,115.201324 24.7004301,115.210353 21.5794957,112.089418 L15.9108363,106.420759 C12.7913807,103.301303 12.7947522,98.2349395 15.9216697,95.1080219 L22.6458291,88.3838625 C20.3887383,84.5641217 18.6457859,80.4045063 17.5122098,76.0002544 L8.00697327,76.0002544 C3.59075293,76.0002544 2.19088375e-16,72.4222697 4.89347582e-16,68.0086019 L9.80228577e-16,59.9919069 C1.25035972e-15,55.5803305 3.58484404,52.0002544 8.00697327,52.0002544 L17.5122098,52.0002544 C18.6457859,47.5960025 20.3887383,43.4363871 22.6458291,39.6166462 L15.9216697,32.8924868 C12.7989304,29.7697475 12.7899019,24.7006845 15.9108363,21.5797501 L21.5794957,15.9110907 C24.6989513,12.7916351 29.7653149,12.7950065 32.8922325,15.9219241 L39.6163918,22.6460835 C43.4361327,20.3889927 47.5957481,18.6460403 52,17.5124642 L52,8.00722764 C52,3.5910073 55.5779847,0.000254375069 59.9916525,0.000254375069 L68.0083475,0.000254375069 C72.4199239,0.000254375069 76,3.58509841 76,8.00722764 L76,17.5124642 C80.4042519,18.6460403 84.5638673,20.3889927 88.3836082,22.6460835 L95.1077675,15.9219241 C98.2305069,12.7991848 103.29957,12.7901562 106.420504,15.9110907 L112.089164,21.5797501 C115.208619,24.6992057 115.205248,29.7655693 112.07833,32.8924868 L105.354171,39.6166462 L105.354171,39.6166462 C107.611262,43.4363871 109.354214,47.5960025 110.48779,52.0002544 L119.993027,52.0002544 C124.409247,52.0002544 128,55.5782391 128,59.9919069 L128,68.0086019 C128,72.4201783 124.415156,76.0002544 119.993027,76.0002544 L110.48779,76.0002544 L110.48779,76.0002544 Z M64,96.0002544 C81.673112,96.0002544 96,81.6733664 96,64.0002544 C96,46.3271424 81.673112,32.0002544 64,32.0002544 C46.326888,32.0002544 32,46.3271424 32,64.0002544 C32,81.6733664 46.326888,96.0002544 64,96.0002544 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permalink-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.4834582,48 L73.0956761,80 L73.0956761,80 L47.5165418,80 L54.9043239,48 L80.4834582,48 Z M84.1773493,32 L89.8007299,7.64246248 C90.7941633,3.33942958 95.0918297,0.64641956 99.3968675,1.64031585 C103.693145,2.63218977 106.385414,6.93288901 105.390651,11.2416793 L100.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L96.9043239,48 L89.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L85.8226507,96 L80.1992701,120.357538 C79.2058367,124.66057 74.9081703,127.35358 70.6031325,126.359684 C66.3068546,125.36781 63.6145865,121.067111 64.6093491,116.758321 L69.401785,96 L43.8226507,96 L38.1992701,120.357538 C37.2058367,124.66057 32.9081703,127.35358 28.6031325,126.359684 C24.3068546,125.36781 21.6145865,121.067111 22.6093491,116.758321 L27.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L31.0956761,80 L38.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L42.1773493,32 L47.8007299,7.64246248 C48.7941633,3.33942958 53.0918297,0.64641956 57.3968675,1.64031585 C61.6931454,2.63218977 64.3854135,6.93288901 63.3906509,11.2416793 L58.598215,32 L84.1773493,32 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permaview-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M81.4834582,48 L79.6365127,56 L79.6365127,56 L74.0573784,56 L75.9043239,48 L81.4834582,48 Z M85.1773493,32 L90.8007299,7.64246248 C91.7941633,3.33942958 96.0918297,0.64641956 100.396867,1.64031585 C104.693145,2.63218977 107.385414,6.93288901 106.390651,11.2416793 L101.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L97.9043239,48 L96.0573784,56 L104.000754,56 C108.411895,56 112,59.581722 112,64 C112,68.4092877 108.418616,72 104.000754,72 L92.3634873,72 L90.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L86.8226507,96 L81.1992701,120.357538 C80.2058367,124.66057 75.9081703,127.35358 71.6031325,126.359684 C67.3068546,125.36781 64.6145865,121.067111 65.6093491,116.758321 L70.401785,96 L64.8226507,96 L59.1992701,120.357538 C58.2058367,124.66057 53.9081703,127.35358 49.6031325,126.359684 C45.3068546,125.36781 42.6145865,121.067111 43.6093491,116.758321 L48.401785,96 L42.8226507,96 L37.1992701,120.357538 C36.2058367,124.66057 31.9081703,127.35358 27.6031325,126.359684 C23.3068546,125.36781 20.6145865,121.067111 21.6093491,116.758321 L26.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L30.0956761,80 L31.9426216,72 L23.9992458,72 C19.5881049,72 16,68.418278 16,64 C16,59.5907123 19.5813843,56 23.9992458,56 L35.6365127,56 L37.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L41.1773493,32 L46.8007299,7.64246248 C47.7941633,3.33942958 52.0918297,0.64641956 56.3968675,1.64031585 C60.6931454,2.63218977 63.3854135,6.93288901 62.3906509,11.2416793 L57.598215,32 L63.1773493,32 L68.8007299,7.64246248 C69.7941633,3.33942958 74.0918297,0.64641956 78.3968675,1.64031585 C82.6931454,2.63218977 85.3854135,6.93288901 84.3906509,11.2416793 L79.598215,32 L85.1773493,32 Z M53.9043239,48 L52.0573784,56 L57.6365127,56 L59.4834582,48 L53.9043239,48 Z M75.9426216,72 L74.0956761,80 L74.0956761,80 L68.5165418,80 L70.3634873,72 L75.9426216,72 L75.9426216,72 Z M48.3634873,72 L46.5165418,80 L52.0956761,80 L53.9426216,72 L48.3634873,72 L48.3634873,72 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M61.2072232,68.1369825 C56.8829239,70.9319564 54.2082892,74.793177 54.2082892,79.0581634 C54.2082892,86.9638335 63.3980995,93.4821994 75.2498076,94.3940006 C77.412197,98.2964184 83.8475284,101.178858 91.5684735,101.403106 C86.4420125,100.27851 82.4506393,97.6624107 80.9477167,94.3948272 C92.8046245,93.4861461 102,86.9662269 102,79.0581634 C102,70.5281905 91.3014611,63.6132813 78.1041446,63.6132813 C71.5054863,63.6132813 65.5315225,65.3420086 61.2072232,68.1369825 Z M74.001066,53.9793443 C69.6767667,56.7743182 63.7028029,58.5030456 57.1041446,58.5030456 C54.4851745,58.5030456 51.9646095,58.2307276 49.6065315,57.7275105 C46.2945155,59.9778212 41.2235699,61.4171743 35.5395922,61.4171743 C35.4545771,61.4171743 35.3696991,61.4168523 35.2849622,61.4162104 C39.404008,60.5235193 42.7961717,58.6691298 44.7630507,56.286533 C37.8379411,53.5817651 33.2082892,48.669413 33.2082892,43.0581634 C33.2082892,34.5281905 43.9068281,27.6132812 57.1041446,27.6132812 C70.3014611,27.6132812 81,34.5281905 81,43.0581634 C81,47.3231498 78.3253653,51.1843704 74.001066,53.9793443 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M27.6619958,98.5383065 C27.5690581,98.5388896 27.4761291,98.539182 27.383212,98.539182 C41.5122315,92.2342259 36.7359182,71.4340774 52.2062903,71.4340772 C52.3396942,72.0325374 52.4778143,72.6764878 52.6543744,73.3309353 C41.7206358,71.5725612 42.70852,93.6013809 27.6619958,98.5383065 Z M27.962646,98.5354078 C44.3675979,98.3221342 60.9448114,89.104528 60.944811,79.6231217 C57.0326028,79.6231217 55.0057081,78.1546059 53.8483468,76.2715831 C46.8437297,73.3160546 41.0335584,95.5643154 27.9626323,98.5354081 Z M60.4476718,66.8723739 C57.4632888,63.6421817 54.9582687,60.7541572 53.4305549,58.7453802 C47.3662923,50.7715364 44.307483,54.9700909 40.8462757,58.7453801 C37.3850684,62.5206692 41.7580858,65.5796149 38.4732643,68.2464352 C35.1884428,70.9132556 35.391237,71.8376623 29.8473278,66.9588778 C24.3034186,62.0800933 23.919977,60.7368279 26.4649349,57.9530299 C29.0098928,55.1692318 31.1369568,59.5524845 36.3357237,54.6053302 C41.5344905,49.6581758 37.1673192,45.2736183 37.1673192,45.2736183 C37.1673192,45.2736183 47.9916921,23.1463023 62.4556497,24.7805686 C76.9196074,26.4148348 56.9839048,22.6644011 52.0250205,40.0179431 C49.9018746,47.4478606 52.4201529,45.6971267 56.4460414,48.8353078 C57.8695188,49.9449088 63.120208,53.6842856 69.3136884,58.3372485 C77.8095419,50.1273311 87.3705002,40.8200581 90.1462007,38.0443577 C94.9225135,33.268045 99.6988262,38.0443577 94.9225134,42.8206705 C92.2168565,45.5263274 83.0052228,54.3768782 74.6585455,62.4104777 C84.7196352,70.2010353 95.1107413,79.0341049 95.1107416,82.5307694 C95.1107421,88.9149413 92.3944614,92.7263341 86.6764506,90.6368273 C83.0906414,89.3264812 73.3126471,80.2536547 65.0234105,71.7029822 C62.8994697,73.7599251 61.2357389,75.3821997 60.3189624,76.2989761 C57.6045976,78.4574835 53.6647127,73.2589589 55.5426497,71.5226634 C56.5140946,70.6244887 58.249291,68.9770292 60.4476718,66.8723739 L60.4476718,66.8723739 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-refresh-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M106.369002,39.4325143 C116.529932,60.3119371 112.939592,86.1974934 95.5979797,103.539105 C73.7286194,125.408466 38.2713806,125.408466 16.4020203,103.539105 C-5.46734008,81.6697449 -5.46734008,46.2125061 16.4020203,24.3431458 C19.5262146,21.2189514 24.5915344,21.2189514 27.7157288,24.3431458 C30.8399231,27.4673401 30.8399231,32.5326599 27.7157288,35.6568542 C12.0947571,51.2778259 12.0947571,76.6044251 27.7157288,92.2253967 C43.3367004,107.846368 68.6632996,107.846368 84.2842712,92.2253967 C97.71993,78.7897379 99.5995262,58.1740623 89.9230597,42.729491 L83.4844861,54.9932839 C81.4307001,58.9052072 76.5945372,60.4115251 72.682614,58.3577391 C68.7706907,56.3039532 67.2643728,51.4677903 69.3181587,47.555867 L84.4354914,18.7613158 C86.4966389,14.8353707 91.3577499,13.3347805 95.273202,15.415792 L124.145886,30.7612457 C128.047354,32.8348248 129.52915,37.6785572 127.455571,41.5800249 C125.381992,45.4814927 120.53826,46.9632892 116.636792,44.8897102 L106.369002,39.4325143 Z M98.1470904,27.0648707 C97.9798954,26.8741582 97.811187,26.6843098 97.6409651,26.4953413 L98.6018187,26.1987327 L98.1470904,27.0648707 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-right-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M80.3563798,109.353315 C78.9238993,110.786918 76.9450203,111.675144 74.7592239,111.675144 L-4.40893546,111.675144 C-8.77412698,111.675144 -12.3248558,108.130732 -12.3248558,103.758478 C-12.3248558,99.3951199 -8.78077754,95.8418109 -4.40893546,95.8418109 L66.8418109,95.8418109 L66.8418109,24.5910645 C66.8418109,20.225873 70.3862233,16.6751442 74.7584775,16.6751442 C79.1218352,16.6751442 82.6751442,20.2192225 82.6751442,24.5910645 L82.6751442,103.759224 C82.6751442,105.941695 81.7891419,107.920575 80.3566508,109.353886 Z\" transform=\"translate(35.175144, 64.175144) rotate(-45.000000) translate(-35.175144, -64.175144) \"></path>\n</svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-star-filled tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"nonzero\">\n <path d=\"M61.8361286,96.8228569 L99.1627704,124.110219 C101.883827,126.099427 105.541968,123.420868 104.505636,120.198072 L90.2895569,75.9887263 L89.0292911,79.8977279 L126.314504,52.5528988 C129.032541,50.5595011 127.635256,46.2255025 124.273711,46.2229134 L78.1610486,46.1873965 L81.4604673,48.6032923 L67.1773543,4.41589688 C66.1361365,1.19470104 61.6144265,1.19470104 60.5732087,4.41589688 L46.2900957,48.6032923 L49.5895144,46.1873965 L3.47685231,46.2229134 C0.115307373,46.2255025 -1.28197785,50.5595011 1.43605908,52.5528988 L38.7212719,79.8977279 L37.4610061,75.9887263 L23.2449266,120.198072 C22.2085954,123.420868 25.8667356,126.099427 28.5877926,124.110219 L65.9144344,96.8228569 L61.8361286,96.8228569 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-classic tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-pop tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M16.0098166,56 C11.586117,56 8,59.5776607 8,63.9924054 L8,80.0075946 C8,84.4216782 11.5838751,88 16.0098166,88 L111.990183,88 C116.413883,88 120,84.4223393 120,80.0075946 L120,63.9924054 C120,59.5783218 116.416125,56 111.990183,56 L16.0098166,56 L16.0098166,56 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-zoomin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.578055 16,24.0085154 L16,71.9914846 C16,76.4144655 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.421945 112,71.9914846 L112,24.0085154 C112,19.5855345 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-tag-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M18.1643182,47.6600756 L18.1677196,51.7651887 C18.1708869,55.5878829 20.3581578,60.8623899 23.0531352,63.5573673 L84.9021823,125.406414 C87.5996731,128.103905 91.971139,128.096834 94.6717387,125.396234 L125.766905,94.3010679 C128.473612,91.5943612 128.472063,87.2264889 125.777085,84.5315115 L63.9280381,22.6824644 C61.2305472,19.9849735 55.9517395,17.801995 52.1318769,17.8010313 L25.0560441,17.7942007 C21.2311475,17.7932358 18.1421354,20.8872832 18.1452985,24.7049463 L18.1535504,34.6641936 C18.2481119,34.6754562 18.3439134,34.6864294 18.4409623,34.6971263 C22.1702157,35.1081705 26.9295004,34.6530132 31.806204,33.5444844 C32.1342781,33.0700515 32.5094815,32.6184036 32.9318197,32.1960654 C35.6385117,29.4893734 39.5490441,28.718649 42.94592,29.8824694 C43.0432142,29.8394357 43.1402334,29.7961748 43.2369683,29.7526887 L43.3646982,30.0368244 C44.566601,30.5115916 45.6933052,31.2351533 46.6655958,32.2074439 C50.4612154,36.0030635 50.4663097,42.1518845 46.6769742,45.94122 C43.0594074,49.5587868 37.2914155,49.7181264 33.4734256,46.422636 C28.1082519,47.5454734 22.7987486,48.0186448 18.1643182,47.6600756 Z\"></path>\n <path d=\"M47.6333528,39.5324628 L47.6562932,39.5834939 C37.9670934,43.9391617 26.0718874,46.3819521 17.260095,45.4107025 C5.27267473,44.0894301 -1.02778744,36.4307276 2.44271359,24.0779512 C5.56175386,12.9761516 14.3014034,4.36129832 24.0466405,1.54817001 C34.7269254,-1.53487574 43.7955833,3.51606438 43.7955834,14.7730751 L35.1728168,14.7730752 C35.1728167,9.91428944 32.0946059,8.19982862 26.4381034,9.83267419 C19.5270911,11.8276553 13.046247,18.2159574 10.7440788,26.4102121 C8.82861123,33.2280582 11.161186,36.0634845 18.2047888,36.8398415 C25.3302805,37.6252244 35.7353482,35.4884477 44.1208333,31.7188498 L44.1475077,31.7781871 C44.159701,31.7725635 44.1718402,31.7671479 44.1839238,31.7619434 C45.9448098,31.0035157 50.4503245,38.3109156 47.7081571,39.5012767 C47.6834429,39.512005 47.6585061,39.5223987 47.6333528,39.5324628 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-theme-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 129\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(6.762422, 19.968999)\">\n <path d=\"M0.824945506,108.186742 C0.664785639,108.187747 0.504640965,108.188251 0.344516735,108.188251 C24.6927592,97.3230528 16.4618388,61.4785938 43.121606,61.4785936 C43.3514982,62.5099075 43.5895175,63.6196137 43.8937798,64.7474092 C25.0518979,61.7172401 26.754298,99.6790423 0.824939051,108.186742 Z M1.34304326,108.181747 C29.613352,107.814217 58.1805158,91.9297101 58.1805151,75.5906019 C51.4386888,75.5906018 47.9457839,73.0599394 45.9513275,69.8149659 C33.880418,64.7217657 23.8678719,103.061726 1.34301955,108.181748 Z\"></path>\n <path d=\"M48.871084,61.6312522 C45.6348746,64.6233738 52.4243955,73.581882 57.1020034,69.8621716 C65.3329228,61.631253 108.502656,20.4006304 116.733576,12.169711 C124.964495,3.9387916 116.733576,-4.29212771 108.502656,3.9387916 C100.271737,12.1697108 57.4180113,53.7289683 48.871084,61.6312522 Z\"></path>\n </g>\n <path d=\"M62.2824054,71.6211067 C57.93733,66.8541323 54.3123948,62.6301561 51.9937779,59.5814279 C41.5433616,45.8402704 36.2721798,53.0755512 30.307554,59.5814276 C24.3429282,66.0873041 31.8788571,71.3587209 26.2181932,75.9543964 C20.5575294,80.5500719 20.9070004,82.1430826 11.3532982,73.7355757 C1.79959591,65.3280689 1.13881905,63.0132479 5.52449152,58.2159872 C9.91016399,53.4187265 13.5756887,60.9722938 22.5346144,52.4469667 C31.4935401,43.9216395 23.9676854,36.3658236 23.9676854,36.3658236 C23.9676854,36.3658236 42.6210998,-1.76571499 67.5465342,1.05058165 C92.4719685,3.8668783 58.1171911,-2.5961653 49.5716499,27.3088291 C45.9128772,40.1126497 50.2525733,37.0956468 57.1903023,42.5036084 C59.4792141,44.2878157 67.5103988,50.0176866 77.2457031,57.2905766 C71.4143155,62.9019825 66.2337717,67.8661661 62.2824054,71.6211067 Z M73.4870997,83.4678852 C87.4278174,97.7290403 103.323635,112.360587 109.285731,114.539289 C119.139459,118.140092 123.820369,111.571999 123.820368,100.570289 C123.820367,94.7414103 107.064445,80.3074425 90.2759123,67.2185217 C83.6390655,73.6178 77.7700759,79.2918373 73.4870997,83.4678852 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-unlocked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M48.6266053,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L30.136303,64 C19.6806213,51.3490406 2.77158986,28.2115132 25.8366966,8.85759246 C50.4723026,-11.8141335 71.6711028,13.2108337 81.613302,25.0594855 C91.5555012,36.9081373 78.9368488,47.4964439 69.1559674,34.9513593 C59.375086,22.4062748 47.9893192,10.8049522 35.9485154,20.9083862 C23.9077117,31.0118202 34.192312,43.2685325 44.7624679,55.8655518 C47.229397,58.805523 48.403443,61.5979188 48.6266053,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-video tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,12 C29.0909091,12 8.72727273,14.9166667 5.81818182,17.8333333 C2.90909091,20.75 1.93784382e-15,41.1666667 0,64.5 C1.93784382e-15,87.8333333 2.90909091,108.25 5.81818182,111.166667 C8.72727273,114.083333 29.0909091,117 64,117 C98.9090909,117 119.272727,114.083333 122.181818,111.166667 C125.090909,108.25 128,87.8333333 128,64.5 C128,41.1666667 125.090909,20.75 122.181818,17.8333333 C119.272727,14.9166667 98.9090909,12 64,12 Z M54.9161194,44.6182253 C51.102648,42.0759111 48.0112186,43.7391738 48.0112186,48.3159447 L48.0112186,79.6840553 C48.0112186,84.2685636 51.109784,85.9193316 54.9161194,83.3817747 L77.0838806,68.6032672 C80.897352,66.0609529 80.890216,61.9342897 77.0838806,59.3967328 L54.9161194,44.6182253 Z\"></path>\n </g>\n</svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import files"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Store changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration:"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers:"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup:"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle:"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers:"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags:"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers:"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki:"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits:"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version:"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Language/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Language/Prompt",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Plugin/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Plugin/Prompt",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Theme/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Theme/Prompt",
"text": "Themes"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/Heading": {
"title": "$:/language/ControlPanel/Saving/Heading",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Automatically save changes during editing"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar "
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This is an external tiddler stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Hint": {
"title": "$:/language/EditTemplate/Body/Hint",
"text": "Use [[wiki text|http://tiddlywiki.com/static/WikiText.html]] to add formatting, images, and dynamic features"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Button/Hide": {
"title": "$:/language/EditTemplate/Body/Preview/Button/Hide",
"text": "hide preview"
},
"$:/language/EditTemplate/Body/Preview/Button/Show": {
"title": "$:/language/EditTemplate/Body/Preview/Button/Show",
"text": "show preview"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes will override the default version"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "River of tiddlers as static HTML file"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON tiddlers file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV tiddlers file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "Single tiddler \".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against": {
"title": "$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against",
"text": "A temporary storage field used in [[$:/core/templates/static.content]]"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "If set to \"yes\" indicates that a tiddler should be saved as a JavaScript library"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is important to make sure that you can reliably save changes. See http://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from 2.x.x TiddlyWiki files (`.html`), `.tiddler`, `.tid`, `.json` or other files \n\n```\n--load <filepath>\n```\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "Render an individual tiddler as a specified ContentType, defaults to `text/html` and save it to the specified filename:\n\n```\n--rendertiddler <title> <filename> [<type>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "Render a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the \"noclean\" parameter is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "Saves an individual tiddler in its raw text or binary format to the specified filename. \n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "Saves a group of tiddlers in their raw text or binary format to the specified directory. \n\n```\n--savetiddlers <filter> <pathname>\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "The server built in to TiddlyWiki5 is very simple. Although compatible with TiddlyWeb it doesn't support many of the features needed for robust Internet-facing usage.\n\nAt the root, it serves a rendering of a specified tiddler. Away from the root, it serves individual tiddlers encoded in JSON, and supports the basic HTTP operations for `GET`, `PUT` and `DELETE`.\n\n```\n--server <port> <roottiddler> <rendertype> <servetype> <username> <password> <host> <pathprefix>\n```\n\nThe parameters are:\n\n* ''port'' - port number to serve from (defaults to \"8080\")\n* ''roottiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\") \n* ''rendertype'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''servetype'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''pathprefix'' - optional prefix for paths\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation isn't suitable for general use.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password:\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port.\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''type'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging \n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin "
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See http://tiddlywiki.com/static/Upgrading.html for more details. "
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or click escape to cancel)"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" - click {{$:/core/images/edit-button}} to create"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"type": "text/vnd.tiddlywiki",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "http://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"type": "text/vnd.tiddlywiki",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "http://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"text": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|http://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"title": "$:/core/modules/commander.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/build.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/clearpassword.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/editions.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/help.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/init.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar ext = path.extname(self.params[0]);\n\tfs.readFile(this.params[0],$tw.utils.getTypeEncoding(ext),function(err,data) {\n\t\tif (err) {\n\t\t\tself.callback(err);\n\t\t} else {\n\t\t\tvar fields = {title: self.params[0]},\n\t\t\t\ttype = path.extname(self.params[0]);\n\t\t\tvar tiddlers = self.commander.wiki.deserializeTiddlers(type,data,fields);\n\t\t\tif(!tiddlers) {\n\t\t\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t\t\t} else {\n\t\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddlers[t]));\n\t\t\t\t}\n\t\t\t\tself.callback(null);\t\n\t\t\t}\n\t\t}\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/load.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.pluginsPath));\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.themesPath));\n\tcollectPlugins(path.resolve($tw.boot.corePath,$tw.config.languagesPath));\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers},null,$tw.config.preferences.jsonSpaces)\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/makelibrary.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/output.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/password.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\";\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/rendertiddler.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[2]),\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\") != \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory){\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent;\n\t\tfs.writeFileSync(path.resolve(pathname,encodeURIComponent(title) + extension),text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/rendertiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title),\n\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savetiddler.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.deleteDirectory(pathname);\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savetiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif(!$tw.browser) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\thttp = require(\"http\");\n}\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\n/*\nA simple HTTP server with regexp-based routes\n*/\nfunction SimpleServer(options) {\n\tthis.routes = options.routes || [];\n\tthis.wiki = options.wiki;\n\tthis.variables = options.variables || {};\n}\n\nSimpleServer.prototype.set = function(obj) {\n\tvar self = this;\n\t$tw.utils.each(obj,function(value,name) {\n\t\tself.variables[name] = value;\n\t});\n};\n\nSimpleServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nSimpleServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nSimpleServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"pathprefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length);\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nSimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) {\n\tvar header = request.headers.authorization || \"\",\n\t\ttoken = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tusername = parts[0],\n\t\tpassword = parts[1];\n\tif(incomingUsername === username && incomingPassword === password) {\n\t\treturn \"ALLOWED\";\n\t} else {\n\t\treturn \"DENIED\";\n\t}\n};\n\nSimpleServer.prototype.listen = function(port,host) {\n\tvar self = this;\n\thttp.createServer(function(request,response) {\n\t\t// Compose the state object\n\t\tvar state = {};\n\t\tstate.wiki = self.wiki;\n\t\tstate.server = self;\n\t\tstate.urlInfo = url.parse(request.url);\n\t\t// Find the route that matches this path\n\t\tvar route = self.findMatchingRoute(request,state);\n\t\t// Check for the username and password if we've got one\n\t\tvar username = self.get(\"username\"),\n\t\t\tpassword = self.get(\"password\");\n\t\tif(username && password) {\n\t\t\t// Check they match\n\t\t\tif(self.checkCredentials(request,username,password) !== \"ALLOWED\") {\n\t\t\t\tvar servername = state.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\";\n\t\t\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + servername + '\"'\n\t\t\t\t});\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// Return a 404 if we didn't find a route\n\t\tif(!route) {\n\t\t\tresponse.writeHead(404);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t\t// Set the encoding for the incoming request\n\t\t// TODO: Presumably this would need tweaking if we supported PUTting binary tiddlers\n\t\trequest.setEncoding(\"utf8\");\n\t\t// Dispatch the appropriate method\n\t\tswitch(request.method) {\n\t\t\tcase \"GET\": // Intentional fall-through\n\t\t\tcase \"DELETE\":\n\t\t\t\troute.handler(request,response,state);\n\t\t\t\tbreak;\n\t\t\tcase \"PUT\":\n\t\t\t\tvar data = \"\";\n\t\t\t\trequest.on(\"data\",function(chunk) {\n\t\t\t\t\tdata += chunk.toString();\n\t\t\t\t});\n\t\t\t\trequest.on(\"end\",function() {\n\t\t\t\t\tstate.data = data;\n\t\t\t\t\troute.handler(request,response,state);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}).listen(port,host);\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n\t// Set up server\n\tthis.server = new SimpleServer({\n\t\twiki: this.commander.wiki\n\t});\n\t// Add route handlers\n\tthis.server.addRoute({\n\t\tmethod: \"PUT\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\tfields = JSON.parse(state.data);\n\t\t\t// Pull up any subfields in the `fields` object\n\t\t\tif(fields.fields) {\n\t\t\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\t\t\tfields[name] = field;\n\t\t\t\t});\n\t\t\t\tdelete fields.fields;\n\t\t\t}\n\t\t\t// Remove any revision field\n\t\t\tif(fields.revision) {\n\t\t\t\tdelete fields.revision;\n\t\t\t}\n\t\t\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title}));\n\t\t\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\t\t\tresponse.writeHead(204, \"OK\",{\n\t\t\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"DELETE\",\n\t\tpath: /^\\/bags\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]);\n\t\t\tstate.wiki.deleteTiddler(title);\n\t\t\tresponse.writeHead(204, \"OK\", {\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": state.server.get(\"serveType\")});\n\t\t\tvar text = state.wiki.renderTiddler(state.server.get(\"renderType\"),state.server.get(\"rootTiddler\"));\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/status$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar text = JSON.stringify({\n\t\t\t\tusername: state.server.get(\"username\"),\n\t\t\t\tspace: {\n\t\t\t\t\trecipe: \"default\"\n\t\t\t\t},\n\t\t\t\ttiddlywiki_version: $tw.version\n\t\t\t});\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/favicon.ico$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\t\t\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\t\t\tresponse.end(buffer,\"base64\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers.json$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar tiddlers = [];\n\t\t\tstate.wiki.forEachTiddler({sortField: \"title\"},function(title,tiddler) {\n\t\t\t\tvar tiddlerFields = {};\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tif(name !== \"text\") {\n\t\t\t\t\t\ttiddlerFields[name] = tiddler.getFieldString(name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\ttiddlers.push(tiddlerFields);\n\t\t\t});\n\t\t\tvar text = JSON.stringify(tiddlers);\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\ttiddler = state.wiki.getTiddler(title),\n\t\t\t\ttiddlerFields = {},\n\t\t\t\tknownFields = [\n\t\t\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t\t\t];\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\t\t\ttiddlerFields[name] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t\t\t} else {\n\t\t\t\tresponse.writeHead(404);\n\t\t\t\tresponse.end();\n\t\t\t}\n\t\t}\n\t});\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\tvar port = this.params[0] || \"8080\",\n\t\trootTiddler = this.params[1] || \"$:/core/save/all\",\n\t\trenderType = this.params[2] || \"text/plain\",\n\t\tserveType = this.params[3] || \"text/html\",\n\t\tusername = this.params[4],\n\t\tpassword = this.params[5],\n\t\thost = this.params[6] || \"127.0.0.1\",\n\t\tpathprefix = this.params[7];\n\tthis.server.set({\n\t\trootTiddler: rootTiddler,\n\t\trenderType: renderType,\n\t\tserveType: serveType,\n\t\tusername: username,\n\t\tpassword: password,\n\t\tpathprefix: pathprefix\n\t});\n\tthis.server.listen(port,host);\n\tconsole.log(\"Serving on \" + host + \":\" + port);\n\tconsole.log(\"(press ctrl-C to exit)\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/server.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/setfield.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerData(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/unpackplugin.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/verbose.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/version.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"title": "$:/core/modules/config.js",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming = JSON.parse(text),\n\t\tresults = [];\n\tif($tw.utils.isArray(incoming)) {\n\t\tfor(var t=0; t<incoming.length; t++) {\n\t\t\tvar incomingFields = incoming[t],\n\t\t\t\tfields = {};\n\t\t\tfor(var f in incomingFields) {\n\t\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t\t}\n\t\t\t}\n\t\t\tresults.push(fields);\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"title": "$:/core/modules/deserializers.js",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/filters/addprefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/addprefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/addsuffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/after.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/current.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/missing.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/orphans.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/shadows.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/tiddlers.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/all.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/backlinks.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/before.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/commands.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = {};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value;\n\t\t\tif((operator.operand === \"\") || (operator.operand === \"title\")) {\n\t\t\t\tvalue = title;\n\t\t\t} else {\n\t\t\t\tvalue = tiddler.getFieldString(operator.operand);\n\t\t\t}\n\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\tvalues[value] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/each.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [];\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[operator.operand]) {\n\t\t\tvar value = toDate(tiddler.fields[operator.operand]);\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/eachday.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/editiondescription.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/editions.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/field.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/fields.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/get.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand) || tiddler.fields[operator.operand] === \"\"))) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && tiddler.fields[operator.operand] !== \"\") {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/has.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerData(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/indexes.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/current.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/current.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/image.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/missing.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/orphan.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/shadow.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/system.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/tag.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/tiddler.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tvar isFilterOperator = isFilterOperators[operator.operand];\n\tif(isFilterOperator) {\n\t\treturn isFilterOperator(source,operator.prefix,options);\n\t} else {\n\t\treturn [\"Filter Error: Unknown operand for the 'is' filter operator\"];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/is.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/limit.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/links.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/list.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/listed.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"title": "$:/core/modules/filters/listops.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/modules.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/moduletypes.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/next.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/plugintiddlers.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/prefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/previous.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\tregexp = new RegExp(regexpString,flags);\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/regexp.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/removeprefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/removesuffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tvar isSameDay = function(dateField) {\n\t\t\treturn (new Date(dateField)).setHours(0,0,0,0) === targetDate;\n\t\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tif(isSameDay(tiddler.fields[fieldName])) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/sameday.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffix) {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: operator.suffix\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/search.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/shadowsource.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/sort.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/splitbefore.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/storyviews.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/suffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && !tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tag.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tagging.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\t$tw.utils.pushTop(results,tiddler.fields.tags);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tags.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/title.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/untagged.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation within a filter string\n\tresults: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar operator, operand, bracketPos, curlyBracketPos;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tvar nextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\t\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-)?)(?:(\\[)|(\"(?:[^\"])*\")|('(?:[^'])*')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow \"Syntax error in filter expression\";\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [\"Filter error: \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter\",function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"title": "$:/core/modules/filters.js",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/info/platform.js": {
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"title": "$:/core/modules/info/platform.js",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/language.js": {
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a single translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\nexports.Language = Language;\n\n})();\n",
"title": "$:/core/modules/language.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"title": "$:/core/modules/macros/changecount.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB),\n\t\tbrightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"title": "$:/core/modules/macros/contrastcolour.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"title": "$:/core/modules/macros/csvtiddlers.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/dumpvariables.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/dumpvariables.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to dump all active variable values\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"dumpvariables\";\n\nexports.params = [\n];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\tvar output = [\"|!Variable |!Value |\"],\n\t\tvariables = [], variable;\n\tfor(variable in this.variables) {\n\t\tvariables.push(variable);\n\t}\n\tvariables.sort();\n\tfor(var index=0; index<variables.length; index++) {\n\t\tvar variable = variables[index];\n\t\toutput.push(\"|\" + variable + \" |<input size=50 value=<<\" + variable + \">>/> |\")\n\t}\n\treturn output.join(\"\\n\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/dumpvariables.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter) {\n\tvar tiddlers = this.wiki.filterTiddlers(filter),\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"title": "$:/core/modules/macros/jsontiddlers.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert the content of a tiddler to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tparts.push(\"data:\");\n\tparts.push(type);\n\tparts.push(isBase64 ? \";base64\" : \"\");\n\tparts.push(\",\");\n\tparts.push(isBase64 ? text : encodeURIComponent(text));\n\treturn parts.join(\"\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/makedatauri.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/now.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"title": "$:/core/modules/macros/qualify.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"title": "$:/core/modules/macros/version.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/audioparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/csvparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/htmlparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.tag = \"embed\";\n\t\t}\n\t} else if(text) {\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t\t\telement.tag = \"embed\";\n\t\t} else if(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"application/pdf\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/imageparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar node = {\n\t\ttype: \"whitespace\",\n\t\tstart: pos\n\t};\n\tvar re = /(\\s)+/g;\n\tre.lastIndex = pos;\n\tvar match = re.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t}\n\treturn null;\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar whitespace = $tw.utils.parseWhiteSpace(source,pos);\n\tif(whitespace) {\n\t\treturn whitespace.end;\n\t}\n\treturn pos;\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for an indirect value\n\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\tif(indirectValue) {\n\t\t\t\tpos = indirectValue.end;\n\t\t\t\tnode.type = \"indirect\";\n\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for a unquoted value\n\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\tif(unquotedValue) {\n\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/utils/parseutils.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/textparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/textparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: http://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[http://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [http://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [http://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|http://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"p\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /(\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"macrodef\",\n\t\tname: this.match[1],\n\t\tparams: params,\n\t\ttext: text\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[http://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|http://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?\\$:[^\\s<|]+(?:[^\\s<|])/mg;\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\tthis.tree.push.apply(this.tree,this.parseInlineRun());\n\t} else {\n\t\tthis.tree.push.apply(this.tree,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar tree = [];\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t}\n\treturn tree;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,nextMatch.matchIndex)});\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,terminatorMatch.index)});\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,inlineRuleMatch.matchIndex)});\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"title": "$:/core/modules/pluginswitcher.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tthis.numChanges = 0;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(callback) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\tcallback(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\twindow.onbeforeunload = function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t};\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\",\n\t\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert(\"Error while saving:\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"title": "$:/core/modules/saver-handler.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t// Strip the file://\n\tif(pathname.indexOf(\"file://\") === 0) {\n\t\tpathname = pathname.substr(7);\n\t}\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Save the file\n\twindow.twi.saveFile(pathname,text);\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/andtidwiki.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\tfilename = document.location.pathname.substr(p+1);\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tlink.setAttribute(\"target\",\"_blank\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/download.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/fsosaver.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/manualdownload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/msdownload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/tiddlyfox.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/tiddlyie.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback(\"Error saving to TWEdit: \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"title": "$:/core/modules/savers/twedit.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; ;charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback(\"Error:\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/upload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/startup/commands.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"title": "$:/core/modules/startup/commands.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"title": "$:/core/modules/startup/favicon.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin\n\tvar fields = {\n\t\ttitle: \"$:/temp/info-plugin\",\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo();\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"title": "$:/core/modules/startup/info.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"title": "$:/core/modules/startup/load-modules.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: \"Set password\",\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"title": "$:/core/modules/startup/password.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n\t})();\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only drafts have changed\n\t\tvar onlyDraftsHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !tiddler.hasField(\"draft.of\")) {\n\t\t\t\tonlyDraftsHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyDraftsHaveChanged) {\n\t\t\ttimerId = setTimeout(refresh,DRAFT_TIDDLER_TIMEOUT);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"title": "$:/core/modules/startup/render.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param);\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tif(document[fullscreen._fullscreenElement]) {\n\t\t\t\tdocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tdocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/startup/rootwidget.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION = false;\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t}\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance(PERFORMANCE_INSTRUMENTATION);\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-US\"\n\t\t]\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget = new widget.widget({\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},{\n\t\t\twiki: $tw.wiki,\n\t\t\tdocument: document\n\t\t});\n\t}\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t} \n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({wiki: $tw.wiki, dirtyTracking: !$tw.syncadaptor});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/startup.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers();\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permalink\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permaview\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t//invoke any hooks that might change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// If a target tiddler was specified add it to the history stack\n\tif(target && target !== \"\") {\n\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t}\n\t\t$tw.wiki.addToHistory(target);\n\t} else if(storyList.length > 0) {\n\t\t$tw.wiki.addToHistory(storyList[0]);\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\tif(options.updateAddressBar !== \"no\") {\n\t\t// Get the story and the history stack\n\t\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\t\ttargetTiddler = \"\";\n\t\tif(options.targetTiddler) {\n\t\t\ttargetTiddler = options.targetTiddler;\n\t\t} else {\n\t\t\t// The target tiddler is the one at the top of the stack\n\t\t\tif(historyList.length > 0) {\n\t\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t\t}\n\t\t\t// Blank the target tiddler if it isn't present in the story\n\t\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\t\ttargetTiddler = \"\";\n\t\t\t}\n\t\t}\n\t\t// Assemble the location hash\n\t\tif(options.updateAddressBar === \"permalink\") {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t} else {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t}\n\t\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\t\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\t\tif(options.updateHistory === \"yes\") {\n\t\t\t\t// Assign the location hash so that history is updated\n\t\t\t\twindow.location.hash = $tw.locationHash;\n\t\t\t} else {\n\t\t\t\t// We use replace so that browser history isn't affected\n\t\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t\t}\n\t\t}\n\t}\n}\n\n})();\n",
"title": "$:/core/modules/startup/story.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/storyviews/classic.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar currWidth = targetElement.offsetWidth,\n\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Remove the dom nodes of the widget at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"translateX(0px)\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"title": "$:/core/modules/storyviews/classic.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"title": "$:/core/modules/storyviews/pop.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerData(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif(targetTiddler !== itemWidget.parseTreeNode.itemTitle || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();",
"title": "$:/core/modules/storyviews/zoomin.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store. If a syncadaptor is used then individual tiddlers are synchronised through it. If there is no syncadaptor then the entire wiki is saved via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.syncadaptor = options.syncadaptor;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\"));\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\t// Tasks are {type: \"load\"/\"save\"/\"delete\", title:, queueTime:, lastModificationTime:}\n\tthis.taskQueue = {}; // Hashmap of tasks yet to be performed\n\tthis.taskInProgress = {}; // Hash of tasks in progress\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.syncToServer(changes);\n\t});\n\t// Browser event handlers\n\tif($tw.browser) {\n\t\t// Set up our beforeunload handler\n\t\twindow.onbeforeunload = function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t};\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\tself.handleLazyLoadEvent(title);\n\t});\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nConstants\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.filterFn.call(this.wiki);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: tiddler.fields.revision,\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\treturn (this.numTasksInQueue() > 0) || (this.numTasksInProgress() > 0);\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(this.wiki.getTiddler(tiddlerFields.title),tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: tiddlerFields.revision,\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set the various status tiddlers\n\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\tif(isLoggedIn) {\n\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t} else {\n\t\t\t\tself.wiki.deleteTiddler(self.titleUserName);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tif(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tvar self = this;\n\t\tif(this.pollTimerId) {\n\t\t\tclearTimeout(this.pollTimerId);\n\t\t\tthis.pollTimerId = null;\n\t\t}\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Trigger the next sync\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(\"Error retrieving skinny tiddler list:\",err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null;\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Do a full load if we've already got a fat version of the tiddler\n\t\t\t\t\tif(tiddler && tiddler.fields.text !== undefined) {\n\t\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\t\tself.enqueueSyncTask({\n\t\t\t\t\t\t\ttype: \"load\",\n\t\t\t\t\t\t\ttitle: tiddlerFields.title\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Load the skinny version of the tiddler\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nSynchronise a set of changes to the server\n*/\nSyncer.prototype.syncToServer = function(changes) {\n\tvar self = this,\n\t\tnow = Date.now(),\n\t\tfilteredChanges = this.filterFn.call(this.wiki,function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t$tw.utils.each(changes,function(change,title,object) {\n\t\t// Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list\n\t\tif((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) {\n\t\t\t// Queue a task to sync this tiddler\n\t\t\tself.enqueueSyncTask({\n\t\t\t\ttype: change.deleted ? \"delete\" : \"save\",\n\t\t\t\ttitle: title\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Queue up a sync task to load this tiddler\n\tthis.enqueueSyncTask({\n\t\ttype: \"load\",\n\t\ttitle: title\n\t});\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: \"Login to TiddlySpace\",\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(null,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nQueue up a sync task. If there is already a pending task for the tiddler, just update the last modification time\n*/\nSyncer.prototype.enqueueSyncTask = function(task) {\n\tvar self = this,\n\t\tnow = Date.now();\n\t// Set the timestamps on this task\n\ttask.queueTime = now;\n\ttask.lastModificationTime = now;\n\t// Fill in some tiddlerInfo if the tiddler is one we haven't seen before\n\tif(!$tw.utils.hop(this.tiddlerInfo,task.title)) {\n\t\tthis.tiddlerInfo[task.title] = {\n\t\t\trevision: null,\n\t\t\tadaptorInfo: {},\n\t\t\tchangeCount: -1\n\t\t};\n\t}\n\t// Bail if this is a save and the tiddler is already at the changeCount that the server has\n\tif(task.type === \"save\" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) {\n\t\treturn;\n\t}\n\t// Check if this tiddler is already in the queue\n\tif($tw.utils.hop(this.taskQueue,task.title)) {\n\t\t// this.logger.log(\"Re-queueing up sync task with type:\",task.type,\"title:\",task.title);\n\t\tvar existingTask = this.taskQueue[task.title];\n\t\t// If so, just update the last modification time\n\t\texistingTask.lastModificationTime = task.lastModificationTime;\n\t\t// If the new task is a save then we upgrade the existing task to a save. Thus a pending load is turned into a save if the tiddler changes locally in the meantime. But a pending save is not modified to become a load\n\t\tif(task.type === \"save\" || task.type === \"delete\") {\n\t\t\texistingTask.type = task.type;\n\t\t}\n\t} else {\n\t\t// this.logger.log(\"Queuing up sync task with type:\",task.type,\"title:\",task.title);\n\t\t// If it is not in the queue, insert it\n\t\tthis.taskQueue[task.title] = task;\n\t\tthis.updateDirtyStatus();\n\t}\n\t// Process the queue\n\t$tw.utils.nextTick(function() {self.processTaskQueue.call(self);});\n};\n\n/*\nReturn the number of tasks in progress\n*/\nSyncer.prototype.numTasksInProgress = function() {\n\treturn $tw.utils.count(this.taskInProgress);\n};\n\n/*\nReturn the number of tasks in the queue\n*/\nSyncer.prototype.numTasksInQueue = function() {\n\treturn $tw.utils.count(this.taskQueue);\n};\n\n/*\nTrigger a timeout if one isn't already outstanding\n*/\nSyncer.prototype.triggerTimeout = function() {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},self.taskTimerInterval);\n\t}\n};\n\n/*\nProcess the task queue, performing the next task if appropriate\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if we're not already performing a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif(this.numTasksInProgress() === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(task) {\n\t\t\t// Remove the task from the queue and add it to the in progress list\n\t\t\tdelete this.taskQueue[task.title];\n\t\t\tthis.taskInProgress[task.title] = task;\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// Dispatch the task\n\t\t\tthis.dispatchTask(task,function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\tself.logger.alert(\"Sync error while processing '\" + task.title + \"':\\n\" + err);\n\t\t\t\t}\n\t\t\t\t// Mark that this task is no longer in progress\n\t\t\t\tdelete self.taskInProgress[task.title];\n\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t// Process the next task\n\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t});\n\t\t} else {\n\t\t\t// Make sure we've set a time if there wasn't a task to perform, but we've still got tasks in the queue\n\t\t\tif(this.numTasksInQueue() > 0) {\n\t\t\t\tthis.triggerTimeout();\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nChoose the next applicable task\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar self = this,\n\t\tcandidateTask = null,\n\t\tnow = Date.now();\n\t// Select the best candidate task\n\t$tw.utils.each(this.taskQueue,function(task,title) {\n\t\t// Exclude the task if there's one of the same name in progress\n\t\tif($tw.utils.hop(self.taskInProgress,title)) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is a save and the tiddler has been modified recently, but not hit the fallback time\n\t\tif(task.type === \"save\" && (now - task.lastModificationTime) < self.throttleInterval &&\n\t\t\t(now - task.queueTime) < self.fallbackInterval) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is newer than the current best candidate\n\t\tif(candidateTask && candidateTask.queueTime < task.queueTime) {\n\t\t\treturn;\n\t\t}\n\t\t// Now this is our best candidate\n\t\tcandidateTask = task;\n\t});\n\treturn candidateTask;\n};\n\n/*\nDispatch a task and invoke the callback\n*/\nSyncer.prototype.dispatchTask = function(task,callback) {\n\tvar self = this;\n\tif(task.type === \"save\") {\n\t\tvar changeCount = this.wiki.getChangeCount(task.title),\n\t\t\ttiddler = this.wiki.getTiddler(task.title);\n\t\tthis.logger.log(\"Dispatching 'save' task:\",task.title);\n\t\tif(tiddler) {\n\t\t\tthis.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\t// Adjust the info stored about this tiddler\n\t\t\t\tself.tiddlerInfo[task.title] = {\n\t\t\t\t\tchangeCount: changeCount,\n\t\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\t\trevision: revision\n\t\t\t\t};\n\t\t\t\t// Invoke the callback\n\t\t\t\tcallback(null);\n\t\t\t},{\n\t\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t\t});\n\t\t} else {\n\t\t\tthis.logger.log(\" Not Dispatching 'save' task:\",task.title,\"tiddler does not exist\");\n\t\t\treturn callback(null);\n\t\t}\n\t} else if(task.type === \"load\") {\n\t\t// Load the tiddler\n\t\tthis.logger.log(\"Dispatching 'load' task:\",task.title);\n\t\tthis.syncadaptor.loadTiddler(task.title,function(err,tiddlerFields) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Store the tiddler\n\t\t\tif(tiddlerFields) {\n\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else if(task.type === \"delete\") {\n\t\t// Delete the tiddler\n\t\tthis.logger.log(\"Dispatching 'delete' task:\",task.title);\n\t\tthis.syncadaptor.deleteTiddler(task.title,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tdelete self.tiddlerInfo[task.title];\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t});\n\t}\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"title": "$:/core/modules/syncer.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = [];\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields.push(field + \": \" + this.getFieldString(field));\n\t\t\t}\n\t\t}\n\t}\n\treturn fields.join(\"\\n\");\n};\n\n/*\nCompare two tiddlers for equality\ntiddler: the tiddler to compare\nexcludeFields: array of field names to exclude from the comparison\n*/\nexports.isEqual = function(tiddler,excludeFields) {\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\treturn false;\n\t}\n\texcludeFields = excludeFields || [];\n\tvar self = this,\n\t\tdifferences = []; // Fields that have differences\n\t// Add to the differences array\n\tfunction addDifference(fieldName) {\n\t\t// Check for this field being excluded\n\t\tif(excludeFields.indexOf(fieldName) === -1) {\n\t\t\t// Save the field as a difference\n\t\t\t$tw.utils.pushTop(differences,fieldName);\n\t\t}\n\t}\n\t// Returns true if the two values of this field are equal\n\tfunction isFieldValueEqual(fieldName) {\n\t\tvar valueA = self.fields[fieldName],\n\t\t\tvalueB = tiddler.fields[fieldName];\n\t\t// Check for identical string values\n\t\tif(typeof(valueA) === \"string\" && typeof(valueB) === \"string\" && valueA === valueB) {\n\t\t\treturn true;\n\t\t}\n\t\t// Check for identical array values\n\t\tif($tw.utils.isArray(valueA) && $tw.utils.isArray(valueB) && $tw.utils.isArrayEqual(valueA,valueB)) {\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise the fields must be different\n\t\treturn false;\n\t}\n\t// Compare our fields\n\tfor(var fieldName in this.fields) {\n\t\tif(!isFieldValueEqual(fieldName)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// There's a difference for every field in the other tiddler that we don't have\n\tfor(fieldName in tiddler.fields) {\n\t\tif(!(fieldName in this.fields)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// Return whether there were any differences\n\treturn differences.length === 0;\n};\n\n})();\n",
"title": "$:/core/modules/tiddler.js",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"] && incomingTiddler.version) {\n\t\t\t// Upgrade the incoming plugin if we've got a newer version in the upgrade library\n\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\tif($tw.utils.checkVersions(libraryTiddler.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/plugins.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/system.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerData(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/themetweaks.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/crypto.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/utils/crypto.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/animations/slide.js",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"title": "$:/core/modules/utils/dom/animator.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif(document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/browser.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t}\n\tel.className = c.join(\" \");\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function() {\n\tif(\"scrollX\" in window) {\n\t\treturn {x: window.scrollX, y: window.scrollY};\n\t} else {\n\t\treturn {x: document.documentElement.scrollLeft, y: document.documentElement.scrollTop};\n\t}\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\ttry {\n\t\tif(window.localStorage) {\n\t\t\tlocalStorage.setItem(\"tw5-password-\" + name,password);\n\t\t}\n\t} catch(e) {\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\ttry {\n\t\treturn window.localStorage ? localStorage.getItem(\"tw5-password-\" + name) : \"\";\n\t} catch(e) {\n\t\treturn \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n\n})();\n",
"title": "$:/core/modules/utils/dom.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data)\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tdata = results.join(\"&\");\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this.responseText,this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback(\"XMLHttpRequest error code: \" + this.status);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,options.url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\trequest.send(data);\n\treturn request;\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/http.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"enter\": 13,\n\t\"escape\": 27\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nexports.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(\"+\"),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase();\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(namedKeys[s]) {\n\t\t\tinfo.keyCode = namedKeys[s];\n\t\t}\n\t}\n\treturn info;\n};\n\nexports.checkKeyDescriptor = function(event,keyInfo) {\n\tvar metaKeyStatus = !!keyInfo.metaKey; // Using a temporary variable to keep JSHint happy\n\treturn event.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === metaKeyStatus;\t\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/keyboard.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = document.createElement(\"div\"),\n\t\tmodalBackdrop = document.createElement(\"div\"),\n\t\tmodalWrapper = document.createElement(\"div\"),\n\t\tmodalHeader = document.createElement(\"div\"),\n\t\theaderTitle = document.createElement(\"h3\"),\n\t\tmodalBody = document.createElement(\"div\"),\n\t\tmodalLink = document.createElement(\"a\"),\n\t\tmodalFooter = document.createElement(\"div\"),\n\t\tmodalFooterHelp = document.createElement(\"span\"),\n\t\tmodalFooterButtons = document.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t});\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t});\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(document.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler && tiddler.fields && tiddler.fields.help) {\n\t\tvar link = document.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.appendChild(document.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: \"Close\"\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t});\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + window.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\twindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tdocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tdocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tif($tw.pageContainer) {\n\t\t$tw.utils.toggleClass($tw.pageContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"title": "$:/core/modules/utils/dom/modal.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar notification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{parentWidget: $tw.rootWidget, document: document});\n\twidgetNode.render(notification,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t});\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"title": "$:/core/modules/utils/dom/notifier.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === options.title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\t// Store the popup details\n\tthis.popups.push({\n\t\ttitle: options.title,\n\t\twiki: options.wiki,\n\t\tdomNode: options.domNode\n\t});\n\t// Set the state tiddler\n\toptions.wiki.setTextReference(options.title,\n\t\t\t\"(\" + options.domNode.offsetLeft + \",\" + options.domNode.offsetTop + \",\" + \n\t\t\t\toptions.domNode.offsetWidth + \",\" + options.domNode.offsetHeight + \")\");\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"title": "$:/core/modules/utils/dom/popup.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\t// Now get ready to scroll the body\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = $tw.utils.getScrollPosition();\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar clientBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\ttop: clientBounds.top + scrollPosition.y,\n\t\t\twidth: clientBounds.width,\n\t\t\theight: clientBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is above/left of the current view, then scroll to it's top/left\n\t\t\tif(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,window.innerWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,window.innerHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\twindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"title": "$:/core/modules/utils/dom/scroller.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"title": "$:/core/modules/utils/edition-info.js",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text;\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis.style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value;\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"='\",$tw.utils.htmlEncode(v),\"'\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this.style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this.style) {\n\t\t\t\tstyle.push(s + \":\" + this.style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style='\",style.join(\"\"),\"'\")\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get textContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get formattedTextContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"title": "$:/core/modules/utils/fakedom.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = new Buffer(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n})();\n",
"title": "$:/core/modules/utils/filesystem.js",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName) {\n\tthis.componentName = componentName || \"\";\n}\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tif(console !== undefined && console.log !== undefined) {\n\t\treturn Function.apply.call(console.log, console, [this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)));\n\t}\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\t// Prepare the text of the alert\n\tvar text = Array.prototype.join.call(arguments,\" \");\n\t// Check if there is an existing alert with the same text and the same component\n\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\talertFields,\n\t\texistingCount,\n\t\tself = this;\n\t$tw.utils.each(existingAlerts,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t}\n\t});\n\tif(alertFields) {\n\t\texistingCount = alertFields.count || 1;\n\t} else {\n\t\talertFields = {\n\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\ttext: text,\n\t\t\ttags: [ALERT_TAG],\n\t\t\tcomponent: this.componentName\n\t\t};\n\t\texistingCount = 0;\n\t}\n\talertFields.modified = new Date();\n\tif(++existingCount > 1) {\n\t\talertFields.count = existingCount;\n\t} else {\n\t\talertFields.count = undefined;\n\t}\n\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t// Log it too\n\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n};\n\nexports.Logger = Logger;\n\n})();\n",
"title": "$:/core/modules/utils/logger.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n})();\n",
"title": "$:/core/modules/utils/parsetree.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap of current values of measurements\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n}\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tself.measures = {};\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime) + \"ms\");\n\t\t\tfor(var m in self.measures) {\n\t\t\t\tself.logger.log(\"+\" + m + \": \" + self.measures[m] + \"ms\");\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments),\n\t\t\t\tvalue = self.measures[name] || 0;\n\t\t\tself.measures[name] = value + $tw.utils.timer(startTime);\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"title": "$:/core/modules/utils/performance.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\nError: \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"title": "$:/core/modules/utils/pluginmaker.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\tconsole.log($tw.node ? \"\\x1b[1;33m\" + text + \"\\x1b[0m\" : text);\n}\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\tvar s = 0;\n\t$tw.utils.each(object,function() {s++;});\n\treturn s;\n};\n\n/*\nCheck if an array is equal by value and by reference.\n*/\nexports.isArrayEqual = function(array1,array2) {\n\tif(array1 === array2) {\n\t\treturn true;\n\t}\n\tarray1 = array1 || [];\n\tarray2 = array2 || [];\n\tif(array1.length !== array2.length) {\n\t\treturn false;\n\t}\n\treturn array1.every(function(value,index) {\n\t\treturn value === array2[index];\n\t});\n};\n\n/*\nPush entries onto an array, removing them first if they already exist in the array\n\tarray: array to modify (assumed to be free of duplicates)\n\tvalue: a single value to push or an array of values to push\n*/\nexports.pushTop = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\t// Remove any array entries that are duplicated in the new values\n\t\tif(value.length !== 0) {\n\t\t\tif(array.length !== 0) {\n\t\t\t\tif(value.length < array.length) {\n\t\t\t\t\tfor(t=0; t<value.length; t++) {\n\t\t\t\t\t\tp = array.indexOf(value[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(p,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor(t=array.length-1; t>=0; t--) {\n\t\t\t\t\t\tp = value.indexOf(array[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(t,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Push the values on top of the main array\n\t\t\tarray.push.apply(array,value);\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t\tarray.push(value);\n\t}\n\treturn array;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1) + 3600000) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\" and \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar e = s.substr(1,s.length-2); // Strip the & and the ;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(2),16));\t\n\t\t} else {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(1),10));\n\t\t}\n\t} else {\n\t\tvar c = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn String.fromCharCode(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape escape all non-ASCII characters.\n\t*/\n\treturn s\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10);\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\tif($tw.browser) {\n\t\t// TODO\n\t\tthrow \"$tw.utils.base64Decode() doesn't work in the browser\";\n\t} else {\n\t\treturn (new Buffer(string64,\"base64\")).toString();\n\t}\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\t\t\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n})();",
"title": "$:/core/modules/utils/utils.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-deletefield.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {};\n\tif(this.actionField) {\n\t\tremoveFields[this.actionField] = undefined;\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t}\n\t\t});\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,removeFields));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-deletefield.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-navigate.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$param\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Dispatch the message\n\tthis.dispatchEvent({type: this.actionMessage, param: param, paramObject: paramObject, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-sendmessage.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this;\n\tif(typeof this.actionValue === \"string\") {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue);\t\t\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-setfield.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,function(tiddlerFieldsArray) {\n\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/browse.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"button\");\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = this.popup && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif(this.set && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n}\n\nButtonWidget.prototype.isSelected = function() {\n\tvar tiddler = this.wiki.getTiddler(this.set);\n\treturn tiddler ? tiddler.fields.text === this.setTo : this.defaultSetValue === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\t$tw.popup.triggerPopup({\n\t\tdomNode: this.domNodes[0],\n\t\ttitle: this.popup,\n\t\twiki: this.wiki\n\t});\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/button.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value = tiddler.fields[this.checkboxField] || this.checkboxDefault || \"\";\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false;\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tiddler.hasTag(this.checkboxTag) !== checked)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tvar value = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.field || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/checkbox.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/codeblock.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = undefined;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/count.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = \"tc-dropzone\";\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"}\n\t]);\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nDropZoneWidget.prototype.enterDrag = function() {\n\t// We count enter/leave events\n\tthis.dragEnterCount = (this.dragEnterCount || 0) + 1;\n\t// If we're entering for the first time we need to apply highlighting\n\tif(this.dragEnterCount === 1) {\n\t\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.leaveDrag = function() {\n\t// Reduce the enter count\n\tthis.dragEnterCount = (this.dragEnterCount || 0) - 1;\n\t// Remove highlighting if we're leaving externally\n\tif(this.dragEnterCount <= 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag();\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag();\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tthis.leaveDrag();\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Reset the enter count\n\tthis.dragEnterCount = 0;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = this.wiki.readFiles(dataTransfer.files,function(tiddlerFieldsArray) {\n\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t});\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\tthis.importData(dataTransfer);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.importData = function(dataTransfer) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<this.importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || this.importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = this.importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.convertToFields(data);\n\t\t\t\tif(!tiddlerFields.title) {\n\t\t\t\t\ttiddlerFields.title = this.wiki.generateNewTitle(\"Untitled\");\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nDropZoneWidget.prototype.importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, convertToFields: function(data) {\n\t\treturn JSON.parse(data);\n\t}},\n\t{type: \"URL\", IECompatible: true, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURI(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURI(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/plain\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"Text\", IECompatible: true, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}}\n];\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/dropzone.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Construct the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"transclude\",\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t}\n\t}]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-binary.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 300,\n\tDEFAULT_IMAGE_HEIGHT = 185;\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\tthis.widthDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-width\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleWidthChangeEvent\"\n\t\t}]\n\t});\n\tthis.heightDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-height\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleHeightChangeEvent\"\n\t\t}]\n\t});\n\t// Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tparent.insertBefore(this.widthDomNode,nextSibling);\n\tparent.insertBefore(this.heightDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode,this.widthDomNode,this.heightDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n};\n\n/*\nNote that the bitmap editor intentionally doesn't try to refresh itself because it would be confusing to have the image changing spontaneously while editting it\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\t// Get the current bitmap into an image object\n\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Update the input boxes with the actual size of the canvas\n*/\nEditBitmapWidget.prototype.updateSize = function() {\n\tthis.widthDomNode.value = this.currCanvas.width;\n\tthis.heightDomNode.value = this.currCanvas.height;\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleWidthChangeEvent = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(this.widthDomNode.value,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newWidth !== this.currCanvas.width) {\n\t\tthis.changeCanvasSize(newWidth,this.currCanvas.height);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleHeightChangeEvent = function(event) {\n\t// Get the new width\n\tvar newHeight = parseInt(this.heightDomNode.value,10);\n\t// Update if necessary\n\tif(newHeight > 0 && newHeight !== this.currCanvas.height) {\n\t\tthis.changeCanvasSize(this.currCanvas.width,newHeight);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseInt(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"),10);\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\tif(tiddler) {\n\t\t// data URIs look like \"data:<type>;base64,<text>\"\n\t\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type,1.0),\n\t\t\tposColon = dataURL.indexOf(\":\"),\n\t\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\t\tposComma = dataURL.indexOf(\",\"),\n\t\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\t\ttext = dataURL.substring(posComma+1);\n\t\tvar update = {type: type, text: text};\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,update));\n\t}\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-bitmap.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditTextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditTextWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tvar editInfo = this.getEditInfo();\n\tvar domNode = this.document.createElement(this.editTag);\n\tif(this.editType) {\n\t\tdomNode.setAttribute(\"type\",this.editType);\n\t}\n\tif(editInfo.value === \"\" && this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\tif(this.editSize) {\n\t\tdomNode.setAttribute(\"size\",this.editSize);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\t// Set the text\n\tif(this.editTag === \"textarea\") {\n\t\tdomNode.appendChild(this.document.createTextNode(editInfo.value));\n\t} else {\n\t\tdomNode.value = editInfo.value;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n\t// Fix height\n\tthis.fixHeight();\n\t// Focus field\n\tif(this.editFocus === \"true\") {\n\t\tif(domNode.focus && domNode.select) {\n\t\t\tdomNode.focus();\n\t\t\tdomNode.select();\t\t\t\n\t\t}\n\t}\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditTextWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditTextWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editSize = this.getAttribute(\"size\");\n\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",\"yes\") === \"yes\";\n\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.editFocus = this.getAttribute(\"focus\");\n\t// Get the editor element tag and type\n\tvar tag,type;\n\tif(this.editField === \"text\") {\n\t\ttag = \"textarea\";\n\t} else {\n\t\ttag = \"input\";\n\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\ttag = fieldModule.editTag;\n\t\t}\n\t\tif(fieldModule && fieldModule.editType) {\n\t\t\ttype = fieldModule.editType;\n\t\t}\n\t\ttype = type || \"text\";\n\t}\n\t// Get the rest of our parameters\n\tthis.editTag = this.getAttribute(\"tag\",tag);\n\tthis.editType = this.getAttribute(\"type\",type);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely rerender if any of our attributes have changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\tthis.updateEditor(this.getEditInfo().value);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditTextWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditTextWidget.prototype.updateEditorDomNode = function(text) {\n\t// Replace the edit value if the tiddler we're editing has changed\n\tvar domNode = this.domNodes[0];\n\tif(!domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.document.activeElement !== domNode) {\n\t\t\tdomNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nFix the height of textareas to fit their content\n*/\nEditTextWidget.prototype.fixHeight = function() {\n\tvar self = this,\n\t\tdomNode = this.domNodes[0];\n\tif(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === \"textarea\") {\n\t\t// Resize the textarea to fit its content, preserving scroll position\n\t\tvar scrollPosition = $tw.utils.getScrollPosition(),\n\t\t\tscrollTop = scrollPosition.y;\n\t\t// Measure the specified minimum height\n\t\tdomNode.style.height = self.editMinHeight;\n\t\tvar minHeight = domNode.offsetHeight;\n\t\t// Set its height to auto so that it snaps to the correct height\n\t\tdomNode.style.height = \"auto\";\n\t\t// Calculate the revised height\n\t\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight);\n\t\t// Only try to change the height if it has changed\n\t\tif(newHeight !== domNode.offsetHeight) {\n\t\t\tdomNode.style.height = newHeight + \"px\";\n\t\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t\t$tw.utils.forceLayout(domNode);\n\t\t\t// Check that the scroll position is still visible before trying to scroll back to it\n\t\t\tscrollTop = Math.min(scrollTop,self.document.body.scrollHeight - window.innerHeight);\n\t\t\twindow.scrollTo(scrollPosition.x,scrollTop);\n\t\t}\n\t}\n};\n\n/*\nHandle a dom \"input\" event\n*/\nEditTextWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(this.domNodes[0].value);\n\tthis.fixHeight();\n\treturn true;\n};\n\nEditTextWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditTextWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\nexports[\"edit-text\"] = EditTextWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-text.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder}\n\t\t}\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/element.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/encrypt.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar textNode = this.document.createTextNode($tw.utils.entityDecode(this.parseTreeNode.entity));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/entity.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/fieldmangler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\t// Get the exclusion list\n\tvar exclude;\n\tif(this.exclude) {\n\t\texclude = this.exclude.split(\" \");\n\t} else {\n\t\texclude = [\"text\"]; \n\t}\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tfields.push(fieldName);\n\t\t\t}\n\t\t}\n\t\tfields.sort();\n\t\tfor(var f=0; f<fields.length; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tvar row = this.template,\n\t\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\t\tif(reMatch) {\n\t\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow = row.replace(\"$name$\",fieldName);\n\t\t\t\trow = row.replace(\"$value$\",value);\n\t\t\t\trow = row.replace(\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\t\ttext.push(row);\n\t\t\t}\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/fields.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.imageSource;\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/image.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar self = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\tvar widgetStackStart,widgetStackEnd;\n\tfunction addWidgetNode(widgetNode) {\n\t\tif(widgetNode) {\n\t\t\tif(!widgetStackStart && !widgetStackEnd) {\n\t\t\t\twidgetStackStart = widgetNode;\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t} else {\n\t\t\t\twidgetStackEnd.children = [widgetNode];\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t}\n\t\t}\n\t}\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = self.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\taddWidgetNode({\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params\n\t\t\t\t});\n\t\t\t\tparseTreeNode = parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\t// Add our own children to the end of the pile\n\tvar parseTreeNodes;\n\tif(widgetStackStart && widgetStackEnd) {\n\t\tparseTreeNodes = [widgetStackStart];\n\t\twidgetStackEnd.children = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/importvariables.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.utils.checkKeyDescriptor(event,self.keyInfo)) {\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.key = this.getAttribute(\"key\");\n\tthis.keyInfo = $tw.utils.parseKeyDescriptor(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/keyboard.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true;\n\t// Render the link if required\n\tif(useWikiLinks) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Create our element\n\tvar domNode = this.document.createElement(\"a\");\n\t// Assign classes\n\tvar classes = [];\n\tif(this.linkClasses) {\n\t\tclasses.push(this.linkClasses);\n\t}\n\tclasses.push(\"tc-tiddlylink\");\n\tif(this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t}\n\tif(this.isMissing && !this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t} else {\n\t\tif(!this.isMissing) {\n\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t}\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Set an href\n\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\",\n\t\twikiLinkText = wikiLinkTemplate.replace(\"$uri_encoded$\",encodeURIComponent(this.to));\n\twikiLinkText = wikiLinkText.replace(\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"dragstart\", handlerObject: this, handlerMethod: \"handleDragStartEvent\"},\n\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t]);\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nLinkWidget.prototype.handleDragStartEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\tif(this.to) {\n\t\t\t// Set the dragging class on the element being dragged\n\t\t\t$tw.utils.addClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t\t// Create the drag image elements\n\t\t\tthis.dragImage = this.document.createElement(\"div\");\n\t\t\tthis.dragImage.className = \"tc-tiddler-dragger\";\n\t\t\tvar inner = this.document.createElement(\"div\");\n\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\tinner.appendChild(this.document.createTextNode(this.to));\n\t\t\tthis.dragImage.appendChild(inner);\n\t\t\tthis.document.body.appendChild(this.dragImage);\n\t\t\t// Astoundingly, we need to cover the dragger up: http://www.kryogenix.org/code/browser/custom-drag-image.html\n\t\t\tvar cover = this.document.createElement(\"div\");\n\t\t\tcover.className = \"tc-tiddler-dragger-cover\";\n\t\t\tcover.style.left = (inner.offsetLeft - 16) + \"px\";\n\t\t\tcover.style.top = (inner.offsetTop - 16) + \"px\";\n\t\t\tcover.style.width = (inner.offsetWidth + 32) + \"px\";\n\t\t\tcover.style.height = (inner.offsetHeight + 32) + \"px\";\n\t\t\tthis.dragImage.appendChild(cover);\n\t\t\t// Set the data transfer properties\n\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t// First the image\n\t\t\tdataTransfer.effectAllowed = \"copy\";\n\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\tdataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);\n\t\t\t}\n\t\t\t// Then the data\n\t\t\tdataTransfer.clearData();\n\t\t\tvar jsonData = this.wiki.getTiddlerAsJson(this.to),\n\t\t\t\ttextData = this.wiki.getTiddlerText(this.to,\"\"),\n\t\t\t\ttitle = (new RegExp(\"^\" + $tw.config.textPrimitives.wikiLink + \"$\",\"mg\")).exec(this.to) ? this.to : \"[[\" + this.to + \"]]\";\n\t\t\t// IE doesn't like these content types\n\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\tdataTransfer.setData(\"text/plain\",title);\n\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURI(jsonData));\n\t\t\t}\n\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURI(jsonData));\n\t\t\tdataTransfer.setData(\"Text\",title);\n\t\t\tevent.stopPropagation();\n\t\t} else {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\nLinkWidget.prototype.handleDragEndEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\t// Remove the dragging class on the element being dragged\n\t\t$tw.utils.removeClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t// Delete the drag image element\n\t\tif(this.dragImage) {\n\t\t\tthis.dragImage.parentNode.removeChild(this.dragImage);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Get the target tiddler title\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\t// Get the link title and aria label\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\t// Get the link classes\n\tthis.linkClasses = this.getAttribute(\"class\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/link.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(this.catchTo) {\n\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.catchMessage && this.parentWidget) {\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: this.catchMessage,\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\tif(this.catchSet) {\n\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/linkcatcher.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.iterator = this.getAttribute(\"iterator\",\"iterator\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this,\n\t\tcount = self.list.length;\n\t// Check for an empty list\n\tif(0 === count) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title,index,count,self.iterator));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title,index,count,iterator) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {\n\t\ttype: \"listitem\",\n\t\titemTitle: title,\n\t\tvariableName: this.variableName,\n\t\tchildren: templateTree,\n\t\tindex: index,\n\t\tcount: count,\n\t\titerator: iterator\n\t};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tvar hasChanged = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t\treturn hasChanged;\n\t}\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\tvar item = this.parseTreeNode;\n\t// Set the current list item title\n\tthis.setVariable(item.variableName,item.itemTitle);\n\tthis.setVariable(item.iterator,(item.index + 1).toString());\n\tthis.setVariable(item.iterator + \"-even\",item.index % 2 == 1 ? \"true\" : \"false\");\n\tthis.setVariable(item.iterator + \"-last\",item.index + 1 == item.count ? \"true\" : \"false\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/list.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar text = this.getVariable(this.parseTreeNode.name || this.getAttribute(\"$name\"),{params: params}),\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/macrocall.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList}\n\t));\n};\n\nNavigatorWidget.prototype.findTitleInStory = function(storyList,title,defaultIndex) {\n\tvar p = storyList.indexOf(title);\n\treturn p === -1 ? defaultIndex : p;\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tvar p = storyList.indexOf(title);\n\twhile(p !== -1) {\n\t\tstoryList.splice(p,1);\n\t\tp = storyList.indexOf(title);\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tvar pos = storyList.indexOf(oldTitle);\n\tif(pos !== -1) {\n\t\tstoryList[pos] = newTitle;\n\t\tdo {\n\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\tif(pos !== -1) {\n\t\t\t\tstoryList.splice(pos,1);\n\t\t\t}\n\t\t} while(pos !== -1);\n\t} else {\n\t\tstoryList.splice(0,0,newTitle);\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tvar storyList = this.getStoryList();\n\tif(storyList) {\n\t\t// See if the tiddler is already there\n\t\tvar slot = this.findTitleInStory(storyList,title,-1);\n\t\t// If not we need to add it\n\t\tif(slot === -1) {\n\t\t\t// First we try to find the position of the story element we navigated from\n\t\t\tslot = this.findTitleInStory(storyList,fromTitle,-1) + 1;\n\t\t\t// Add the tiddler\n\t\t\tstoryList.splice(slot,0,title);\n\t\t\t// Save the story\n\t\t\tthis.saveStoryList(storyList);\n\t\t}\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\tif(!event.navigateSuppressNavigation) {\n\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title),\n\t\tdraftTitle = draftTiddler.fields.title,\n\t\tstoryList = this.getStoryList();\n\tthis.removeTitleFromStory(storyList,draftTitle);\n\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler.fields[\"draft.of\"],\n\t\tconfirmationTitle;\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Delete this tiddler\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle;\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\";\n\t\tc++;\n\t} while(this.wiki.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Save the draft tiddler as the real tiddler\n\t\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields()));\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(originalTiddler) {\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t} else {\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t}\n\t\t\tthis.saveStoryList(storyList);\n\t\t\t// Trigger an autosave\n\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\t\t\t\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags)\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\texistingTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\t\t\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\tvar self = this;\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\t\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\t\t\n\t}\n\treturn false;\n};\n\n// \nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerData(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push(\"The following tiddlers were imported:\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(tiddlerFields));\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: IMPORT_TITLE,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([IMPORT_TITLE]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/navigator.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/password.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nRadio widget\n\nWill set a field to the selected value:\n\n```\n\t<$radio field=\"myfield\" value=\"check 1\">one</$radio>\n\t<$radio field=\"myfield\" value=\"check 2\">two</$radio>\n\t<$radio field=\"myfield\" value=\"check 3\">three</$radio>\n```\n\n|Parameter |Description |h\n|tiddler |Name of the tiddler in which the field should be set. Defaults to current tiddler |\n|field |The name of the field to be set |\n|value |The value to set |\n|class |Optional class name(s) |\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.radioClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(this.getValue() == this.radioValue) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.radioTitle);\n\treturn tiddler && tiddler.getFieldString(this.radioField);\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tif(this.radioClass !== \"\") {\n\t\tthis.radioClass += \" \";\n\t}\n\tthis.radioClass += \"tc-radio\";\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/radio.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/raw.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar domNode = this.document.createElement(this.parseTreeNode.isBlock ? \"div\" : \"span\");\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tdomNode.style.left = (this.popup.left - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTitle = this.state;\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state = this.stateTitle ? this.wiki.getTextReference(this.stateTitle,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.readMatchState(state);\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.readMatchState(state);\n\t\t\tthis.isOpen = !this.isOpen;\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.readMatchState = function(state) {\n\tthis.isOpen = state === this.text;\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes[\"default\"] || changedAttributes.animate) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false,\n\t\t\tcurrentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\trefreshed = true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n }});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/reveal.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/scrollable.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\tvar value = this.getSelectDomNode().value;\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tvar domNode = this.getSelectDomNode();\n\tif(domNode.value !== value) {\n\t\tdomNode.value = value;\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tif(changedTiddlers[this.selectTitle]) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/select.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tvar value = this.setValue;\n\tif(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(!this.setValue) {\n\t\t\tvalue = $tw.utils.stringifyList(results);\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t}\n\tthis.setVariable(this.setName,value,this.parseTreeNode.params);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.value || changedAttributes.emptyValue) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/set.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/text.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/tiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: \"Recursive transclusion error in transclude widget\"}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/transclude.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified();\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function() {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{parentWidget: this});\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/view.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tif(arguments.length > 0) {\n\t\tthis.initialise(parseTreeNode,options);\n\t}\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\n*/\nWidget.prototype.setVariable = function(name,value,params) {\n\tthis.variables[name] = {value: value, params: params};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n*/\nWidget.prototype.getVariable = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value;\n\t\t// Substitute any parameters specified in the definition\n\t\tvalue = this.substituteVariableParameters(value,variable.params,actualParams);\n\t\tvalue = this.substituteVariableReferences(value);\n\t\treturn value;\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn this.evaluateMacroModule(name,actualParams,options.defaultValue);\n};\n\nWidget.prototype.substituteVariableParameters = function(text,formalParams,actualParams) {\n\tif(formalParams) {\n\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\tparamInfo, paramValue;\n\t\t// Step through each of the parameters in the macro definition\n\t\tfor(var p=0; p<formalParams.length; p++) {\n\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\tparamInfo = formalParams[p];\n\t\t\tparamValue = undefined;\n\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\tnextAnonParameter++;\n\t\t\t}\n\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t}\n\t\t\t// If we've still not got a value, use the default, if any\n\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t// Replace any instances of this parameter\n\t\t\ttext = text.replace(new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(paramInfo.name) + \"\\\\$\",\"mg\"),paramValue);\n\t\t}\n\t}\n\treturn text;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tname = name || \"transclusion\";\n\tvar output = [],\n\t\tnode = this;\n\twhile(node && node.parentWidget) {\n\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\toutput.push(node.getVariable(name));\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn $tw.utils.hashString(output.join(\"\"));\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.render(parent,nextSibling);\n\t});\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar self = this,\n\t\trefreshed = false;\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\trefreshed = childWidget.refresh(changedTiddlers) || refreshed;\n\t});\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\treturn parent.findNextSiblingDomNode(index);\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke any action widgets that are immediate children of this widget\n*/\nWidget.prototype.invokeActions = function(event) {\n\tvar handled = false;\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\tif(child.invokeAction && child.invokeAction(this,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\nexports.widget = Widget;\n\n})();\n",
"title": "$:/core/modules/widgets/widget.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki.js": {
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\";\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value) {\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tdata[index] = value;\n\t\tthis.setTiddlerData(title,data,this.getModificationFields());\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || [];\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,tiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tvar fields = {\n\t\t\tcreated: new Date()\n\t\t},\n\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\tif(creator) {\n\t\tfields.creator = creator;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tvar fields = Object.create(null),\n\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\tfields.modified = new Date();\n\tif(modifier) {\n\t\tfields.modifier = modifier;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tif(isNumeric) {\n\t\t\ta = Number(a);\n\t\t\tb = Number(b);\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\t// Count up the links\n\t\tvar links = [],\n\t\t\tcheckParseTree = function(parseTree) {\n\t\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\tif(parser) {\n\t\t\tcheckParseTree(parser.tree);\n\t\t}\n\t\treturn links;\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinks = [];\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\tbacklinks.push(title);\n\t\t}\n\t});\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\tvar self = this;\n\treturn this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\tvar tagmap = self.getTagMap();\n\t\treturn self.sortByList(tagmap[tag],tag);\n\t});\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tvar currPos = titles.indexOf(title),\n\t\t\t\tnewPos = -1,\n\t\t\t\ttiddler = this.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(newPos === -1) {\n\t\t\t\t\tnewPos = currPos;\n\t\t\t\t}\n\t\t\t\tif(newPos !== currPos) {\n\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t}\n\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerData(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerData(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\n// Temporarily disable caching so that tweakParseTreeNode() works\nreturn initializer();\n\n//\tthis.caches = this.caches || Object.create(null);\n//\tvar caches = this.caches[title];\n//\tif(caches && caches[cacheName]) {\n//\t\treturn caches[cacheName];\n//\t} else {\n//\t\tif(!caches) {\n//\t\t\tcaches = Object.create(null);\n//\t\t\tthis.caches[title] = caches;\n//\t\t}\n//\t\tcaches[cacheName] = initializer();\n//\t\treturn caches[cacheName];\n//\t}\n};\n\n// Clear all caches associated with a particular tiddler\nexports.clearCache = function(title) {\n\tthis.caches = this.caches || Object.create(null);\n\tif($tw.utils.hop(this.caches,title)) {\n\t\tdelete this.caches[title];\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.old_parseText = function(type,text,options) {\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.config.fileExtensionInfo[type]) {\n\t\tParser = $tw.Wiki.parsers[$tw.config.fileExtensionInfo[type].type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.old_parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"newInlineParseTree\" : \"newBlockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.old_parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nvar tweakMacroDefinition = function(nodeList) {\n\tif(nodeList && nodeList[0] && nodeList[0].type === \"macrodef\") {\n\t\tnodeList[0].type = \"set\";\n\t\tnodeList[0].attributes = {\n\t\t\tname: {type: \"string\", value: nodeList[0].name},\n\t\t\tvalue: {type: \"string\", value: nodeList[0].text}\n\t\t};\n\t\tnodeList[0].children = nodeList.slice(1);\n\t\tnodeList.splice(1,nodeList.length-1);\n\t\ttweakMacroDefinition(nodeList[0].children);\n\t}\n};\n\nvar tweakParser = function(parser) {\n\t// Move any macro definitions to contain the body tree\n\ttweakMacroDefinition(parser.tree);\n};\n\nexports.parseText = function(type,text,options) {\n\tvar parser = this.old_parseText(type,text,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTiddler = function(title,options) {\n\tvar parser = this.old_parseTiddler(title,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type || \"text/vnd.tiddlywiki\",tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.children: optional array of children for the transclude widget\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTree = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"transclude\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttiddler: {\n\t\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: title}},\n\t\t\t\tisBlock: !options.parseAsInline}]}\n\t]};\n\tif(options.field) {\n\t\tparseTree.tree[0].children[0].attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.children) {\n\t\tparseTree.tree[0].children[0].children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTree,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tliteral: If true, searches for literal string, rather than separate search terms\n\tfield: If specified, restricts the search to the specified field\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tmatch;\n\t\tfor(var t=0; t<searchTermsRegExps.length; t++) {\n\t\t\tmatch = false;\n\t\t\tif(options.field) {\n\t\t\t\tmatch = searchTermsRegExps[t].test(tiddler.getFieldString(options.field));\n\t\t\t} else {\n\t\t\t\t// Search title, tags and body\n\t\t\t\tif(contentTypeInfo.encoding === \"utf8\") {\n\t\t\t\t\tmatch = match || searchTermsRegExps[t].test(tiddler.fields.text);\n\t\t\t\t}\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.join(\"\\0\") : \"\";\n\t\t\t\tmatch = match || searchTermsRegExps[t].test(tags) || searchTermsRegExps[t].test(tiddler.fields.title);\n\t\t\t}\n\t\t\tif(!match) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(tiddler.fields.text !== undefined) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text;\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,callback) {\n\tvar result = [],\n\t\toutstanding = files.length;\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t});\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,callback) {\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.config.fileExtensionInfo[file.name.substr(dotPos)];\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\t// Deserialise the file contents\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\t// Are we binary?\n\t\tif(isBinary) {\n\t\t\t// The base64 section starts after the first comma in the data URI\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttiddlerFields.text = text.substr(commaPos+1);\n\t\t\t\tcallback([tiddlerFields]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\t\tif(encryptedJson) {\n\t\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields));\n\t\t\t}\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]);\n\tif(!origTiddler) {\n\t\treturn tiddler.fields.text !== \"\";\n\t}\n\treturn tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"] || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\thistoryTitle = historyTitle || \"$:/HistoryList\";\n\tvar titles = $tw.utils.isArray(title) ? title : [title];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.getTiddlerData(historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: fromPageRect});\n\t});\n\tthis.setTiddlerData(historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/wiki.js",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #fffffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Contrast": {
"title": "$:/palettes/Contrast",
"name": "Contrast",
"description": "High contrast and unambiguous",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,0,0, 0.5)\nsidebar-foreground: #ffffff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ececec\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ececec\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ececec\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)http://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<<renderContent>>\n</$importvariables>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\"><<renderContent>></$importvariables>"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"type": "text/vnd.tiddlywiki",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|http://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`{{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>\n</$importvariables>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\t\t<!-- Force IE standards mode for Intranet and HTA - should be the first meta -->\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}\n</div>\n</body>\n</html>\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button message=\"tm-delete-tiddler\" class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DD MM YYYY\"/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">(count: <$view field=\"count\"/>)</span></$reveal>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<div class=\"tc-binary-warning\">\n\n<<lingo Prompt>>\n\n</div>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Tags\" default=\"\" tag=\"input\"/> |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/snippets/paletteeditor}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\\define plugin-table-body(type,disabledMessage)\n<div class=\"tc-plugin-info-chunk\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<div>\n''<$view field=\"description\"><$view field=\"title\"/></$view>'' $disabledMessage$\n</div>\n<div>\n<$view field=\"title\"/>\n</div>\n<div>\n<$view field=\"version\"/>\n</div>\n</div>\n\\end\n\\define plugin-table(type)\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[description]]\" emptyMessage=<<lingo \"Empty/Hint\">>>\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$reveal type=\"nomatch\" text=\"\" state=\"!!list\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList={{!!list}} default=\"readme\" template=\"$:/core/ui/PluginInfo\"/>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=\"!!list\">\nNo information provided\n</$reveal>\n</div>\n</$reveal>\n</$set>\n</$list>\n</$set>\n\\end\n\n! <<lingo Plugin/Prompt>>\n\n<<plugin-table plugin>>\n\n! <<lingo Theme/Prompt>>\n\n<<plugin-table theme>>\n\n! <<lingo Language/Prompt>>\n\n<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<a href=<<backupURL>>><$macrocall $name=\"backupURL\" $type=\"text/plain\" $output=\"text/plain\"/></a>\n</$set>\n</$reveal>\n\\end\n! <<lingo TiddlySpot/Heading>>\n\n<<lingo TiddlySpot/Description>>\n\n|<<lingo TiddlySpot/UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Password>> |<$password name=\"upload\"/> |\n|<<lingo TiddlySpot/Backups>> |<<backupLink>> |\n\n''<<lingo TiddlySpot/Advanced/Heading>>''\n\n|<<lingo TiddlySpot/ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo TiddlySpot/UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo TiddlySpot/BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n\n"
},
"$:/core/ui/ControlPanel/Settings/AutoSave": {
"title": "$:/core/ui/ControlPanel/Settings/AutoSave",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/AutoSave/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/AutoSave/\n\n<$link to=\"$:/config/AutoSave\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search{$(searchTiddler)$}]\"/>\"\"\">\n\n{{$:/language/Search/Matches}}\n\n</$set>\n\n//<small>Title matches:</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>All matches:</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n<$list filter=\"[is[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[is[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"no\"><<lingo Preview/Button/Hide>></$button>\n\n<div class=\"tc-tiddler-preview\">\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude />\n\n</div>\n\n<div class=\"tc-tiddler-preview-edit\">\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"yes\"><<lingo Preview/Button/Show>></$button>\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define new-field(name,value)\n<$reveal type=\"nomatch\" text=\"\" default=\"\"\"$name$\"\"\">\n<$button>\n<$action-sendmessage $message=\"tm-add-field\" $name$=\"\"\"$value$\"\"\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=\"\"\"$name$\"\"\">\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n\\end\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=\"$:/temp/newfieldname\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-value\">\n<$edit-text tiddler=\"$:/temp/newfieldvalue\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\" name={{$:/temp/newfieldname}} value={{$:/temp/newfieldvalue}}/>\n</span>\n</div>\n</$fieldmangler>\n\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$list>\n"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\"><$set name=\"backgroundColor\" value={{!!color}}><span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">×</$button></span>\n</$set>\n</$list>\n\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$edit-text tiddler=\"$:/temp/NewTagName\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$button message=\"tm-add-tag\" param={{$:/temp/NewTagName}} set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<lingo Tags/Add/Button>>\n</$button>\n</span>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$linkcatcher set=\"$:/temp/NewTagName\" setTo=\"\" message=\"tm-add-tag\">\n<$list filter=\"[tags[]search:title{$:/temp/NewTagName}sort[]]\">\n{{||$:/core/ui/Components/tag-link}}\n</$list>\n<hr>\n<$list filter=\"[!is[system]search:title{$:/temp/NewTagName}sort[]]\">\n{{||$:/core/ui/Components/tag-link}}\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n</$fieldmangler>\n</div>"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\"/>"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-popup-handle\"/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$\n\\end\n<div class=<<frame-classes>>>\n<$set name=\"storyTiddler\" value=<<currentTiddler>>>\n<$keyboard key=\"escape\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"ctrl+enter\" message=\"tm-save-tiddler\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</$keyboard>\n</$keyboard>\n</$set>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "<$button message=\"tm-save-tiddler\" tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n<table>\n<tbody>\n<tr>\n<th>\n<<lingo Listing/Select/Caption>>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>>>\n<$transclude subtiddler=<<payloadTiddler>> mode=\"block\"/>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</div>"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter=\"[!is[system]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter=\"[has[draft.of]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter=\"[all[missing]sort[title]]\" template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter=\"[all[orphans]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter=\"[all[shadows]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter=\"[is[system]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/> <small class=\"tc-menu-list-count\"><$count filter=\"[all[current]tagging[]]\"/></small>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}} <small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter=\"[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down tc-drop-down-language-chooser\">\n<$linkcatcher to=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$link>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/language\" text=<<currentTiddler>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/language\" text=<<currentTiddler>>>\n \n</$reveal>\n</span>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=\"$(journalTags)$\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<<journalButton>>\n</$set></$set>"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "<$button message=\"tm-new-tiddler\" tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button message=\"tm-save-wiki\" param={{$:/config/SaveWikiButton/Template}} tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/view\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$link to=<<storyview>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/view\" text=<<storyview>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/view\" text=<<storyview>>>\n \n</$reveal>\n</span>\n<$transclude tiddler=<<icon>>/>\n<$text text=<<storyview>>/></$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\" variable=\"themeTitle\">\n<$link to=<<themeTitle>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/theme\" text=<<themeTitle>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/theme\" text=<<themeTitle>>>\n \n</$reveal>\n</span>\n<$view tiddler=<<themeTitle>> field=\"name\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$reveal>\n</$list>\n</div>\n\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$importvariables>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\">\n\n<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n\n<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n\n{{||$:/core/ui/PageTemplate/pagecontrols}}\n\n<$transclude tiddler=\"$:/core/ui/SideBarLists\" mode=\"inline\"/>\n\n</$reveal>\n\n</div>\n\n</$scrollable>"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template=\"$:/core/ui/ViewTemplate\" editTemplate=\"$:/core/ui/EditTemplate\" storyview={{$:/view}} />\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\define containerClasses()\ntc-page-container tc-page-view-$(themeTitle)$ tc-language-$(languageTitle)$\n\\end\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=\"\">\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$dropzone>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$importvariables>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\nNo ''\"<$text text=<<currentTab>>/>\"'' found\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Tags\" \"$:/state/tab/moresidebar\" \"tc-vertical\">>\n</div>\n"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\define lingo-base() $:/language/CloseAll/\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" storyview=\"pop\">\n\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">×</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\n\n</$list>\n\n<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<div class=\"tc-sidebar-lists\">\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus=\"true\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n{{$:/core/ui/SearchResults}}\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" \"$:/core/ui/SideBar/Open\" \"$:/state/tab/sidebar\">>\n\n</$reveal>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/icon/$title$\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/icon/$title$\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$title$!!icon\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define qualifyTitle(title)\n$title$$(currentTiddler)$\n\\end\n\\define toggleButton(state)\n<$reveal state=\"$state$\" type=\"match\" text=\"closed\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$state$\" type=\"match\" text=\"open\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td><$transclude tiddler=\"$:/core/ui/TagTemplate\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state=<<qualifyTitle \"$:/state/tag-manager/\">> /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td>\n<$reveal state=<<qualifyTitle \"$:/state/tag-manager/\">> type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n<td></td>\n<td></td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB)\n<$set name=\"foregroundColor\" value=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">>>\n<$set name=\"backgroundColor\" value=\"\"\"$colour$\"\"\">\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-tag-label\" style=<<tag-styles>>>\n<$transclude tiddler={{!!icon}}/> <$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\"><div class=\"tc-drop-down\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]tagging[]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</$set>\n</$set>\n\\end\n\n\\define tag-body(colour,palette)\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>\n</span>\n\\end\n\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}}/>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-tiddler-body\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n{{||$:/core/ui/ImportListing}}\n\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n\n{{||$:/core/ui/TiddlerInfo/Advanced/PluginInfo}}\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"relativedate\"/>\n</div>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list>\n</span>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}/>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo\"/>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-view-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ $(tiddlerTagClasses)$\n\\end\n<$set name=\"storyTiddler\" value=<<currentTiddler>>><$set name=\"tiddlerInfoState\" value=<<qualify \"$:/state/popup/tiddler-info\">>><$tiddler tiddler=<<currentTiddler>>><div class=<<frame-classes>>><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$tiddler></$set></$set>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Clone/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseOthers/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Close/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Edit/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Info/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>>/>\n</$reveal>\n</$list>\n</$set>\n</$set>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\define newHereButtonTags()\n[[$(currentTiddler)$]]\n\\end\n\\define newHereButton()\n<$button tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<newHereButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournalHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set></$set></$set>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permalink/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permaview/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#ff0"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state]] -[prefix[$:/temp]]"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]]"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch(colour)\n<$set name=\"swatchColour\" value={{##$colour$}}>\n<div class=\"tc-swatch\" style=<<swatchStyle>>/>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\">\n<<swatch foreground>>\n<<swatch background>>\n<<swatch muted-foreground>>\n<<swatch primary>>\n<<swatch page-background>>\n<<swatch tab-background>>\n<<swatch tiddler-info-background>>\n</div>\n"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "{{$:/language/ControlPanel/Basics/Language/Prompt}} <$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"/></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\")\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\">\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n<$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$button>\n</$list>\n</div><div class=\"tc-tab-divider $class$\"/><div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/timeline": {
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"title": "$:/core/macros/timeline",
"type": "text/vnd.tiddlywiki",
"text": "\\define timeline-title()\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday{!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}>\n<<timeline-title>>\n</$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$set>\n\\end\n\n\\define toc-body(rootTag,tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc\">\n<$list filter=\"\"\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\"\"\">\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n<<toc-caption>>\n</$list>\n<$list filter=\"\"\"[all[current]] -[[$rootTag$]]\"\"\">\n<$macrocall $name=\"toc-body\" rootTag=\"\"\"$rootTag$\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$list>\n</li>\n</$set>\n</$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter)\n<<toc-body rootTag:\"\"\"$tag$\"\"\" tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<<toc-linked-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</$list>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n</$list>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"\"\"toc-selective-expandable\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-selective-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=\"<<toc-linked-selective-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-selective-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"$itemClassFilter$\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-tabbed-selected-item-filter(selectedTiddler)\n[all[current]field:title{$selectedTiddler$}]\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{$selectedTiddler$}}>\n<div class=\"tc-tabbed-table-of-contents\">\n<$linkcatcher to=\"$selectedTiddler$\">\n<div class=\"tc-table-of-contents\">\n<$macrocall $name=\"toc-selective-expandable\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" itemClassFilter=<<toc-tabbed-selected-item-filter selectedTiddler:\"\"\"$selectedTiddler$\"\"\">>/>\n</div>\n</$linkcatcher>\n<div class=\"tc-tabbed-table-of-contents-content\">\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"nomatch\" text=\"\">\n<$transclude mode=\"block\" tiddler=\"$template$\">\n<h1><<toc-caption>></h1>\n<$transclude mode=\"block\">$missingText$</$transclude>\n</$transclude>\n</$reveal>\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"match\" text=\"\">\n$unselectedText$\n</$reveal>\n</div>\n</div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=\"\"\"$selectedTiddler$\"\"\">\n<$macrocall $name=\"toc-tabbed-external-nav\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" selectedTiddler=\"\"\"$selectedTiddler$\"\"\" unselectedText=\"\"\"$unselectedText$\"\"\" missingText=\"\"\"$missingText$\"\"\" template=\"\"\"$template$\"\"\"/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n{{$:/language/Docs/PaletteColours/$colour$}}\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<table>\n<tbody>\n<$list filter=\"[all[current]indexes[]]\" variable=\"colourName\">\n<tr>\n<td>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<$edit-text index=<<colourName>> tag=\"input\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n</$set>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n<$transclude tiddler=\"$:/snippets/currpalettepreview\"/>\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n<<lingo Prompt>> <$view tiddler={{$:/palette}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[description]]\"><div class=\"tc-chooser-item\"><$link to={{!!title}}><div><$reveal state=\"$:/palette\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/palette\" type=\"nomatch\" text={{!!title}}> </$reveal> ''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/></div><$transclude tiddler=\"$:/snippets/currpalettepreview\"/></$link></div>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]] [[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]]",
"text": ""
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$view tiddler={{$:/theme}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\"><div><$reveal state=\"$:/theme\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/theme\" type=\"nomatch\" text={{!!title}}> </$reveal> <$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$list>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"type": "text/vnd.tiddlywiki",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/StoryView/\n<<lingo Prompt>> <$select tiddler=\"$:/view\">\n<$list filter=\"[storyviews[]]\">\n<option><$view field=\"title\"/></option>\n</$list>\n</$select>"
}
}
}
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAC4a4FQuGt40KhbjRC4a47wuGuO8LhrjRC4a4jAuGuBUAAAAA
AAAAAAAAAAAAAAAAAAAAAEOSrgAAAAAAC4a4jguGuP8Lhrj/C4a4/wuGuP8Lhrj/C4a4/wuGuP8L
hrj/C4a4jgAAAABIjKEAAAAAAAAAAAAAAAAADYa3uguGuP8Lhrj/C4a4/wuGuP8Lhrj/C4a4/giE
t/8DgrX/BIK2/wqFt/8Nhre5AAAAAAAAAAAAAAAADYa3kAuGuP8Lhrj/C4a4/wuGuP8Lhrj/C4a4
/yyWweSu1ubl2Ovz6srl7+6SyN/nEom69QuGuI4AAAAAC4a3FQqFuP8Lhrj/C4a4/wuGuP8Lhrj/
C4a4/wB/tP/////s/v7+/////////////////7vd694IhLf/C4a4FQyGt44Lhrj/C4a4/wuGuP8L
hrj/C4a4/wuGuP8Lhrj/I5G+75LJ3+nD4e3au93r5H6+2eILhbf4C4a4/guGuIwKhbjRC4a4/wuG
uP8Lhrj/C4a4/wuGuP8Lhrj/C4a4/wuGuP4Khbf/B4S2/waEtv8Lhrj/C4a4/wuGuP8LhrjRC4a3
7wuGuP8Lhrj/C4a4/wuGuP8Lhrj/C4a4/gaEtv8Egrb/C4a4/wuGuP8Lhrj/C4a4/wuGuP8Lhrj/
C4a47wyGt/ALhrj/C4a4/wuGuP8Lhrj/C4a4/hOMvfjG7PvL2Oz05jucxOsKhbj/C4a4/wuGuP8L
hrj/C4a4/wuGuO8KhbjQC4a4/wuGuP8Lhrj/C4a4/wqGuf8FOE3MAAAA/8fHx97////wAH+0+AmE
t/9DqNDagMHc9gOCtvcKhbjRDYe4kQuGuP8Lhrj/C4a4/wuGuP8Lh7n/BCs7zQAAAP+0tLTZ////
+QB+s+0LjMHwAAAA6K6trd2KxNviDYa2kQ+GthUKhbj/C4a4/wuGuP8Lhrj/C4a4/iuax+nz8O/N
/////3W61uIJhbf/CIe7/GFiYsL68/DsXK7P7guGtxYAAAAADoa2lgqFuP8Lhrj/C4a4/wuGuP8L
hrj/AIC0+QB+s+wJhbf/C4a4/wuGuP4KhbfyGIy75QeDtZMAAAAAAAAAAAAAAAAPhrbACoW4/wuG
uP8Lhrj/C4a4/wuGuP8Lhrj/C4a4/wuGuP8Lhrj/Coa4/w6Gtr8AAAAAAAAAAAAAAAAvjrEAAAAA
AA6GtpYLhrj/C4a4/wuGuP8Lhrj/C4a4/wuGuP8Lhrj/C4a4/wuGt5QAAAAAMImqAAAAAAAAAAAA
AAAAAAAAAAAAAAAAC4a4FQuGt40KhbjRC4a37wuGt+8KhrjRC4a4jAuGuBUAAAAAAAAAAAAAAAAA
AAAA+B8AAOAHAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMAD
AADgBwAA+B8AAA==
{
"tiddlers": {
"$:/plugins/rboue/SocialCalc/Languages/en-GB": {
"type": "application/json",
"title": "$:/plugins/rboue/SocialCalc/Languages/en-GB",
"text": "{\n\"\":\"Translation process :\",\n\"\":\" . Translate all messages.\",\n\"\":\" . Add tiddler to your TiddlyWiki with the title :\",\n\"\":\" $:/plugins/<not sure>/SocialCalc/Languages/<your language>\",\n\"\":\" <your language> must match with the $:/language tiddler.\",\n\"\":\" Exemple : fr-FR for French.\",\n\n\"\":\"Common error messages\",\n \"s_BrowserNotSupported\": \"Browser not supported.\",\n \"s_InternalError\": \"Internal SocialCalc error (probably an internal bug): \",\n\n\"\":\"Errors thrown on unexpected value in save file\",\n \"s_pssUnknownColType\": \"Unknown col type item\",\n \"s_pssUnknownRowType\": \"Unknown row type item\",\n \"s_pssUnknownLineType\": \"Unknown line type\",\n\n\"\":\"Error thrown on unexpected cell type\",\n \"s_cfspUnknownCellType\": \"Unknown cell type item\",\n\n\"\":\"ExecuteSheetCommand\",\n \"s_escUnknownSheetCmd\": \"Unknown sheet command: \",\n \"s_escUnknownSetCoordCmd\": \"Unknown set coord command: \",\n \"s_escUnknownCmd\": \"Unknown command: \",\n\n\"\":\"SocialCalc.CheckAndCalcCell\",\n \"s_caccCircRef\": \"Circular reference to \",\n\n\"\":\"SocialCalc.RenderContext\",\n \"s_rcMissingSheet\": \"Render Context must have a sheet object\",\n\n\"\":\"SocialCalc.EditorGetStatuslineString -- strings shown on status line\",\n \"s_statusline_executing\": \"Executing...\",\n \"s_statusline_displaying\": \"Displaying...\",\n \"s_statusline_ordering\": \"Ordering...\",\n \"s_statusline_calculating\": \"Calculating...\",\n \"s_statusline_calculatingls\": \"Calculating... Loading Sheet...\",\n \"s_statusline_doingserverfunc\": \"doing server function \",\n \"s_statusline_incell\": \" in cell \",\n \"s_statusline_calcstart\": \"Calculation start...\",\n \"s_statusline_sum\": \"SUM\",\n \"s_statusline_recalcneeded\": \"<span style=\\\"color:#999;\\\">(Recalc needed)</span>\",\n \"s_statusline_circref\": \"<span style=\\\"color:red;\\\">Circular reference: \",\n\n\"\":\"SocialCalc.InputBoxDisplayCellContents\",\n \"s_inputboxdisplaymultilinetext\": \"[Multi-line text: Click icon on right to edit]\",\n \"ietUnknownFunction\": \"Unknown function \", \"\":\"displayed when typing \\\"=unknown(\",\n \"s_CHfillAllTooltip\": \"Fill Contents and Formats Down/Right\", \"\":\"tooltip for fill all handle\",\n \"s_CHfillContentsTooltip\": \"Fill Contents Only Down/Right\", \"\":\"tooltip for fill formulas handle\",\n \"s_CHmovePasteAllTooltip\": \"Move Contents and Formats\", \"\":\"etc.\",\n \"s_CHmovePasteContentsTooltip\": \"Move Contents Only\",\n \"s_CHmoveInsertAllTooltip\": \"Slide Contents and Formats within Row/Col\",\n \"s_CHmoveInsertContentsTooltip\": \"Slide Contents within Row/Col\",\n \"s_CHindicatorOperationLookup\": {\n \"Fill\": \"Fill\", \"FillC\": \"Fill Contents\",\n \"Move\": \"Move\", \"MoveI\": \"Slide\", \n \"MoveC\": \"Move Contents\", \"MoveIC\": \"Slide Contents\"\n },\n \"s_CHindicatorDirectionLookup\": {\n \"Down\": \" Down\", \"Right\": \" Right\",\n \"Horizontal\": \" Horizontal\", \"Vertical\": \" Vertical\"\n },\n\n\"\":\"Constants for default Format tab (settings)\",\n\"\":\"\",\n\"\":\"*** EVEN THOUGH THESE DON'T START WITH s_: ***\",\n\"\":\"\",\n\"\":\"These should be carefully checked for localization. Make sure you understand what they do and how they work!\",\n\"\":\"The first part of \\\"first:second|first:second|...\\\" is what is displayed and the second is the value to be used.\",\n\"\":\"The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated --\",\n\"\":\"they are commands to SocialCalc.SettingsControls.PopupListInitialize\",\n\n \"SCFormatNumberFormats\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|[break]:|1\\\\c23:h:mm|1\\\\c23 PM:h:mm AM/PM|1\\\\c23\\\\c45:h:mm:ss|01\\\\c23\\\\c45:hh:mm:ss|26\\\\c23 (h\\\\cm):[hh]:mm|69\\\\c45 (m\\\\cs):[mm]:ss|69 (s):[ss]|[newcol]:|2006-01-04 01\\\\c23\\\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|\",\n \"SCFormatTextFormats\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|\",\n \"SCFormatPadsizes\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|\",\n \"SCFormatFontsizes\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|\",\n \"SCFormatFontfamilies\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|\",\n \"SCFormatFontlook\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|%loc!Bold Italic!:italic bold\",\n \"SCFormatTextAlignhoriz\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|\",\n \"SCFormatNumberAlignhoriz\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|\",\n \"SCFormatAlignVertical\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|\",\n \"SCFormatColwidth\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|\",\n \"SCFormatRecalc\": \"[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|\",\n \"SCFormatUserMaxCol\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|Unlimited:0|10:10|20:20|30:30|40:40|50:50|60:60|80:80|100:100|\",\n \"SCFormatUserMaxRow\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|Unlimited:0|10:10|20:20|30:30|40:40|50:50|60:60|80:80|100:100|\",\n\n\"\":\"SocialCalc.SettingsControls.PopupListInitialize\",\n \"s_PopupListCancel\": \"[Cancel]\",\n \"s_PopupListCustom\": \"Custom\",\n\n\"\":\"***\",\n\"\":\"\",\n\"\":\"s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings\",\n\"\":\"\",\n\"\":\"Used extensively by socialcalcspreadsheetcontrol.js\",\n\"\":\"\",\n\"\":\"***\",\n \"s_loc_align_center\": \"Align Center\",\n \"s_loc_align_left\": \"Align Left\",\n \"s_loc_align_right\": \"Align Right\",\n \"s_loc_alignment\": \"Alignment\",\n \"s_loc_audit\": \"Audit\",\n \"s_loc_audit_trail_this_session\": \"Audit Trail This Session\",\n \"s_loc_auto\": \"Auto\",\n \"s_loc_auto_sum\": \"Auto Sum\",\n \"s_loc_auto_wX_commas\": \"Auto w/ commas\",\n \"s_loc_automatic\": \"Automatic\",\n \"s_loc_background\": \"Background\",\n \"s_loc_bold\": \"Bold\",\n \"s_loc_bold_XampX_italics\": \"Bold & Italics\",\n \"s_loc_bold_italic\": \"Bold Italic\",\n \"s_loc_borders\": \"Borders\",\n \"s_loc_borders_off\": \"Borders Off\",\n \"s_loc_borders_on\": \"Borders On\",\n \"s_loc_bottom\": \"Bottom\",\n \"s_loc_bottom_border\": \"Bottom Border\",\n \"s_loc_cell_settings\": \"CELL SETTINGS\",\n \"s_loc_csv_format\": \"CSV format\",\n \"s_loc_cancel\": \"Cancel\",\n \"s_loc_category\": \"Category\",\n \"s_loc_center\": \"Center\",\n \"s_loc_clear\": \"Clear\",\n \"s_loc_clear_socialcalc_clipboard\": \"Clear SocialCalc Clipboard\",\n \"s_loc_clipboard\": \"Clipboard\",\n \"s_loc_color\": \"Color\",\n \"s_loc_column_\": \"Column \",\n \"s_loc_comment\": \"Comment\",\n \"s_loc_copy\": \"Copy\",\n \"s_loc_custom\": \"Custom\",\n \"s_loc_cut\": \"Cut\",\n \"s_loc_default\": \"Default\",\n \"s_loc_default_alignment\": \"Default Alignment\",\n \"s_loc_default_column_width\": \"Default Column Width\",\n \"s_loc_default_font\": \"Default Font\",\n \"s_loc_default_format\": \"Default Format\",\n \"s_loc_default_padding\": \"Default Padding\",\n \"s_loc_delete\": \"Delete\",\n \"s_loc_delete_column\": \"Delete Column\",\n \"s_loc_delete_contents\": \"Delete Contents\",\n \"s_loc_delete_row\": \"Delete Row\",\n \"s_loc_description\": \"Description\",\n \"s_loc_display_clipboard_in\": \"Display Clipboard in\",\n \"s_loc_down\": \"Down\",\n \"s_loc_edit\": \"Edit\",\n \"s_loc_existing_names\": \"Existing Names\",\n \"s_loc_family\": \"Family\",\n \"s_loc_fill_down\": \"Fill Down\",\n \"s_loc_fill_right\": \"Fill Right\",\n \"s_loc_font\": \"Font\",\n \"s_loc_format\": \"Format\",\n \"s_loc_formula\": \"Formula\",\n \"s_loc_function_list\": \"Function List\",\n \"s_loc_functions\": \"Functions\",\n \"s_loc_grid\": \"Grid\",\n \"s_loc_hidden\": \"Hidden\",\n \"s_loc_hide_column\": \"Hide Column\",\n \"s_loc_hide_row\": \"Hide Row\",\n \"s_loc_horizontal\": \"Horizontal\",\n \"s_loc_insert_column\": \"Insert Column\",\n \"s_loc_insert_row\": \"Insert Row\",\n \"s_loc_italic\": \"Italic\",\n \"s_loc_last_sort\": \"Last Sort\",\n \"s_loc_left\": \"Left\",\n \"s_loc_left_border\": \"Left Border\",\n \"s_loc_link\": \"Link\",\n \"s_loc_link_input_box\": \"Link Input Box\",\n \"s_loc_list\": \"List\",\n \"s_loc_load_socialcalc_clipboard_with_this\": \"Load SocialCalc Clipboard With This\",\n \"s_loc_lock\": \"Lock\",\n \"s_loc_major_sort\": \"Major Sort\",\n \"s_loc_manual\": \"Manual\",\n \"s_loc_merge_cells\": \"Merge Cells\",\n \"s_loc_middle\": \"Middle\",\n \"s_loc_minor_sort\": \"Minor Sort\",\n \"s_loc_move_insert\": \"Move Insert\",\n \"s_loc_move_paste\": \"Move Paste\",\n \"s_loc_multiXline_input_box\": \"Multi-line Input Box\",\n \"s_loc_name\": \"Name\",\n \"s_loc_names\": \"Names\",\n \"s_loc_no_padding\": \"No padding\",\n \"s_loc_normal\": \"Normal\",\n \"s_loc_number\": \"Number\",\n \"s_loc_number_horizontal\": \"Number Horizontal\",\n \"s_loc_ok\": \"OK\",\n \"s_loc_padding\": \"Padding\",\n \"s_loc_page_name\": \"Page Name\",\n \"s_loc_paste\": \"Paste\",\n \"s_loc_paste_formats\": \"Paste Formats\",\n \"s_loc_plain_text\": \"Plain Text\",\n \"s_loc_recalc\": \"Recalc\",\n \"s_loc_recalculation\": \"Recalculation\",\n \"s_loc_redo\": \"Redo\",\n \"s_loc_right\": \"Right\",\n \"s_loc_right_border\": \"Right Border\",\n \"s_loc_sheet_settings\": \"SHEET SETTINGS\",\n \"s_loc_save\": \"Save\",\n \"s_loc_save_to\": \"Save to\",\n \"s_loc_set_cell_contents\": \"Set Cell Contents\",\n \"s_loc_set_cells_to_sort\": \"Set Cells To Sort\",\n \"s_loc_set_value_to\": \"Set Value To\",\n \"s_loc_set_to_link_format\": \"Set to Link format\",\n \"s_loc_setXclear_move_from\": \"Set/Clear Move From\",\n \"s_loc_show_cell_settings\": \"Show Cell Settings\",\n \"s_loc_show_sheet_settings\": \"Show Sheet Settings\",\n \"s_loc_show_in_new_browser_window\": \"Show in new browser window\",\n \"s_loc_size\": \"Size\",\n \"s_loc_socialcalcXsave_format\": \"SocialCalc-save format\",\n \"s_loc_sort\": \"Sort\",\n \"s_loc_sort_\": \"Sort \",\n \"s_loc_sort_cells\": \"Sort Cells\",\n \"s_loc_swap_colors\": \"Swap Colors\",\n \"s_loc_tabXdelimited_format\": \"Tab-delimited format\",\n \"s_loc_text\": \"Text\",\n \"s_loc_text_horizontal\": \"Text Horizontal\",\n \"s_loc_this_is_aXbrXsample\": \"This is a<br>sample\",\n \"s_loc_top\": \"Top\",\n \"s_loc_top_border\": \"Top Border\",\n \"s_loc_undone_steps\": \"UNDONE STEPS\",\n \"s_loc_url\": \"URL\",\n \"s_loc_undo\": \"Undo\",\n \"s_loc_unlock\": \"Unlock\",\n \"s_loc_unmerge_cells\": \"Unmerge Cells\",\n \"s_loc_up\": \"Up\",\n \"s_loc_value\": \"Value\",\n \"s_loc_vertical\": \"Vertical\",\n \"s_loc_wikitext\": \"Wikitext\",\n \"s_loc_workspace\": \"Workspace\",\n \"s_loc_XnewX\": \"[New]\",\n \"s_loc_XnoneX\": \"[None]\",\n \"s_loc_Xselect_rangeX\": \"[select range]\",\n\n\"\":\"The following constants are arrays of strings with the short (3 character) and full names of days and months\",\n \"s_FormatNumber_daynames\": [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n \"s_FormatNumber_daynames3\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n \"s_FormatNumber_monthnames\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\",\n \"October\", \"November\", \"December\"],\n \"s_FormatNumber_monthnames3\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n \"s_FormatNumber_am\": \"AM\",\n \"s_FormatNumber_am1\": \"A\",\n \"s_FormatNumber_pm\": \"PM\",\n \"s_FormatNumber_pm1\": \"P\",\n\n\"\":\"\",\n\"\":\"SocialCalc Spreadsheet Formula module, formula1.js:\",\n\"\":\"\",\n \"s_parseerrexponent\": \"Improperly formed number exponent\",\n \"s_parseerrchar\": \"Unexpected character in formula\",\n \"s_parseerrstring\": \"Improperly formed string\",\n \"s_parseerrspecialvalue\": \"Improperly formed special value\",\n \"s_parseerrtwoops\": \"Error in formula (two operators inappropriately in a row)\",\n \"s_parseerrmissingopenparen\": \"Missing open parenthesis in list with comma(s). \",\n \"s_parseerrcloseparennoopen\": \"Closing parenthesis without open parenthesis. \",\n \"s_parseerrmissingcloseparen\": \"Missing close parenthesis. \",\n \"s_parseerrmissingoperand\": \"Missing operand. \",\n \"s_parseerrerrorinformula\": \"Error in formula.\",\n \"s_calcerrerrorvalueinformula\": \"Error value in formula\",\n \"s_parseerrerrorinformulabadval\": \"Error in formula resulting in bad value\",\n \"s_formularangeresult\": \"Formula results in range value:\",\n \"s_calcerrnumericnan\": \"Formula results in an bad numeric value\",\n \"s_calcerrnumericoverflow\": \"Numeric overflow\",\n \"s_sheetunavailable\": \"Sheet unavailable:\", \"\":\"when FindSheetInCache returns null\",\n \"s_calcerrcellrefmissing\": \"Cell reference missing when expected.\",\n \"s_calcerrsheetnamemissing\": \"Sheet name missing when expected.\",\n \"s_circularnameref\": \"Circular name reference to name\",\n \"s_calcerrunknownname\": \"Unknown name\",\n \"s_calcerrincorrectargstofunction\": \"Incorrect arguments to function\",\n \"s_sheetfuncunknownfunction\": \"Unknown function\",\n \"s_sheetfunclnarg\": \"LN argument must be greater than 0\",\n \"s_sheetfunclog10arg\": \"LOG10 argument must be greater than 0\",\n \"s_sheetfunclogsecondarg\": \"LOG second argument must be numeric greater than 0\",\n \"s_sheetfunclogfirstarg\": \"LOG first argument must be greater than 0\",\n \"s_sheetfuncroundsecondarg\": \"ROUND second argument must be numeric\",\n \"s_sheetfuncddblife\": \"DDB life must be greater than 1\",\n \"s_sheetfuncslnlife\": \"SLN life must be greater than 1\",\n\n\"\":\"Function definition text\",\n \"s_fdef_ABS\": \"Absolute value function. \",\n \"s_fdef_ACOS\": \"Trigonometric arccosine function. \",\n \"s_fdef_AND\": \"True if all arguments are true. \",\n \"s_fdef_ASIN\": \"Trigonometric arcsine function. \",\n \"s_fdef_ATAN\": \"Trigonometric arctan function. \",\n \"s_fdef_ATAN2\": \"Trigonometric arc tangent function (result is in radians). \",\n \"s_fdef_AVERAGE\": \"Averages the values. \",\n \"s_fdef_CHOOSE\": \"Returns the value specified by the index. The values may be ranges of cells. \",\n \"s_fdef_COLUMNS\": \"Returns the number of columns in the range. \",\n \"s_fdef_COS\": \"Trigonometric cosine function (value is in radians). \",\n \"s_fdef_COUNT\": \"Counts the number of numeric values, not blank, text, or error. \",\n \"s_fdef_COUNTA\": \"Counts the number of non-blank values. \",\n \"s_fdef_COUNTBLANK\": \"Counts the number of blank values. (Note: \\\"\\\" is not blank.) \",\n \"s_fdef_COUNTIF\": \"Counts the number of number of cells in the range that meet the criteria. The criteria may be a value (\\\"x\\\", 15, 1+3) or a test (>25). \",\n \"s_fdef_DATE\": \"Returns the appropriate date value given numbers for year, month, and day. For example: DATE(2006,2,1) for February 1, 2006. Note: In this program, day \\\"1\\\" is December 31, 1899 and the year 1900 is not a leap year. Some programs use January 1, 1900, as day \\\"1\\\" and treat 1900 as a leap year. In both cases, though, dates on or after March 1, 1900, are the same. \",\n \"s_fdef_DAVERAGE\": \"Averages the values in the specified field in records that meet the criteria. \",\n \"s_fdef_DAY\": \"Returns the day of month for a date value. \",\n \"s_fdef_DCOUNT\": \"Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. \",\n \"s_fdef_DCOUNTA\": \"Counts the number of non-blank values in the specified field in records that meet the criteria. \",\n \"s_fdef_DDB\": \"Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). \",\n \"s_fdef_DEGREES\": \"Converts value in radians into degrees. \",\n \"s_fdef_DGET\": \"Returns the value of the specified field in the single record that meets the criteria. \",\n \"s_fdef_DMAX\": \"Returns the maximum of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DMIN\": \"Returns the maximum of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DPRODUCT\": \"Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DSTDEV\": \"Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DSTDEVP\": \"Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DSUM\": \"Returns the sum of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DVAR\": \"Returns the sample variance of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_DVARP\": \"Returns the variance of the numeric values in the specified field in records that meet the criteria. \",\n \"s_fdef_EVEN\": \"Rounds the value up in magnitude to the nearest even integer. \",\n \"s_fdef_EXACT\": \"Returns \\\"true\\\" if the values are exactly the same, including case, type, etc. \",\n \"s_fdef_EXP\": \"Returns e raised to the value power. \",\n \"s_fdef_FACT\": \"Returns factorial of the value. \",\n \"s_fdef_FALSE\": \"Returns the logical value \\\"false\\\". \",\n \"s_fdef_FIND\": \"Returns the starting position within string2 of the first occurrence of string1 at or after \\\"start\\\". If start is omitted, 1 is assumed. \",\n \"s_fdef_FV\": \"Returns the future value of repeated payments of money invested at the given rate for the specified number of periods, with optional present value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). \",\n \"s_fdef_HLOOKUP\": \"Look for the matching value for the given value in the range and return the corresponding value in the cell specified by the row offset. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match. \",\n \"s_fdef_HOUR\": \"Returns the hour portion of a time or date/time value. \",\n \"s_fdef_IF\": \"Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. \",\n \"s_fdef_INDEX\": \"Returns a cell or range reference for the specified row and column in the range. If range is 1-dimensional, then only one of rownum or colnum are needed. If range is 2-dimensional and rownum or colnum are zero, a reference to the range of just the specified column or row is returned. You can use the returned reference value in a range, e.g., sum(A1:INDEX(A2:A10,4)). \",\n \"s_fdef_INT\": \"Returns the value rounded down to the nearest integer (towards -infinity). \",\n \"s_fdef_IRR\": \"Returns the interest rate at which the cash flows in the range have a net present value of zero. Uses an iterative process that will return #NUM! error if it does not converge. There may be more than one possible solution. Providing the optional guess value may help in certain situations where it does not converge or finds an inappropriate solution (the default guess is 10%). \",\n \"s_fdef_ISBLANK\": \"Returns \\\"true\\\" if the value is a reference to a blank cell. \",\n \"s_fdef_ISERR\": \"Returns \\\"true\\\" if the value is of type \\\"Error\\\" but not \\\"NA\\\". \",\n \"s_fdef_ISERROR\": \"Returns \\\"true\\\" if the value is of type \\\"Error\\\". \",\n \"s_fdef_ISLOGICAL\": \"Returns \\\"true\\\" if the value is of type \\\"Logical\\\" (true/false). \",\n \"s_fdef_ISNA\": \"Returns \\\"true\\\" if the value is the error type \\\"NA\\\". \",\n \"s_fdef_ISNONTEXT\": \"Returns \\\"true\\\" if the value is not of type \\\"Text\\\". \",\n \"s_fdef_ISNUMBER\": \"Returns \\\"true\\\" if the value is of type \\\"Number\\\" (including logical values). \",\n \"s_fdef_ISTEXT\": \"Returns \\\"true\\\" if the value is of type \\\"Text\\\". \",\n \"s_fdef_LEFT\": \"Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. \",\n \"s_fdef_LEN\": \"Returns the number of characters in the text value. \",\n \"s_fdef_LN\": \"Returns the natural logarithm of the value. \",\n \"s_fdef_LOG\": \"Returns the logarithm of the value using the specified base. \",\n \"s_fdef_LOG10\": \"Returns the base 10 logarithm of the value. \",\n \"s_fdef_LOWER\": \"Returns the text value with all uppercase characters converted to lowercase. \",\n \"s_fdef_MATCH\": \"Look for the matching value for the given value in the range and return position (the first is 1) in that range. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match. If rangelookup is -1, act like 1 but the bracket is match>=value. \",\n \"s_fdef_MAX\": \"Returns the maximum of the numeric values. \",\n \"s_fdef_MID\": \"Returns the specified number of characters from the text value starting from the specified position. \",\n \"s_fdef_MIN\": \"Returns the minimum of the numeric values. \",\n \"s_fdef_MINUTE\": \"Returns the minute portion of a time or date/time value. \",\n \"s_fdef_MOD\": \"Returns the remainder of the first value divided by the second. \",\n \"s_fdef_MONTH\": \"Returns the month part of a date value. \",\n \"s_fdef_N\": \"Returns the value if it is a numeric value otherwise an error. \",\n \"s_fdef_NA\": \"Returns the #N/A error value which propagates through most operations. \",\n \"s_fdef_NOT\": \"Returns FALSE if value is true, and TRUE if it is false. \",\n \"s_fdef_NOW\": \"Returns the current date/time. \",\n \"s_fdef_NPER\": \"Returns the number of periods at which payments invested each period at the given rate with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period) has the given present value. \",\n \"s_fdef_NPV\": \"Returns the net present value of cash flows (which may be individual values and/or ranges) at the given rate. The flows are positive if income, negative if paid out, and are assumed at the end of each period. \",\n \"s_fdef_ODD\": \"Rounds the value up in magnitude to the nearest odd integer. \",\n \"s_fdef_OR\": \"True if any argument is true \",\n \"s_fdef_PI\": \"The value 3.1415926... \",\n \"s_fdef_PMT\": \"Returns the amount of each payment that must be invested at the given rate for the specified number of periods to have the specified present value, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). \",\n \"s_fdef_POWER\": \"Returns the first value raised to the second value power. \",\n \"s_fdef_PRODUCT\": \"Returns the result of multiplying the numeric values. \",\n \"s_fdef_PROPER\": \"Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. \",\n \"s_fdef_PV\": \"Returns the present value of the given number of payments each invested at the given rate, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). \",\n \"s_fdef_RADIANS\": \"Converts value in degrees into radians. \",\n \"s_fdef_RATE\": \"Returns the rate at which the given number of payments each invested at the given rate has the specified present value, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). Uses an iterative process that will return #NUM! error if it does not converge. There may be more than one possible solution. Providing the optional guess value may help in certain situations where it does not converge or finds an inappropriate solution (the default guess is 10%). \",\n \"s_fdef_REPLACE\": \"Returns text1 with the specified number of characters starting from the specified position replaced by text2. \",\n \"s_fdef_REPT\": \"Returns the text repeated the specified number of times. \",\n \"s_fdef_RIGHT\": \"Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. \",\n \"s_fdef_ROUND\": \"Rounds the value to the specified number of decimal places. If precision is negative, then round to powers of 10. The default precision is 0 (round to integer). \",\n \"s_fdef_ROWS\": \"Returns the number of rows in the range. \",\n \"s_fdef_SECOND\": \"Returns the second portion of a time or date/time value (truncated to an integer). \",\n \"s_fdef_SIN\": \"Trigonometric sine function (value is in radians) \",\n \"s_fdef_SLN\": \"Returns the amount of depreciation at each period of time using the straight-line method. \",\n \"s_fdef_SQRT\": \"Square root of the value \",\n \"s_fdef_STDEV\": \"Returns the sample standard deviation of the numeric values. \",\n \"s_fdef_STDEVP\": \"Returns the standard deviation of the numeric values. \",\n \"s_fdef_SUBSTITUTE\": \"Returns text1 with the all occurrences of oldtext replaced by newtext. If \\\"occurrence\\\" is present, then only that occurrence is replaced. \",\n \"s_fdef_SUM\": \"Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. \",\n \"s_fdef_SUMIF\": \"Sums the numeric values of cells in the range that meet the criteria. The criteria may be a value (\\\"x\\\", 15, 1+3) or a test (>25). If range2 is present, then range1 is tested and the corresponding range2 value is summed. \",\n \"s_fdef_SYD\": \"Depreciation by Sum of Year\\\"s Digits method. \",\n \"s_fdef_T\": \"Returns the text value or else a null string. \",\n \"s_fdef_TAN\": \"Trigonometric tangent function (value is in radians) \",\n \"s_fdef_TIME\": \"Returns the time value given the specified hour, minute, and second. \",\n \"s_fdef_TODAY\": \"Returns the current date (an integer). Note: In this program, day \\\"1\\\" is December 31, 1899 and the year 1900 is not a leap year. Some programs use January 1, 1900, as day \\\"1\\\" and treat 1900 as a leap year. In both cases, though, dates on or after March 1, 1900, are the same. \",\n \"s_fdef_TRIM\": \"Returns the text value with leading, trailing, and repeated spaces removed. \",\n \"s_fdef_TRUE\": \"Returns the logical value \\\"true\\\". \",\n \"s_fdef_TRUNC\": \"Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. \",\n \"s_fdef_UPPER\": \"Returns the text value with all lowercase characters converted to uppercase. \",\n \"s_fdef_VALUE\": \"Converts the specified text value into a numeric value. Various forms that look like numbers (including digits followed by %, forms that look like dates, etc.) are handled. This may not handle all of the forms accepted by other spreadsheets and may be locale dependent. \",\n \"s_fdef_VAR\": \"Returns the sample variance of the numeric values. \",\n \"s_fdef_VARP\": \"Returns the variance of the numeric values. \",\n \"s_fdef_VLOOKUP\": \"Look for the matching value for the given value in the range and return the corresponding value in the cell specified by the column offset. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match>=value) instead of exact match. \",\n \"s_fdef_WEEKDAY\": \"Returns the day of week specified by the date value. If type is 1 (the default), Sunday is day and Saturday is day 7. If type is 2, Monday is day 1 and Sunday is day 7. If type is 3, Monday is day 0 and Sunday is day 6. \",\n \"s_fdef_YEAR\": \"Returns the year part of a date value. \",\n \"s_fdef_SUMPRODUCT\": \"Sums the pairwise products of 2 or more ranges. The ranges must be of equal length.\",\n \"s_fdef_CEILING\": \"Rounds the given number up to the nearest integer or multiple of significance. Significance is the value to whose multiple of ten the value is to be rounded up (.01, .1, 1, 10, etc.)\",\n \"s_fdef_FLOOR\": \"Rounds the given number down to the nearest multiple of significance. Significance is the value to whose multiple of ten the number is to be rounded down (.01, .1, 1, 10, etc.)\",\n\n \"s_farg_v\": \"value\",\n \"s_farg_vn\": \"value1, value2, ...\",\n \"s_farg_xy\": \"valueX, valueY\",\n \"s_farg_choose\": \"index, value1, value2, ...\",\n \"s_farg_range\": \"range\",\n \"s_farg_rangec\": \"range, criteria\",\n \"s_farg_date\": \"year, month, day\",\n \"s_farg_dfunc\": \"databaserange, fieldname, criteriarange\",\n \"s_farg_ddb\": \"cost, salvage, lifetime, period, [factor]\",\n \"s_farg_find\": \"string1, string2, [start]\",\n \"s_farg_fv\": \"rate, n, payment, [pv, [paytype]]\",\n \"s_farg_hlookup\": \"value, range, row, [rangelookup]\",\n \"s_farg_iffunc\": \"logical-expression, true-value, [false-value]\",\n \"s_farg_index\": \"range, rownum, colnum\",\n \"s_farg_irr\": \"range, [guess]\",\n \"s_farg_tc\": \"text, count\",\n \"s_farg_log\": \"value, base\",\n \"s_farg_match\": \"value, range, [rangelookup]\",\n \"s_farg_mid\": \"text, start, length\",\n \"s_farg_nper\": \"rate, payment, pv, [fv, [paytype]]\",\n \"s_farg_npv\": \"rate, value1, value2, ...\",\n \"s_farg_pmt\": \"rate, n, pv, [fv, [paytype]]\",\n \"s_farg_pv\": \"rate, n, payment, [fv, [paytype]]\",\n \"s_farg_rate\": \"n, payment, pv, [fv, [paytype, [guess]]]\",\n \"s_farg_replace\": \"text1, start, length, text2\",\n \"s_farg_vp\": \"value, [precision]\",\n \"s_farg_valpre\": \"value, precision\",\n \"s_farg_csl\": \"cost, salvage, lifetime\",\n \"s_farg_cslp\": \"cost, salvage, lifetime, period\",\n \"s_farg_subs\": \"text1, oldtext, newtext, [occurrence]\",\n \"s_farg_sumif\": \"range1, criteria, [range2]\",\n \"s_farg_hms\": \"hour, minute, second\",\n \"s_farg_txt\": \"text\",\n \"s_farg_vlookup\": \"value, range, col, [rangelookup]\",\n \"s_farg_weekday\": \"date, [type]\",\n \"s_farg_dt\": \"date\",\n \"s_farg_rangen\": \"range1, range2, ...\",\n \"s_farg_vsig\": \"value, [significance]\",\n\n \"function_classlist\": [\"all\", \"stat\", \"lookup\", \"datetime\", \"financial\", \"test\", \"math\", \"text\"],\n\n \"s_fclass_all\": \"All\",\n \"s_fclass_stat\": \"Statistics\",\n \"s_fclass_lookup\": \"Lookup\",\n \"s_fclass_datetime\": \"Date & Time\",\n \"s_fclass_financial\": \"Financial\",\n \"s_fclass_test\": \"Test\",\n \"s_fclass_math\": \"Math\",\n \"s_fclass_text\": \"Text\",\n\n\"\":\"Graph tab\",\n \"s_loc_plain\": \"Plain\",\n \"s_loc_graph\": \"Graph\",\n \"s_loc_cells_to_graph\": \"Cells to Graph\",\n \"s_loc_set_cells_to_graph\": \"Set Cells To Graph\",\n \"s_loc_graph_type\": \"Graph Type\",\n \"s_loc_help\": \"Help\",\n \"s_loc_horizontal_bar\": \"Horizontal Bar\",\n \"s_loc_vertical_bar\": \"Vertical Bar\",\n \"s_loc_pie_chart\": \"Pie Chart\",\n \"s_loc_line_chart\": \"Line Chart\",\n \"s_loc_scatter_chart\": \"Plot Points\",\n \"s_loc_not_set\": \"Not Set\",\n \"s_loc_unknown_range_name\": \"Unknown range name\",\n \"s_loc_hide_help\": \"Hide Help\",\n \"s_loc_x\": \"X\",\n \"s_loc_y\": \"Y\",\n \"s_loc_max\": \"Max\",\n \"s_loc_min\": \"Min\",\n \"s_loc_Xselect_rangeX\": \"[select range]\",\n \"s_GraphRangeNotSelected\": \"Select a range of cells with numeric values to graph and use the OK button above to set the range as the graph range.\",\n \"s_graph_error_selection\": \"<b>Range selection error</b>.<br>You must select cells in a single row or column !\",\n \"s_graph_help_intro\": \"This is the help text for graph type: \",\n \"s_graph_VerticalBar_help\": \"The <b>Graph</b> tab displays a bar graph of the cells which have been selected (either in a single row across or column down). If the row above (or column to the left) of the selection has values, those values are used as labels. Otherwise the cell coordinates are used (e.g., B5).\",\n \"s_graph_HorizontalBar_help\": \"The <b>Graph</b> tab displays a bar graph of the cells which have been selected (either in a single row across or column down). If the row above (or column to the left) of the selection has values, those values are used as labels. Otherwise the cell coordinates are used (e.g., B5).\",\n \"s_graph_PieChart_help\": \"The <b>Graph</b> tab displays a pie chart of the cells which have been selected (either in a single row across or column down). If the row above (or column to the left) of the selection has values, those values are used as labels. Otherwise the cell coordinates are used (e.g., B5).\",\n \"s_graph_PieChart_error_selection\": \"<b>Selection error</b><br>You must select cells with positive value !\",\n \"s_graph_LineChart_help\": \"The <b>Graph</b> tab displays a XY profile line of the cells which have been selected (either in a single row across or column down). The row above (or column to the left) of the selection is used as X coordinates.\",\n \"s_graph_ScatterChart_help\": \"The <b>Graph</b> tab displays a XY scattered chart of the cells which have been selected (either in a single row across or column down). The row above (or column to the left) of the selection is used as X coordinates. If row below (or column to the right) have values, they are interpreted as plot dimensions.\",\n\n\"\":\"Clipboard tab\",\n \"s_loc_to\": \"to\",\n \"s_loc_tiddler\": \"Tiddler\",\n \"s_loc_import\": \"Import\",\n \"s_loc_export\": \"Export\",\n \"s_loc_XclipboardX\": \"[Clipboard]\",\n \"s_clipboard_menu_title\": \"Import/Export<br>and Clipboard\",\n \"s_clipboard_export_error_tiddler_exists\": \"Tiddler exists\",\n \"s_clipboard_export_error_tiddler_overwrite\": \"Do you want to overwrite it ?\",\n \"s_clipboard_import_error_tiddler_format\": \"Format error: tiddler's format field have incorrect value.\",\n\n\"\":\"Save sheet to tiddler\",\n \"s_loc_save_changes\": \"Save changes\",\n \"s_notification_tiddler\": \"Saved ~SocialCalc sheet\",\n\n\"\":\"End\"\n}\n"
},
"$:/plugins/rboue/SocialCalc/Languages/en-GB--save-notification": {
"title": "$:/plugins/rboue/SocialCalc/Languages/en-GB--save-notification",
"text": "Saved ~SocialCalc sheet\n"
},
"$:/plugins/rboue/SocialCalc/Languages/fr-FR": {
"type": "application/json",
"title": "$:/plugins/rboue/SocialCalc/Languages/fr-FR",
"text": "{\n\"\":\"Origin of this translation : Framasoft (http://framacalc.org)\",\n\n\"\":\"Translation process :\",\n\"\":\" . Translate all messages.\",\n\"\":\" . Add tiddler to your TiddlyWiki with the title :\",\n\"\":\" $:/plugins/<not sure>/SocialCalc/Languages/<your language>\",\n\"\":\" <your language> must match with the $:/language tiddler.\",\n\"\":\" Exemple : fr-FR for French.\",\n\n\"\":\"Common error messages\",\n \"s_BrowserNotSupported\": \"Navigateur non supporté\",\n \"s_InternalError\": \"Erreur interne de SocialCalc (probablement un bug interne) : \",\n\n\"\":\"Errors thrown on unexpected value in save file\",\n \"s_pssUnknownColType\": \"Type de champ de colonne inconnu\",\n \"s_pssUnknownRowType\": \"Type de champ de ligne inconnu\",\n \"s_pssUnknownLineType\": \"Type de ligne inconnu\",\n\n\"\":\"Error thrown on unexpected cell type\",\n \"s_cfspUnknownCellType\": \"Type de champ de cellule inconnu\", \n\n\"\":\"ExecuteSheetCommand\",\n \"s_escUnknownSheetCmd\": \"Commande sur la feuille inconnue : \",\n \"s_escUnknownSetCoordCmd\": \"Commande de saisie des coordonnées inconnue : \",\n \"s_escUnknownCmd\": \"Commande inconnue : \",\n\n\"\":\"SocialCalc.CheckAndCalcCell\",\n \"s_caccCircRef\": \"Référence circulaire à \",\n\n\"\":\"SocialCalc.RenderContext\",\n \"s_rcMissingSheet\": \"Le contexte de rendu doit avoir un objet feuille de calcul\",\n\n\"\":\"SocialCalc.EditorGetStatuslineString -- strings shown on status line\",\n \"s_statusline_executing\": \"En cours d'exécution...\",\n \"s_statusline_displaying\": \"En cours d'affichage...\",\n \"s_statusline_ordering\": \"En cours de classement...\",\n \"s_statusline_calculating\": \"Calculs en cours...\",\n \"s_statusline_calculatingls\": \"Calculs en cours... Chargement de la feuille...\",\n \"s_statusline_doingserverfunc\": \"exécute la fonction du serveur \",\n \"s_statusline_incell\": \" en cellule \",\n \"s_statusline_calcstart\": \"Début des calculs...\",\n \"s_statusline_sum\": \"SOMME\",\n \"s_statusline_recalcneeded\": \"<span style=\\\"color:#999;\\\">(Recalcul nécessaire)</span>\",\n \"s_statusline_circref\": \"<span style=\\\"color:red;\\\">Référence circulaire : \",\n\n\"\":\"SocialCalc.InputBoxDisplayCellContents\",\n \"s_inputboxdisplaymultilinetext\": \"[Multi-ligne de texte: Cliquez sur la droite de l'icône pour éditer]\",\n \"ietUnknownFunction\": \"Fonction inconnue \", \"\":\"displayed when typing \\\"=unknown(\",\n \"s_CHfillAllTooltip\": \"Remplir les contenus et les formats bas/droite\", \"\":\"tooltip for fill all handle\",\n \"s_CHfillContentsTooltip\": \"Remplir les contenus seulement bas/droite\", \"\":\"tooltip for fill formulas handle\",\n \"s_CHmovePasteAllTooltip\": \"Déplacer les contenus et les formats\", \"\":\"etc.\",\n \"s_CHmovePasteContentsTooltip\": \"Déplacer les contenus seulement\",\n \"s_CHmoveInsertAllTooltip\": \"Déplacer les contenus et les formats en ligne/colonne\",\n \"s_CHmoveInsertContentsTooltip\": \"Déplacer les contenus en ligne/colonne\",\n \"s_CHindicatorOperationLookup\": {\n \"Fill\": \"Remplir\", \"FillC\": \"Remplir le contenu\",\n \"Move\": \"Déplacer\", \"MoveI\": \"Faire glisser\",\n \"MoveC\": \"Déplacer le contenu\", \"MoveIC\": \"Faire glisser le contenu\"\n },\n \"s_CHindicatorDirectionLookup\": {\n \"Down\": \" Bas\", \"Right\": \" Droite\",\n \"Horizontal\": \" Horizontal\", \"Vertical\": \" Vertical\"\n },\n\n\"\":\"Constants for default Format tab (settings)\",\n\"\":\"\",\n\"\":\"*** EVEN THOUGH THESE DON'T START WITH s_: ***\",\n\"\":\"\",\n\"\":\"These should be carefully checked for localization. Make sure you understand what they do and how they work!\",\n\"\":\"The first part of \\\"first:second|first:second|...\\\" is what is displayed and the second is the value to be used.\",\n\"\":\"The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated --\",\n\"\":\"they are commands to SocialCalc.SettingsControls.PopupListInitialize\",\n\n \"SCFormatNumberFormats\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|Janvier 4, 2006:mmmm d, yyyy|[break]:|1\\\\c23:h:mm|1\\\\c23 PM:h:mm AM/PM|1\\\\c23\\\\c45:h:mm:ss|01\\\\c23\\\\c45:hh:mm:ss|26\\\\c23 (h\\\\cm):[hh]:mm|69\\\\c45 (m\\\\cs):[mm]:ss|69 (s):[ss]|[newcol]:|2006-01-04 01\\\\c23\\\\c45:yyyy-mm-dd hh:mm:ss|Janvier 4, 2006:mmmm d, yyyy hh:mm:ss|Mer:ddd|Mercredi:dddd|\",\n \"SCFormatTextFormats\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|\",\n \"SCFormatPadsizes\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|\",\n \"SCFormatFontsizes\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|\",\n \"SCFormatFontfamilies\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|\",\n \"SCFormatFontlook\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|%loc!Bold Italic!:italic bold\",\n \"SCFormatTextAlignhoriz\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|\",\n \"SCFormatNumberAlignhoriz\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|\",\n \"SCFormatAlignVertical\": \"[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|\",\n \"SCFormatColwidth\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|\",\n \"SCFormatRecalc\": \"[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|\",\n \"SCFormatUserMaxCol\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|Unlimited:0|10:10|20:20|30:30|40:40|50:50|60:60|80:80|100:100|\",\n \"SCFormatUserMaxRow\": \"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|Unlimited:0|10:10|20:20|30:30|40:40|50:50|60:60|80:80|100:100|\",\n\n\"\":\"SocialCalc.SettingsControls.PopupListInitialize\",\n \"s_PopupListCancel\": \"[Annuler]\",\n \"s_PopupListCustom\": \"Personnalisé\",\n\n\"\":\"***\",\n\"\":\"\",\n\"\":\"s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings\",\n\"\":\"\",\n\"\":\"Used extensively by socialcalcspreadsheetcontrol.js\",\n\"\":\"\",\n\"\":\"***\",\n \"s_PopupListCancel\": \"[Annuler]\",\n \"s_PopupListCustom\": \"Personnalisé\",\n \"s_loc_align_center\": \"Aligner au centre\",\n \"s_loc_align_left\": \"Aligner à gauche\",\n \"s_loc_align_right\": \"Aligner à droite\",\n \"s_loc_alignment\": \"Alignement\",\n \"s_loc_audit\": \"Historique\",\n \"s_loc_audit_trail_this_session\": \"Suivi des modifications de cette session \",\n \"s_loc_auto\": \"Automatique\",\n \"s_loc_auto_sum\": \"Somme automatique\",\n \"s_loc_auto_wX_commas\": \"Auto avec virgule\",\n \"s_loc_automatic\": \"Automatique\",\n \"s_loc_background\": \"Arrière-plan\",\n \"s_loc_bold\": \"Gras\",\n \"s_loc_bold_XampX_italics\": \"Gras & Italique\",\n \"s_loc_bold_italic\": \"Gras Italique\",\n \"s_loc_borders\": \"Bordures\",\n \"s_loc_borders_off\": \"Désactiver les bordures\",\n \"s_loc_borders_on\": \"Activer les bordures\",\n \"s_loc_bottom\": \"Bas\",\n \"s_loc_bottom_border\": \"Bordure basse\",\n \"s_loc_cell_settings\": \"PARAMÈTRES DE LA CELLULE\",\n \"s_loc_csv_format\": \"Format CSV\",\n \"s_loc_cancel\": \"Annuler\",\n \"s_loc_category\": \"Catégorie\",\n \"s_loc_center\": \"Centrer\",\n \"s_loc_clear\": \"Nettoyer\",\n \"s_loc_clear_socialcalc_clipboard\": \"Nettoyer le presse-papier de SocialCalc \",\n \"s_loc_clipboard\": \"Presse-papier\",\n \"s_loc_color\": \"Couleur\",\n \"s_loc_column_\": \"Colonne \",\n \"s_loc_comment\": \"Commentaire\",\n \"s_loc_copy\": \"Copier\",\n \"s_loc_custom\": \"Personnalisé\",\n \"s_loc_cut\": \"Couper\",\n \"s_loc_default\": \"Défaut\",\n \"s_loc_default_alignment\": \"Alignement par défaut\",\n \"s_loc_default_column_width\": \"Largeur des colonnes par défaut\",\n \"s_loc_default_font\": \"Police par défaut\",\n \"s_loc_default_format\": \"Format par défaut\",\n \"s_loc_default_padding\": \"Remplissage par défaut\",\n \"s_loc_delete\": \"Effacer le contenu\",\n \"s_loc_delete_column\": \"Supprimer une colonne\",\n \"s_loc_delete_contents\": \"Supprimer le contenu\",\n \"s_loc_delete_row\": \"Supprimer une ligne\",\n \"s_loc_description\": \"Description\",\n \"s_loc_display_clipboard_in\": \"Afficher le presse-papier dans le \",\n \"s_loc_down\": \"Bas\",\n \"s_loc_edit\": \"Édition\",\n \"s_loc_existing_names\": \"Noms existants\",\n \"s_loc_family\": \"Famille\",\n \"s_loc_fill_down\": \"Dupliquer vers le bas\",\n \"s_loc_fill_right\": \"Dupliquer vers la droite\",\n \"s_loc_font\": \"Police\",\n \"s_loc_format\": \"Format\",\n \"s_loc_formula\": \"Formule\",\n \"s_loc_function_list\": \"Liste des fonctions\",\n \"s_loc_functions\": \"Fonctions\",\n \"s_loc_grid\": \"Grille\",\n \"s_loc_hidden\": \"Caché\",\n \"s_loc_hide_column\": \"Cacher une colonne\",\n \"s_loc_hide_row\": \"Cacher une ligne\",\n \"s_loc_horizontal\": \"Horizontal\",\n \"s_loc_insert_column\": \"Ajouter une colonne\",\n \"s_loc_insert_row\": \"Ajouter une ligne\",\n \"s_loc_italic\": \"Italique\",\n \"s_loc_last_sort\": \"Dernier tri\",\n \"s_loc_left\": \"Gauche\",\n \"s_loc_left_border\": \"Bordure gauche\",\n \"s_loc_link\": \"Lien\",\n \"s_loc_link_input_box\": \"Créer un lien externe\",\n \"s_loc_list\": \"Liste\",\n \"s_loc_load_socialcalc_clipboard_with_this\": \"Charger le presse-papier de Framacalc avec ceci\",\n \"s_loc_lock\": \"Verrouiller\",\n \"s_loc_major_sort\": \"Tri principal\",\n \"s_loc_manual\": \"Manuel\",\n \"s_loc_merge_cells\": \"Fusionner des cellules\",\n \"s_loc_middle\": \"Milieu\",\n \"s_loc_minor_sort\": \"Tri secondaire\",\n \"s_loc_move_insert\": \"Insérer les cellules à déplacer\",\n \"s_loc_move_paste\": \"Coller les cellules à déplacer\",\n \"s_loc_multiXline_input_box\": \"Case d'import multi-ligne\",\n \"s_loc_name\": \"Nom\",\n \"s_loc_names\": \"Noms\",\n \"s_loc_no_padding\": \"Pas de bordure\",\n \"s_loc_normal\": \"Normal\",\n \"s_loc_number\": \"Nombre\",\n \"s_loc_number_horizontal\": \"Nombre Horizontal\",\n \"s_loc_ok\": \"OK\",\n \"s_loc_padding\": \"Épaisseur\",\n \"s_loc_page_name\": \"Nom de page\",\n \"s_loc_paste\": \"Coller\",\n \"s_loc_paste_formats\": \"Coller le formatage\",\n \"s_loc_plain_text\": \"Texte brut\",\n \"s_loc_recalc\": \"Recalculer\",\n \"s_loc_recalculation\": \"Recalcul\",\n \"s_loc_redo\": \"Rétablir\",\n \"s_loc_right\": \"Droite\",\n \"s_loc_right_border\": \"Bordure droite\",\n \"s_loc_sheet_settings\": \"PARAMÈTRES DE LA FEUILLE\",\n \"s_loc_save\": \"Enregistrer\",\n \"s_loc_save_to\": \"Enregistrer les paramètres de \",\n \"s_loc_set_cell_contents\": \"Importer le contenu dans la cellule\",\n \"s_loc_set_cells_to_sort\": \"Définir les cellules à trier\",\n \"s_loc_set_value_to\": \"Définir la valeur à\",\n \"s_loc_set_to_link_format\": \"Définir le format comme lien\",\n \"s_loc_setXclear_move_from\": \"Sélectionner/Nettoyer la zone à déplacer\",\n \"s_loc_show_cell_settings\": \"Afficher les paramètres des cellules\",\n \"s_loc_show_sheet_settings\": \"Afficher les paramètres de la feuille\",\n \"s_loc_show_in_new_browser_window\": \"Afficher dans une nouvelle fenêtre de votre navigateur\",\n \"s_loc_size\": \"Taille\",\n \"s_loc_socialcalcXsave_format\": \"Format de sauvegarde de Framacalc\",\n \"s_loc_sort\": \"Trier\",\n \"s_loc_sort_\": \"Trier \",\n \"s_loc_sort_cells\": \"Trier les cellules\",\n \"s_loc_swap_colors\": \"Permuter les couleurs\",\n \"s_loc_tabXdelimited_format\": \"Format délimité par des tabulations\",\n \"s_loc_text\": \"Texte\",\n \"s_loc_text_horizontal\": \"Texte horizontal\",\n \"s_loc_this_is_aXbrXsample\": \"Visualiser<br>le rendu\",\n \"s_loc_top\": \"Haut\",\n \"s_loc_top_border\": \"Bordure haute\",\n \"s_loc_undone_steps\": \"ANNULER DES ÉTAPES\",\n \"s_loc_url\": \"URL\",\n \"s_loc_undo\": \"Annuler\",\n \"s_loc_unlock\": \"Déverrouiller\",\n \"s_loc_unmerge_cells\": \"Défaire des cellules\",\n \"s_loc_up\": \"Haut\",\n \"s_loc_value\": \"Valeur\",\n \"s_loc_vertical\": \"Vertical\",\n \"s_loc_wikitext\": \"Wiki-texte\",\n \"s_loc_workspace\": \"Espace de travail\",\n \"s_loc_XnewX\": \"[Nouveau]\",\n \"s_loc_XnoneX\": \"[Aucun]\",\n \"s_loc_Xselect_rangeX\": \"[faites une sélection]\",\n\n\"\":\"The following constants are arrays of strings with the short (3 character) and full names of days and months\",\n \"s_FormatNumber_daynames\": [\"Dimanche\", \"Lundi\", \"Mardi\", \"Mercredi\", \"Jeudi\", \"Vendredi\", \"Samedi\"],\n \"s_FormatNumber_daynames3\": [\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\"],\n \"s_FormatNumber_monthnames\": [\"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Août\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\"],\n \"s_FormatNumber_monthnames3\": [\"Jan\", \"Fev\", \"Mar\", \"Avr\", \"Mai\", \"Jun\", \"Jul\", \"Aou\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n \"s_FormatNumber_am\": \"AM\",\n \"s_FormatNumber_am1\": \"A\",\n \"s_FormatNumber_pm\": \"PM\",\n \"s_FormatNumber_pm1\": \"P\",\n\n\"\":\"\",\n\"\":\"SocialCalc Spreadsheet Formula module, formula1.js:\",\n\"\":\"\",\n \"s_parseerrexponent\": \"Nombre en exposant incorrect\",\n \"s_parseerrchar\": \"Caractère inattendu dans la formule\",\n \"s_parseerrstring\": \"Chaîne incorrecte\",\n \"s_parseerrspecialvalue\": \"Valeur spéciale incorrecte\",\n \"s_parseerrtwoops\": \"Erreur dans la formule (deux opérateurs inopportuns dans la chaîne)\",\n \"s_parseerrmissingopenparen\": \"Parenthèse ouvrante manquante dans la liste à virgule(s). \",\n \"s_parseerrcloseparennoopen\": \"Parenthèse fermante sans parenthèse ouvrante. \",\n \"s_parseerrmissingcloseparen\": \"Parenthèse fermante manquante. \",\n \"s_parseerrmissingoperand\": \"Opérande manquant. \",\n \"s_parseerrerrorinformula\": \"Erreur dans la formule.\",\n \"s_calcerrerrorvalueinformula\": \"Valeur erronée dans la formule\",\n \"s_parseerrerrorinformulabadval\": \"Erreur dans la formule créant une mauvaise valeur\",\n \"s_formularangeresult\": \"Formule résultante de la valeur sélectionnée :\",\n \"s_calcerrnumericnan\": \"Formule causant une mauvaise valeur numérique\",\n \"s_calcerrnumericoverflow\": \"Overflow numérique\",\n \"s_sheetunavailable\": \"Feuille indisponible :\",\n \"s_calcerrcellrefmissing\": \"Référence nécessaire manquante à une cellule.\",\n \"s_calcerrsheetnamemissing\": \"Nom de la feuille nécessaire manquante.\",\n \"s_circularnameref\": \"Nom à référence circulaire\",\n \"s_calcerrunknownname\": \"Nom inconnu\",\n \"s_calcerrincorrectargstofunction\": \"Argument de la fonction incorrect\",\n \"s_sheetfuncunknownfunction\": \"Fonction inconnue\",\n \"s_sheetfunclnarg\": \"L'argument de LN doit être plus grand que 0\",\n \"s_sheetfunclog10arg\": \"L'argument de LOG10 doit être plus grand que 0\",\n \"s_sheetfunclogsecondarg\": \"Le deuxième argument de LOG doit être une valeur numérique plus quande que 0\",\n \"s_sheetfunclogfirstarg\": \"Le premier argument de LOG doit être plus grand que 0\",\n \"s_sheetfuncroundsecondarg\": \"Le deuxième argument de ROUND doit être une valeur numérique\",\n \"s_sheetfuncddblife\": \"La vie dans DDB doit être plus grande que 1\",\n \"s_sheetfuncslnlife\": \"La vie dans SLN doit être plus grande que 1\",\n\n\"\":\"Function definition text\",\n \"s_fdef_ABS\": \"Fonction valeur absolue. \",\n \"s_fdef_ACOS\": \"Fonction trigonometrique arccosinus. \",\n \"s_fdef_AND\": \"Vrai si tous les arguments sont vrais. \",\n \"s_fdef_ASIN\": \"Fonction trigonométrique arcsinus. \",\n \"s_fdef_ATAN\": \"Fonction trigonométrique arctangente. \",\n \"s_fdef_ATAN2\": \"Fonction trigonométrique arctangente (le résultat est en radians). \",\n \"s_fdef_AVERAGE\": \"Moyenne des valeurs. \",\n \"s_fdef_CHOOSE\": \"Retourne la valeur spécifiée par l'index. Les valeurs doivent être sélectionnées. \",\n \"s_fdef_COLUMNS\": \"Retourne le nombre de colonnes de la sélection. \",\n \"s_fdef_COS\": \"Fonction trigonométrique cosinus (la valeur est en radians). \",\n \"s_fdef_COUNT\": \"Compte le nombre de valeurs numériques, pas les blancs, ni les textes, ni les erreurs. \",\n \"s_fdef_COUNTA\": \"Compte le nombre de valeurs non-vides. \",\n \"s_fdef_COUNTBLANK\": \"Compte le nombre de blancs. (Note: \\\"\\\" n'est pas un blanc.) \",\n \"s_fdef_COUNTIF\": \"Compte le nombre de cellules dans la sélection qui vérifient la condition. Le critère doit être une valeur (\\\"x\\\", 15, 1+3) ou un test (>25). \",\n \"s_fdef_DATE\": \"Retourne la date appropriée étant donné les nombres de l'année du mois et du jour. Par exemple : DATE(2006,2,1) pour le 1er février 2006. Note : Dans ce programme, le jour \\\"1\\\" est le 31 décembre 1899 et l'année 1900 n'est pas une année sautée. Certains programmes utilisent le 1er janvier 1900, comme le jour \\\"1\\\" et sautent l'année 1900. Mais dans les deux cas, les dates après le 1er mars 1900 sont les mêmes. \",\n \"s_fdef_DAVERAGE\": \"Calcule la moyenne des champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DAY\": \"Retourne le jour de la semaine d'une date donnée. \",\n \"s_fdef_DCOUNT\": \"Compte le nombre de valeurs numériques, pas les blancs, ni le texte, ni les erreurs, dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DCOUNTA\": \"Compte le nombre de valeurs non-vides dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DDB\": \"Retourne la valeur de la dépréciation sur la période donnée (le facteur par défaut est 2 pour un équilibre à double décroissance). \",\n \"s_fdef_DEGREES\": \"Convertit une valeur de radians en degrés. \",\n \"s_fdef_DGET\": \"Retourne la valeur du champ spécifié dans une seule entrée qui satisfait le critère. \",\n \"s_fdef_DMAX\": \"Retourne le maximum des valeurs numériques dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DMIN\": \"Retourne le minimun des valeurs numériques dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DPRODUCT\": \"Retourne le résultat de la multiplication des valeurs numériques dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DSTDEV\": \"Retourne l'écart-type d'une population des valeurs numériques spécifiées qui satisfont le critère. \",\n \"s_fdef_DSTDEVP\": \"Retourne l'écart-type des valeurs numériques spécifiées qui satisfont le critère. \",\n \"s_fdef_DSUM\": \"Retourne la somme des valeurs numériques dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DVAR\": \"Retourne la variance d'une population des valeurs numériques dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_DVARP\": \"Retourne la variance des valeurs numériques dans les champs spécifiés qui satisfont le critère. \",\n \"s_fdef_EVEN\": \"Arrondit supérieurement la valeur à l'entier le plus proche. \",\n \"s_fdef_EXACT\": \"Retourne \\\"true\\\" si les valeurs sont exactement les mêmes, incluant la case, le type, etc. \",\n \"s_fdef_EXP\": \"Retourne e élevé à la puissance spécifiée. \",\n \"s_fdef_FACT\": \"Retourne la factorielle de la valeur. \",\n \"s_fdef_FALSE\": \"Retourne la valeur logique \\\"false\\\". \",\n \"s_fdef_FIND\": \"Retourne la position de départ de la première occurence de chaîne1 dans la chaîne chaîne2, après la position \\\"start\\\". Si \\\"start\\\" est omis, sa valeur est 1. \",\n \"s_fdef_FV\": \"Retourne la valeur future des paiements itérés d'un montant investi à un taux donné pour un nombre spécifié de périodes, avec comme option facultative la valeur présente (0 par défaut) et le type de paiement (par défaut 0 = à la fin de la période, 1 = au début de la période). \",\n \"s_fdef_HLOOKUP\": \"Cherche la valeur assortie à la valeur donnée dans la sélection et retourne la valeur correpondante dans la cellule spécifiée par la ligne de compensation. Si l'option sélection-de-recherche est égale à 1 (par défaut) et non 0, cherche une correspondance dans une fourchette numérique (valeur associée<=valeur) au lieu d'une correspondance exacte. \",\n \"s_fdef_HOUR\": \"Retourne la partie des heures dans une valeur temporelle ou d'une date et d'un horaire. \",\n \"s_fdef_IF\": \"Effectue le résultat associé à vrai si l'expression logique est \\\"TRUE\\\" ou non-nulle, sinon effectue le résultat associé à la valeur fausse. \",\n \"s_fdef_INDEX\": \"Retourne une cellule ou une sélection de référence pour une ligne et une colonne dans cette plage. Si cette plage est de dimension 1, alors seul le numéro de colonne, ou de ligne, est nécessaire. Si elle est à 2 dimensions et que le numéro de ligne ou de colonne est égal à zéro, la référence retournée contient juste la colonne ou la ligne spécifiée. Vous pouvez utiliser la référence retournée dans la syntaxe d'une plage, comme par exemple dans sum(A1:INDEX(A2:A10,4)). \",\n \"s_fdef_INT\": \"Arrondit inférieurement la valeur à l'entier le plus proche (vers -infini). \",\n \"s_fdef_IRR\": \"Retourne le taux d'intérêt auquel le flux d'argent a une valeur nette nulle. Utilise un processus itératif qui retournera une erreur #NUM! si le résultat ne converge pas. Il peut y avoir plus d'une seule possibilité. Fournir une estimation optionnelle peut aider dans certaines situations où il n'y a pas de convergence ou s'il trouve une solution inadaptée (l'estimation par défaut est de 10%). \",\n \"s_fdef_ISBLANK\": \"Retourne \\\"true\\\" si la valeur est une référence à une cellule vide. \",\n \"s_fdef_ISERR\": \"Retourne \\\"true\\\" si la valeur est une référence à une cellule vide of type \\\"Error\\\" but not \\\"NA\\\". \",\n \"s_fdef_ISERROR\": \"Retourne \\\"true\\\" si la valeur est de type \\\"Erreur\\\". \",\n \"s_fdef_ISLOGICAL\": \"Retourne \\\"true\\\" si la valeur est de type logique (\\\"Logical\\\") (vrai/faux). \",\n \"s_fdef_ISNA\": \"Retourne \\\"true\\\" si la valeur est une erreur \\\"NA\\\". \",\n \"s_fdef_ISNONTEXT\": \"Retourne \\\"true\\\" si la valeur n'est pas de type \\\"Text\\\". \",\n \"s_fdef_ISNUMBER\": \"Retourne \\\"true\\\" si la valeur est de type \\\"nombre\\\" (incluant les valeurs logiques). \",\n \"s_fdef_ISTEXT\": \"Retourne \\\"true\\\" si la valeur est de type \\\"Texte\\\". \",\n \"s_fdef_LEFT\": \"Retourne le nombre spécifié de caractères d'une chaîne de texte. Si le nombre est omis, sa valeur est 1. \",\n \"s_fdef_LEN\": \"Retourne le nombre de caractères d'une chaîne de texte. \",\n \"s_fdef_LN\": \"Retourne le logarithme naturel d'une valeur spécifiée. \",\n \"s_fdef_LOG\": \"Retourne le logarithme d'une valeur en utilisant une base spécifiée. \",\n \"s_fdef_LOG10\": \"Retourne le logarithme en base 10 d'une valeur spécifiée. \",\n \"s_fdef_LOWER\": \"Retourne la chaîne de texte avec toutes les majuscules converties en minuscules. \",\n \"s_fdef_MATCH\": \"Cherche la valeur assortie à la valeur donnée dans la sélection et retourne la position (la première est 1) dans cette plage. Si l'option sélection-de-recherche est égale à 1 (par défaut) et non 0, cherche une correspondance dans une fouchette numérique (valeur associée<=valeur) au lieu d'une correspondance exacte. Si sélection-de-recherche est égal à -1, agit comme 1 mais avec la fourchette comme valeur associée>=valeur. \",\n \"s_fdef_MAX\": \"Retourne le maximum des valeurs numériques spécifiées. \",\n \"s_fdef_MID\": \"Retourne le nombre de caractère d'une chaîne de texte en commençant à la position spécifiée. \",\n \"s_fdef_MIN\": \"Retourne le minimum des valeurs numériques spécifiées. \",\n \"s_fdef_MINUTE\": \"Retourne la partie des minutes dans une valeur temporelle ou d'une date et d'un horaire. \",\n \"s_fdef_MOD\": \"Retourne le reste d'une division (euclidienne) d'une première valeur par une autre. \",\n \"s_fdef_MONTH\": \"Retourne la partie du mois d'une date. \",\n \"s_fdef_N\": \"Retourne la valeur si elle est numérique, sinon retourne une erreur. \",\n \"s_fdef_NA\": \"Retourne l'erreur #N/A qui se propage au travers de la plupart des opérations. \",\n \"s_fdef_NOT\": \"Retourne \\\"FALSE\\\" si la valeur est \\\"true\\\", et \\\"TRUE\\\" si la valeur est \\\"false\\\". \",\n \"s_fdef_NOW\": \"Retoune la date et l'heure actuelles. \",\n \"s_fdef_NPER\": \"Retourne le nombre de périodes nécessaire pour avoir la valeur actuelle, avec des paiements investis à chaque période à un taux d'intérêt donné. On peut spécifier la valeur future (0 par défaut) et le type de paiement (par défaut 0 = à la fin de la période, 1 = au début de la période). \",\n \"s_fdef_NPV\": \"Retourne la valeur nette actuelle d'un flux de paiements (qui peuvent être des valeurs individuelles et/ou des plages de données) à un taux d'intérêt donné. Les flux sont positifs dans le cas d'un revenu, négatif s'il s'agit d'une dépense, et pris en compte à la fin de chaque période. \",\n \"s_fdef_ODD\": \"Arrondit la valeur à l'entier impair le plus proche. \",\n \"s_fdef_OR\": \"Vrai si au moins un élément est vrai \",\n \"s_fdef_PI\": \"La valeur 3.1415926… \",\n \"s_fdef_PMT\": \"Retourne le montant de chaque paiement qui doit être investi à un taux donné pour un nombre spécifié de périodes afin d'avoir la valeur actuelle donnée, avec la valeur future optionnelle (0 par défaut) et le type de paiement (par défaut 0 = à la fin de la période, 1 = au début de la période). \",\n \"s_fdef_POWER\": \"Retourne la première valeur mise à la puissance de la seconde valeur. \",\n \"s_fdef_PRODUCT\": \"Retourne le résultat de la multiplication des valeurs numériques spécifiées. \",\n \"s_fdef_PROPER\": \"Retourne la chaîne de texte avec la première lettre de chaque mot convertie en majuscule, et les autres en minuscules. \",\n \"s_fdef_PV\": \"Retourne la valeur actuelle d'un nombre donné de paiements chacuns investis à un taux spécifié, avec la valeur future optionnelle (0 par défaut) et le type de paiement (par défaut 0 = à la fin de la période, 1 = au début de la période). \",\n \"s_fdef_RADIANS\": \"Convertit une valeur de degrès en radians. \",\n \"s_fdef_RATE\": \"Retourne le taux d'intérêt auquel un nombre donné de paiements, chacuns investis à un taux spécifié, ont les valeurs actuelles données, avec la valeur future optionnelle (0 par défaut) et le type de paiement (par défaut 0 = à la fin de la période, 1 = au début de la période). Utilise un processus itératif qui retournera une erreur #NUM! si le résultat ne converge pas. Il peut y avoir plus d'une seule possibilité. Fournir une estimation optionnelle peut aider dans certaines situations où il n'y a pas de convergence ou s'il trouve une solution inadaptée (l'estimation par défaut est de 10%). \",\n \"s_fdef_REPLACE\": \"Retourne texte1 avec le nombre de caractères spécifiés remplacés par texte2, à partir de la position de départ. \",\n \"s_fdef_REPT\": \"Retourne le texte répété le nombre de fois définis. \",\n \"s_fdef_RIGHT\": \"Retourne le nombre de caractères d'une chaîne de texte en partant de la fin. Si compte est omis, la valeur 1 est prise en compte. \",\n \"s_fdef_ROUND\": \"Arrondit au nombre de décimales spécifiées. Si la précision est négative, arrondit alors aux puissances de 10. La précision par défaut est 0 (arrondit à l'entier). \",\n \"s_fdef_ROWS\": \"Retourne le nombre de lignes de la sélection. \",\n \"s_fdef_SECOND\": \"Retourne la deuxième partie d'une heure ou d'une date et d'un horaire (tronquée à un entier). \",\n \"s_fdef_SIN\": \"Fonction trigonometrique sinus (la valeur est en radians) \",\n \"s_fdef_SLN\": \"Retourne le montant de l'amortissement à chaque période en utilisant la méthode constante. \",\n \"s_fdef_SQRT\": \"Racine carrée de la valeur \",\n \"s_fdef_STDEV\": \"Retourne l'écart-type d'une population des valeurs numériques spécifiées. \",\n \"s_fdef_STDEVP\": \"Retourne l'écart-type des valeurs numériques spécifiées. \",\n \"s_fdef_SUBSTITUTE\": \"Retourne \\\"texte1\\\" avec toutes les occurences de \\\"vieux-texte\\\" remplacées par \\\"nouveau-texte\\\". Si l'option \\\"occurrence\\\" est spécifiée, alors seulement cette occurrence est remplacée. \",\n \"s_fdef_SUM\": \"Additionne les valeurs numériques. Les valeurs à sommer doivent être de la forme A1:B5. \",\n \"s_fdef_SUMIF\": \"Additionne les valeurs numériques des cellules qui satisfont le critère. Le critère doit être une valeur (\\\"x\\\", 15, 1+3) ou un test (>25). Si sélection2 n'est pas vide, alors sélection1 sert de test et la valeur correspondante dans sélection2 est sommée. \",\n \"s_fdef_SYD\": \"Amortissement par la méthode de la somme des chiffres de chaque année. \",\n \"s_fdef_T\": \"Retourne la valeur si c'est une chaîne de texte, sinon retourne une chaîne nulle. \",\n \"s_fdef_TAN\": \"Fonction trigonometrique tangente (la valeur est en radians) \",\n \"s_fdef_TIME\": \"Retourne l'heure donnée par l'heure, la minute et la seconde spécifiées. \",\n \"s_fdef_TODAY\": \"Retourne la date actuelle (en tant qu'entier). Note : Dans ce programme, le jour \\\"1\\\" est le 31 décembre 1899 et l'année 1900 n'est pas une année sautée. Certains programmes utilisent le 1er janvier 1900, comme le jour \\\"1\\\" et sautent l'année 1900. Mais dans les deux cas, les dates après le 1er mars 1900 sont les mêmes. \",\n \"s_fdef_TRIM\": \"Retourne la chaîne de texte avec les espaces répétés, de début et de fin supprimés. \",\n \"s_fdef_TRUE\": \"Retourne la valeur logique \\\"true\\\". \",\n \"s_fdef_TRUNC\": \"Tronque la valeur du nombre spécifié decimal places. Si la precision est négative, tronque aux puissances de 10. \",\n \"s_fdef_UPPER\": \"Retourne la chaîne de texte avec toutes les minuscules converties en majuscules. \",\n \"s_fdef_VALUE\": \"Convertit la chaîne de texte donnée en valeur numérique. De nombreuses formes qui ressemblent à des nombres (incluant des chiffres suivis de %, formes ressemblant à des dates, etc.) sont supportées. Cette fonction peut ne pas supporter toutes les formes acceptées par d'autres tableurs et des syntaxes non-anglophones. \",\n \"s_fdef_VAR\": \"Retourne la variance d'une population des valeurs numériques spécifiées. \",\n \"s_fdef_VARP\": \"Retourne la variance des valeurs numériques spécifiées. \",\n \"s_fdef_VLOOKUP\": \"Cherche la valeur assortie à la valeur donnée dans la sélection et retourne la valeur correpondante dans la cellule spécifiée par la colonne de compensation. Si l'option sélection-de-recherche est égale à 1 (par défaut) et non 0, cherche une correspondance dans une fouchette numérique (valeur associée<=valeur) au lieu d'une correspondance exacte. \",\n \"s_fdef_WEEKDAY\": \"Retourne le jour de la semaine de la date spécifiée. Si le type est égal à 1 (par défaut), le jour 1 est le dimanche et le samedi est le jour 7. Si le type est égal à 2, le lundi est le jour 1 et le dimanche est le jour 7. Si le type est 3, le lundi est le jour 0 et le dimanche est le jour 6. \",\n \"s_fdef_YEAR\": \"Retourne l'année d'une date entière. \",\n \"s_fdef_SUMPRODUCT\": \"Additionne les produits en regards de 2 plages de données ou plus. Les plages de données doivent être de même taille.\",\n \"s_fdef_CEILING\": \"Arrondi le nombre fourni au plus proche entier ou magnitude supérieur. La magnitude est le multiple (ou sous-multiple) de 10 supérieur auquel le nombre doit être arrondi (.01, .1, 1, 10, etc.)\",\n \"s_fdef_FLOOR\": \"Arrondi le nombre fourni au plus proche entier ou magnitude. La magnitude est le multiple (ou sous-multiple) de 10 auquel le nombre doit être arrondie (.01, .1, 1, 10, etc.)\",\n\n \"s_farg_v\": \"valeur\",\n \"s_farg_vn\": \"valeur1, valeur2, …\",\n \"s_farg_xy\": \"valeur, valeur\",\n \"s_farg_choose\": \"index, valeur1, valeur2, …\",\n \"s_farg_range\": \"sélection\",\n \"s_farg_rangec\": \"sélection, critère\",\n \"s_farg_date\": \"année, mois, jour\",\n \"s_farg_dfunc\": \"base-de-données-de-la-plage, nom-du-champ, critère-de-sélection\",\n \"s_farg_ddb\": \"coût, amortissement, durée-de-vie, période [, facteur]\",\n \"s_farg_find\": \"chaîne1, chaîne2 [, début]\",\n \"s_farg_fv\": \"taux, n, paiement, [pv, [type-de-paiement]]\",\n \"s_farg_hlookup\": \"valeur, sélection, ligne, [sélection-de-recherche]\",\n \"s_farg_iffunc\": \"expression-logique, vraie-valeur, fausse-valeur\",\n \"s_farg_index\": \"sélection, numéro-de-ligne, numéro-de-colonne\",\n \"s_farg_irr\": \"sélection, [estimation]\",\n \"s_farg_tc\": \"texte, compte\",\n \"s_farg_log\": \"valeur, base\",\n \"s_farg_match\": \"valeur, sélection, [sélection-de-recherche]\",\n \"s_farg_mid\": \"texte, début, longueur\",\n \"s_farg_nper\": \"taux, paiement, pv, [fv, [type-de-paiement]]\",\n \"s_farg_npv\": \"taux, valeur1, valeur2, …\",\n \"s_farg_pmt\": \"taux, n, pv, [fv, [type-de-paiement]]\",\n \"s_farg_pv\": \"taux, n, paiement, [fv, [type-de-paiement]]\",\n \"s_farg_rate\": \"n, paiement, pv, [fv, [type-de-paiement, [estimation]]]\",\n \"s_farg_replace\": \"texte1, début, longueur, texte2\",\n \"s_farg_vp\": \"valeur, [précision]\",\n \"s_farg_valpre\": \"valeur, precision\",\n \"s_farg_csl\": \"coût, récupération, durée-de-vie\",\n \"s_farg_cslp\": \"coût, récupération, durée-de-vie, periode\",\n \"s_farg_subs\": \"texte1, vieux-texte, nouveau-texte [, occurrence]\",\n \"s_farg_sumif\": \"sélection1, critère [, sélection2]\",\n \"s_farg_hms\": \"heure, minute, seconde\",\n \"s_farg_txt\": \"texte\",\n \"s_farg_vlookup\": \"valeur, sélection, colonne, [sélection-de-recherche]\",\n \"s_farg_weekday\": \"date, [type]\",\n \"s_farg_dt\": \"date\",\n \"s_farg_rangen\": \"sélection1, sélection2, ...\",\n \"s_farg_vsig\": \"valeur, [magnitude]\",\n\n \"function_classlist\": [\"all\", \"stat\", \"lookup\", \"datetime\", \"financial\", \"test\", \"math\", \"text\"],\n\n \"s_fclass_all\": \"Tout\",\n \"s_fclass_stat\": \"Statistiques\",\n \"s_fclass_lookup\": \"Recherche\",\n \"s_fclass_datetime\": \"Date et heure\",\n \"s_fclass_financial\": \"Financier\",\n \"s_fclass_test\": \"Test\",\n \"s_fclass_math\": \"Maths\",\n \"s_fclass_text\": \"Texte\",\n\n\"\":\"Graph tab\",\n \"s_loc_plain\": \"Plein\",\n \"s_loc_graph\": \"Graphique\",\n \"s_loc_cells_to_graph\": \"Cellules à tracer\",\n \"s_loc_set_cells_to_graph\": \"Paramétrer les cellules à tracer\",\n \"s_loc_graph_type\": \"Type de graphique\",\n \"s_loc_help\": \"Aide\",\n \"s_loc_horizontal_bar\": \"Histogramme horizontal\",\n \"s_loc_vertical_bar\": \"Histogramme vertical\",\n \"s_loc_pie_chart\": \"Diagramme circulaire (camenbert)\",\n \"s_loc_line_chart\": \"Ligne\",\n \"s_loc_scatter_chart\": \"Nuage de points\",\n \"s_loc_not_set\": \"Non défini\",\n \"s_loc_unknown_range_name\": \"Nom de sélection inconnu\",\n \"s_loc_hide_help\": \"Cacher l'aide\",\n \"s_loc_x\": \"X\",\n \"s_loc_y\": \"Y\",\n \"s_loc_max\": \"Max\",\n \"s_loc_min\": \"Min\",\n \"s_loc_Xselect_rangeX\": \"[Sélection]\",\n \"s_loc_graph_view\": \"Graph View\",\n \"s_GraphRangeNotSelected\": \"Choisissez une plage de cellules de valeurs numériques, puis utilisez le bouton OK ci-dessus pour sélectionner cette plage comme celle à tracer.\",\n\n \"s_graph_error_selection\": \"<b>Erreur de sélection</b>.<br>Vous devez sélectionner des cellules au sein d'une même ligne ou colonne !\",\n \"s_graph_help_intro\": \"Ceci est l'aide pour le type de graphique: \",\n \"s_graph_VerticalBar_help\": \"L'onglet <b>Graphique</b> affiche un histogramme vertical des cellules sélectionnées (dans une seule ligne ou colonne). Si la ligne au-dessus (ou la colonne à gauche) de la sélection a des valeurs, celles-ci sont utilisées comme labels. Sinon ce sont les coordonnées de cellule qui sont utilisées (par exemple : B5).\",\n \"s_graph_HorizontalBar_help\": \"L'onglet <b>Graphique</b> affiche un histogramme horizontal des cellules sélectionnées (dans une seule ligne ou colonne). Si la ligne au-dessus (ou la colonne à gauche) de la sélection a des valeurs, celles-ci sont utilisées comme labels. Sinon ce sont les coordonnées de cellule qui sont utilisées (par exemple : B5).\",\n \"s_graph_PieChart_help\": \"L'onglet <b>Graphique</b> affiche un diagramme circulaire (camembert) des cellules sélectionnées (dans une seule ligne ou colonne). Si la ligne au-dessus (ou la colonne à gauche) de la sélection a des valeurs, celles-ci sont utilisées comme labels. Sinon ce sont les coordonnées de cellule qui sont utilisées (par exemple : B5).\",\n \"s_graph_PieChart_error_selection\": \"<b>Erreur de sélection</b>.<br>Vous ne devez sélectionner que des cellules ayant des valeurs positives !\",\n \"s_graph_LineChart_help\": \"L'onglet <b>Graphique</b> affiche une ligne ou profile XY des cellules sélectionnées (dans une seule ligne ou colonne). La ligne au-dessus (ou la colonne à gauche) de la sélection est utilisée comme coordonnée X.\",\n \"s_graph_ScatterChart_help\": \"L'onglet <b>Graphique</b> affiche un nuage de point ou profile discret XY des cellules sélectionnées (dans une seule ligne ou colonne). La ligne au-dessus (ou la colonne à gauche) de la sélection est utilisée comme coordonnée X. Si la ligne en-dessous (ou la colonne à droite) de la sélection a des valeurs, celles-ci sont interprétées comme une dimension appliquée aux points\",\n\n\"\":\"Clipboard tab\",\n \"s_loc_to\": \"vers\",\n \"s_loc_tiddler\": \"Tiddler\",\n \"s_loc_import\": \"Import\",\n \"s_loc_export\": \"Export\",\n \"s_loc_XclipboardX\": \"[Presse-papier]\",\n \"s_clipboard_menu_title\": \"Import/Export<br> et Presse-papier\",\n \"s_clipboard_export_error_tiddler_exists\": \"Le Tiddler existe déjà\",\n \"s_clipboard_export_error_tiddler_overwrite\": \"Voulez-vous le remplacer ?\",\n \"s_clipboard_import_error_tiddler_format\": \"Erreur de format: le champ \\\"format\\\" du Tiddler a une valeur incorrecte.\",\n\n\"\":\"Save sheet to tiddler\",\n \"s_loc_save_changes\": \"Sauvegarder\",\n \"s_notification_tiddler\": \"La feuille de calcul ~SocialCalc a été sauvegardée\",\n\n\"\":\"\"\n}\n"
},
"$:/plugins/rboue/SocialCalc/Languages/fr-FR--save-notification": {
"title": "$:/plugins/rboue/SocialCalc/Languages/fr-FR--save-notification",
"text": "La feuille de calcul ~SocialCalc a été sauvegardée\n"
},
"$:/plugins/rboue/SocialCalc/Lib/socialcalc-min.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/SocialCalc/Lib/socialcalc-min.js",
"module-type": "library",
"text": "(function(){\nvar SocialCalc;SocialCalc||(SocialCalc={});\nSocialCalc.Constants={textdatadefaulttype:\"t\",s_BrowserNotSupported:\"Browser not supported.\",s_InternalError:\"Internal SocialCalc error (probably an internal bug): \",s_pssUnknownColType:\"Unknown col type item\",s_pssUnknownRowType:\"Unknown row type item\",s_pssUnknownLineType:\"Unknown line type\",s_cfspUnknownCellType:\"Unknown cell type item\",doCanonicalizeSheet:!0,s_escUnknownSheetCmd:\"Unknown sheet command: \",s_escUnknownSetCoordCmd:\"Unknown set coord command: \",s_escUnknownCmd:\"Unknown command: \",\ns_caccCircRef:\"Circular reference to \",defaultRowNameWidth:\"30\",defaultAssumedRowHeight:15,defaultCellIDPrefix:\"cell_\",defaultCellLayout:\"padding:2px 2px 1px 2px;vertical-align:top;\",defaultCellFontStyle:\"normal normal\",defaultCellFontSize:\"small\",defaultCellFontFamily:\"Verdana,Arial,Helvetica,sans-serif\",defaultPaneDividerWidth:\"2\",defaultPaneDividerHeight:\"3\",defaultGridCSS:\"1px solid #C0C0C0;\",defaultCommentClass:\"\",defaultCommentStyle:\"background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);\",\ndefaultCommentNoGridClass:\"\",defaultCommentNoGridStyle:\"\",defaultReadonlyClass:\"\",defaultReadonlyStyle:\"background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-lockbg.gif);\",defaultReadonlyNoGridClass:\"\",defaultReadonlyNoGridStyle:\"\",defaultReadonlyComment:\"Locked cell\",defaultColWidth:\"80\",defaultMinimumColWidth:10,defaultHighlightTypeCursorClass:\"\",defaultHighlightTypeCursorStyle:\"color:#FFF;backgroundColor:#A6A6A6;\",defaultHighlightTypeRangeClass:\"\",defaultHighlightTypeRangeStyle:\"color:#000;backgroundColor:#E5E5E5;\",\ndefaultColnameClass:\"\",defaultColnameStyle:\"font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;\",defaultSelectedColnameClass:\"\",defaultSelectedColnameStyle:\"font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;\",defaultRownameClass:\"\",defaultRownameStyle:\"font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;direction:rtl;\",defaultSelectedRownameClass:\"\",defaultSelectedRownameStyle:\"font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;\",\ndefaultUpperLeftClass:\"\",defaultUpperLeftStyle:\"font-size:small;\",defaultSkippedCellClass:\"\",defaultSkippedCellStyle:\"font-size:small;background-color:#CCC\",defaultPaneDividerClass:\"\",defaultPaneDividerStyle:\"font-size:small;background-color:#C0C0C0;padding:0px;\",defaultUnhideLeftClass:\"\",defaultUnhideLeftStyle:\"float:right;width:9px;height:12px;cursor:pointer;background-image:url(images/sc-unhideleft.gif);padding:0;\",defaultUnhideRightClass:\"\",defaultUnhideRightStyle:\"float:left;width:9px;height:12px;cursor:pointer;background-image:url(images/sc-unhideright.gif);padding:0;\",\ndefaultUnhideTopClass:\"\",defaultUnhideTopStyle:\"float:left;position:absolute;bottom:-4px;width:12px;height:9px;cursor:pointer;background-image:url(images/sc-unhidetop.gif);padding:0;\",defaultUnhideBottomClass:\"\",defaultUnhideBottomStyle:\"float:left;width:12px;height:9px;cursor:pointer;background-image:url(images/sc-unhidebottom.gif);padding:0;\",s_rcMissingSheet:\"Render Context must have a sheet object\",defaultLinkFormatString:'<span style=\"font-size:smaller;text-decoration:none !important;background-color:#66B;color:#FFF;\">Link</span>',\ndefaultPageLinkFormatString:'<span style=\"font-size:smaller;text-decoration:none !important;background-color:#66B;color:#FFF;\">Page</span>',defaultTiddlerLinkFormatString:'<span style=\"font-size:smaller;text-decoration:none !important;background-color:#66B;color:#FFF;\">Tiddler</span>',defaultFormatp:\"#,##0.0%\",defaultFormatc:\"[$$]#,##0.00\",defaultFormatdt:\"d-mmm-yyyy h:mm:ss\",defaultFormatd:\"d-mmm-yyyy\",defaultFormatt:\"[h]:mm:ss\",defaultDisplayTRUE:\"TRUE\",defaultDisplayFALSE:\"FALSE\",defaultImagePrefix:\"images/sc-\",\ndefaultTableEditorIDPrefix:\"te_\",defaultPageUpDnAmount:15,AllowCtrlS:!0,defaultTableControlThickness:20,cteGriddivClass:\"\",s_statusline_executing:\"Executing...\",s_statusline_displaying:\"Displaying...\",s_statusline_ordering:\"Ordering...\",s_statusline_calculating:\"Calculating...\",s_statusline_calculatingls:\"Calculating... Loading Sheet...\",s_statusline_doingserverfunc:\"doing server function \",s_statusline_incell:\" in cell \",s_statusline_calcstart:\"Calculation start...\",s_statusline_sum:\"SUM\",s_statusline_recalcneeded:'<span style=\"color:#999;\">(Recalc needed)</span>',\ns_statusline_circref:'<span style=\"color:red;\">Circular reference: ',s_inputboxdisplaymultilinetext:\"[Multi-line text: Click icon on right to edit]\",defaultInputEchoClass:\"\",defaultInputEchoStyle:\"filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;fontSize:small;padding:2px 10px 1px 2px;cursor:default;\",defaultInputEchoPromptClass:\"\",defaultInputEchoPromptStyle:\"filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;\",\nietUnknownFunction:\"Unknown function \",CH_radius1:29,CH_radius2:41,s_CHfillAllTooltip:\"Fill Contents and Formats Down/Right\",s_CHfillContentsTooltip:\"Fill Contents Only Down/Right\",s_CHmovePasteAllTooltip:\"Move Contents and Formats\",s_CHmovePasteContentsTooltip:\"Move Contents Only\",s_CHmoveInsertAllTooltip:\"Slide Contents and Formats within Row/Col\",s_CHmoveInsertContentsTooltip:\"Slide Contents within Row/Col\",s_CHindicatorOperationLookup:{Fill:\"Fill\",FillC:\"Fill Contents\",Move:\"Move\",MoveI:\"Slide\",\nMoveC:\"Move Contents\",MoveIC:\"Slide Contents\"},s_CHindicatorDirectionLookup:{Down:\" Down\",Right:\" Right\",Horizontal:\" Horizontal\",Vertical:\" Vertical\"},defaultTCSliderThickness:9,defaultTCButtonThickness:20,defaultTCThumbThickness:15,TCmainStyle:\"backgroundColor:#EEE;\",TCmainClass:\"\",TCendcapStyle:\"backgroundColor:#FFF;\",TCendcapClass:\"\",TCpanesliderStyle:\"backgroundColor:#CCC;\",TCpanesliderClass:\"\",s_panesliderTooltiph:\"Drag to lock pane vertically\",s_panesliderTooltipv:\"Drag to lock pane horizontally\",\nTClessbuttonStyle:\"backgroundColor:#AAA;\",TClessbuttonClass:\"\",TClessbuttonRepeatWait:300,TClessbuttonRepeatInterval:20,TCmorebuttonStyle:\"backgroundColor:#AAA;\",TCmorebuttonClass:\"\",TCmorebuttonRepeatWait:300,TCmorebuttonRepeatInterval:20,TCscrollareaStyle:\"backgroundColor:#DDD;\",TCscrollareaClass:\"\",TCscrollareaRepeatWait:500,TCscrollareaRepeatInterval:100,TCthumbClass:\"\",TCthumbStyle:\"backgroundColor:#CCC;\",TCPStrackinglineClass:\"\",TCPStrackinglineStyle:\"overflow:hidden;position:absolute;zIndex:100;\",\nTCPStrackinglineThickness:\"2px\",TCTDFSthumbstatusvClass:\"\",TCTDFSthumbstatusvStyle:\"height:20px;width:auto;border:3px solid #808080;overflow:hidden;backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;\",TCTDFSthumbstatushClass:\"\",TCTDFSthumbstatushStyle:\"height:20px;width:auto;border:1px solid black;padding:2px;backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;\",TCTDFSthumbstatusrownumClass:\"\",TCTDFSthumbstatusrownumStyle:\"color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;\",\nTCTDFStopOffsetv:0,TCTDFSleftOffsetv:-80,s_TCTDFthumbstatusPrefixv:\"Row \",TCTDFStopOffseth:-30,TCTDFSleftOffseth:0,s_TCTDFthumbstatusPrefixh:\"Col \",TooltipOffsetX:2,TooltipOffsetY:10,TDpopupElementClass:\"\",TDpopupElementStyle:\"border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;position:absolute;width:auto;zIndex:110;\",SCToolbarbackground:\"background-color:#404040;\",SCTabbackground:\"background-color:#CCC;\",\nSCTabselectedCSS:\"display:inline-block;font-size:small;padding:6px 16px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;\",SCTabplainCSS:\"display:inline-block;font-size:small;padding:6px 16px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;\",SCToolbartext:\"font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;\",SCFormulabarheight:30,SCStatuslineheight:20,SCStatuslineCSS:\"font-size:10px;padding:3px 0px;\",SCFormatNumberFormats:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|[break]:|1\\\\c23:h:mm|1\\\\c23 PM:h:mm AM/PM|1\\\\c23\\\\c45:h:mm:ss|01\\\\c23\\\\c45:hh:mm:ss|26\\\\c23 (h\\\\cm):[hh]:mm|69\\\\c45 (m\\\\cs):[mm]:ss|69 (s):[ss]|[newcol]:|2006-01-04 01\\\\c23\\\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|\",\nSCFormatTextFormats:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|\",SCFormatPadsizes:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|\",\nSCFormatFontsizes:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|\",\nSCFormatFontfamilies:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|\",SCFormatFontlook:\"[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|%loc!Bold Italic!:italic bold\",SCFormatTextAlignhoriz:\"[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|\",SCFormatNumberAlignhoriz:\"[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|\",\nSCFormatAlignVertical:\"[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|\",SCFormatColwidth:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|\",SCFormatRecalc:\"[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|\",SCFormatUserMaxCol:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|Unlimited:0|10:10|20:20|30:30|40:40|50:50|60:60|80:80|100:100|\",\nSCFormatUserMaxRow:\"[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|Unlimited:0|10:10|20:20|30:30|40:40|50:50|60:60|80:80|100:100|\",ISCButtonBorderNormal:\"#404040\",ISCButtonBorderHover:\"#999\",ISCButtonBorderDown:\"#FFF\",ISCButtonDownBackground:\"#888\",s_PopupListCancel:\"[Cancel]\",s_PopupListCustom:\"Custom\",s_loc_align_center:\"Align Center\",s_loc_align_left:\"Align Left\",s_loc_align_right:\"Align Right\",s_loc_alignment:\"Alignment\",s_loc_audit:\"Audit\",s_loc_audit_trail_this_session:\"Audit Trail This Session\",\ns_loc_auto:\"Auto\",s_loc_auto_sum:\"Auto Sum\",s_loc_auto_wX_commas:\"Auto w/ commas\",s_loc_automatic:\"Automatic\",s_loc_background:\"Background\",s_loc_bold:\"Bold\",s_loc_bold_XampX_italics:\"Bold & Italics\",s_loc_bold_italic:\"Bold Italic\",s_loc_borders:\"Borders\",s_loc_borders_off:\"Borders Off\",s_loc_borders_on:\"Borders On\",s_loc_bottom:\"Bottom\",s_loc_bottom_border:\"Bottom Border\",s_loc_cell_settings:\"CELL SETTINGS\",s_loc_csv_format:\"CSV format\",s_loc_cancel:\"Cancel\",s_loc_category:\"Category\",s_loc_center:\"Center\",\ns_loc_clear:\"Clear\",s_loc_clear_socialcalc_clipboard:\"Clear SocialCalc Clipboard\",s_loc_clipboard:\"Clipboard\",s_loc_color:\"Color\",s_loc_column_:\"Column \",s_loc_comment:\"Comment\",s_loc_copy:\"Copy\",s_loc_custom:\"Custom\",s_loc_cut:\"Cut\",s_loc_default:\"Default\",s_loc_default_alignment:\"Default Alignment\",s_loc_default_column_width:\"Default Column Width\",s_loc_default_font:\"Default Font\",s_loc_default_format:\"Default Format\",s_loc_default_padding:\"Default Padding\",s_loc_delete:\"Delete\",s_loc_delete_column:\"Delete Column\",\ns_loc_delete_contents:\"Delete Contents\",s_loc_delete_row:\"Delete Row\",s_loc_description:\"Description\",s_loc_display_clipboard_in:\"Display Clipboard in\",s_loc_down:\"Down\",s_loc_edit:\"Edit\",s_loc_existing_names:\"Existing Names\",s_loc_family:\"Family\",s_loc_fill_down:\"Fill Down\",s_loc_fill_right:\"Fill Right\",s_loc_font:\"Font\",s_loc_format:\"Format\",s_loc_formula:\"Formula\",s_loc_function_list:\"Function List\",s_loc_functions:\"Functions\",s_loc_grid:\"Grid\",s_loc_hidden:\"Hidden\",s_loc_hide_column:\"Hide Column\",\ns_loc_hide_row:\"Hide Row\",s_loc_horizontal:\"Horizontal\",s_loc_insert_column:\"Insert Column\",s_loc_insert_row:\"Insert Row\",s_loc_italic:\"Italic\",s_loc_last_sort:\"Last Sort\",s_loc_left:\"Left\",s_loc_left_border:\"Left Border\",s_loc_link:\"Link\",s_loc_link_input_box:\"Link Input Box\",s_loc_list:\"List\",s_loc_load_socialcalc_clipboard_with_this:\"Load SocialCalc Clipboard With This\",s_loc_lock:\"Lock\",s_loc_major_sort:\"Major Sort\",s_loc_manual:\"Manual\",s_loc_merge_cells:\"Merge Cells\",s_loc_middle:\"Middle\",s_loc_minor_sort:\"Minor Sort\",\ns_loc_move_insert:\"Move Insert\",s_loc_move_paste:\"Move Paste\",s_loc_multiXline_input_box:\"Multi-line Input Box\",s_loc_name:\"Name\",s_loc_names:\"Names\",s_loc_no_padding:\"No padding\",s_loc_normal:\"Normal\",s_loc_number:\"Number\",s_loc_number_horizontal:\"Number Horizontal\",s_loc_ok:\"OK\",s_loc_padding:\"Padding\",s_loc_page_name:\"Page Name\",s_loc_paste:\"Paste\",s_loc_paste_formats:\"Paste Formats\",s_loc_plain_text:\"Plain Text\",s_loc_recalc:\"Recalc\",s_loc_recalculation:\"Recalculation\",s_loc_redo:\"Redo\",s_loc_right:\"Right\",\ns_loc_right_border:\"Right Border\",s_loc_sheet_settings:\"SHEET SETTINGS\",s_loc_save:\"Save\",s_loc_save_to:\"Save to\",s_loc_set_cell_contents:\"Set Cell Contents\",s_loc_set_cells_to_sort:\"Set Cells To Sort\",s_loc_set_value_to:\"Set Value To\",s_loc_set_to_link_format:\"Set to Link format\",s_loc_setXclear_move_from:\"Set/Clear Move From\",s_loc_show_cell_settings:\"Show Cell Settings\",s_loc_show_sheet_settings:\"Show Sheet Settings\",s_loc_show_in_new_browser_window:\"Show in new browser window\",s_loc_size:\"Size\",\ns_loc_socialcalcXsave_format:\"SocialCalc-save format\",s_loc_sort:\"Sort\",s_loc_sort_:\"Sort \",s_loc_sort_cells:\"Sort Cells\",s_loc_swap_colors:\"Swap Colors\",s_loc_tabXdelimited_format:\"Tab-delimited format\",s_loc_text:\"Text\",s_loc_text_horizontal:\"Text Horizontal\",s_loc_this_is_aXbrXsample:\"This is a<br>sample\",s_loc_top:\"Top\",s_loc_top_border:\"Top Border\",s_loc_undone_steps:\"UNDONE STEPS\",s_loc_url:\"URL\",s_loc_undo:\"Undo\",s_loc_unlock:\"Unlock\",s_loc_unmerge_cells:\"Unmerge Cells\",s_loc_up:\"Up\",s_loc_value:\"Value\",\ns_loc_vertical:\"Vertical\",s_loc_wikitext:\"Wikitext\",s_loc_workspace:\"Workspace\",s_loc_XnewX:\"[New]\",s_loc_XnoneX:\"[None]\",s_loc_Xselect_rangeX:\"[select range]\",SVStatuslineheight:20,SVStatuslineCSS:\"font-size:10px;padding:3px 0px;\",FormatNumber_separatorchar:\",\",FormatNumber_decimalchar:\".\",FormatNumber_defaultCurrency:\"$\",s_FormatNumber_daynames:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),s_FormatNumber_daynames3:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),s_FormatNumber_monthnames:\"January February March April May June July August September October November December\".split(\" \"),\ns_FormatNumber_monthnames3:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),s_FormatNumber_am:\"AM\",s_FormatNumber_am1:\"A\",s_FormatNumber_pm:\"PM\",s_FormatNumber_pm1:\"P\",s_parseerrexponent:\"Improperly formed number exponent\",s_parseerrchar:\"Unexpected character in formula\",s_parseerrstring:\"Improperly formed string\",s_parseerrspecialvalue:\"Improperly formed special value\",s_parseerrtwoops:\"Error in formula (two operators inappropriately in a row)\",s_parseerrmissingopenparen:\"Missing open parenthesis in list with comma(s). \",\ns_parseerrcloseparennoopen:\"Closing parenthesis without open parenthesis. \",s_parseerrmissingcloseparen:\"Missing close parenthesis. \",s_parseerrmissingoperand:\"Missing operand. \",s_parseerrerrorinformula:\"Error in formula.\",s_calcerrerrorvalueinformula:\"Error value in formula\",s_parseerrerrorinformulabadval:\"Error in formula resulting in bad value\",s_formularangeresult:\"Formula results in range value:\",s_calcerrnumericnan:\"Formula results in an bad numeric value\",s_calcerrnumericoverflow:\"Numeric overflow\",\ns_sheetunavailable:\"Sheet unavailable:\",s_calcerrcellrefmissing:\"Cell reference missing when expected.\",s_calcerrsheetnamemissing:\"Sheet name missing when expected.\",s_circularnameref:\"Circular name reference to name\",s_calcerrunknownname:\"Unknown name\",s_calcerrincorrectargstofunction:\"Incorrect arguments to function\",s_sheetfuncunknownfunction:\"Unknown function\",s_sheetfunclnarg:\"LN argument must be greater than 0\",s_sheetfunclog10arg:\"LOG10 argument must be greater than 0\",s_sheetfunclogsecondarg:\"LOG second argument must be numeric greater than 0\",\ns_sheetfunclogfirstarg:\"LOG first argument must be greater than 0\",s_sheetfuncroundsecondarg:\"ROUND second argument must be numeric\",s_sheetfuncddblife:\"DDB life must be greater than 1\",s_sheetfuncslnlife:\"SLN life must be greater than 1\",s_fdef_ABS:\"Absolute value function. \",s_fdef_ACOS:\"Trigonometric arccosine function. \",s_fdef_AND:\"True if all arguments are true. \",s_fdef_ASIN:\"Trigonometric arcsine function. \",s_fdef_ATAN:\"Trigonometric arctan function. \",s_fdef_ATAN2:\"Trigonometric arc tangent function (result is in radians). \",\ns_fdef_AVERAGE:\"Averages the values. \",s_fdef_CHOOSE:\"Returns the value specified by the index. The values may be ranges of cells. \",s_fdef_COLUMNS:\"Returns the number of columns in the range. \",s_fdef_COS:\"Trigonometric cosine function (value is in radians). \",s_fdef_COUNT:\"Counts the number of numeric values, not blank, text, or error. \",s_fdef_COUNTA:\"Counts the number of non-blank values. \",s_fdef_COUNTBLANK:'Counts the number of blank values. (Note: \"\" is not blank.) ',s_fdef_COUNTIF:'Counts the number of number of cells in the range that meet the criteria. The criteria may be a value (\"x\", 15, 1+3) or a test (>25). ',\ns_fdef_DATE:'Returns the appropriate date value given numbers for year, month, and day. For example: DATE(2006,2,1) for February 1, 2006. Note: In this program, day \"1\" is December 31, 1899 and the year 1900 is not a leap year. Some programs use January 1, 1900, as day \"1\" and treat 1900 as a leap year. In both cases, though, dates on or after March 1, 1900, are the same. ',s_fdef_DAVERAGE:\"Averages the values in the specified field in records that meet the criteria. \",s_fdef_DAY:\"Returns the day of month for a date value. \",\ns_fdef_DCOUNT:\"Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. \",s_fdef_DCOUNTA:\"Counts the number of non-blank values in the specified field in records that meet the criteria. \",s_fdef_DDB:\"Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). \",s_fdef_DEGREES:\"Converts value in radians into degrees. \",s_fdef_DGET:\"Returns the value of the specified field in the single record that meets the criteria. \",\ns_fdef_DMAX:\"Returns the maximum of the numeric values in the specified field in records that meet the criteria. \",s_fdef_DMIN:\"Returns the maximum of the numeric values in the specified field in records that meet the criteria. \",s_fdef_DPRODUCT:\"Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. \",s_fdef_DSTDEV:\"Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. \",s_fdef_DSTDEVP:\"Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. \",\ns_fdef_DSUM:\"Returns the sum of the numeric values in the specified field in records that meet the criteria. \",s_fdef_DVAR:\"Returns the sample variance of the numeric values in the specified field in records that meet the criteria. \",s_fdef_DVARP:\"Returns the variance of the numeric values in the specified field in records that meet the criteria. \",s_fdef_EVEN:\"Rounds the value up in magnitude to the nearest even integer. \",s_fdef_EXACT:'Returns \"true\" if the values are exactly the same, including case, type, etc. ',\ns_fdef_EXP:\"Returns e raised to the value power. \",s_fdef_FACT:\"Returns factorial of the value. \",s_fdef_FALSE:'Returns the logical value \"false\". ',s_fdef_FIND:'Returns the starting position within string2 of the first occurrence of string1 at or after \"start\". If start is omitted, 1 is assumed. ',s_fdef_FV:\"Returns the future value of repeated payments of money invested at the given rate for the specified number of periods, with optional present value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). \",\ns_fdef_HLOOKUP:\"Look for the matching value for the given value in the range and return the corresponding value in the cell specified by the row offset. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match. \",s_fdef_HOUR:\"Returns the hour portion of a time or date/time value. \",s_fdef_IF:\"Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. \",s_fdef_INDEX:\"Returns a cell or range reference for the specified row and column in the range. If range is 1-dimensional, then only one of rownum or colnum are needed. If range is 2-dimensional and rownum or colnum are zero, a reference to the range of just the specified column or row is returned. You can use the returned reference value in a range, e.g., sum(A1:INDEX(A2:A10,4)). \",\ns_fdef_INT:\"Returns the value rounded down to the nearest integer (towards -infinity). \",s_fdef_IRR:\"Returns the interest rate at which the cash flows in the range have a net present value of zero. Uses an iterative process that will return #NUM! error if it does not converge. There may be more than one possible solution. Providing the optional guess value may help in certain situations where it does not converge or finds an inappropriate solution (the default guess is 10%). \",s_fdef_ISBLANK:'Returns \"true\" if the value is a reference to a blank cell. ',\ns_fdef_ISERR:'Returns \"true\" if the value is of type \"Error\" but not \"NA\". ',s_fdef_ISERROR:'Returns \"true\" if the value is of type \"Error\". ',s_fdef_ISLOGICAL:'Returns \"true\" if the value is of type \"Logical\" (true/false). ',s_fdef_ISNA:'Returns \"true\" if the value is the error type \"NA\". ',s_fdef_ISNONTEXT:'Returns \"true\" if the value is not of type \"Text\". ',s_fdef_ISNUMBER:'Returns \"true\" if the value is of type \"Number\" (including logical values). ',s_fdef_ISTEXT:'Returns \"true\" if the value is of type \"Text\". ',\ns_fdef_LEFT:\"Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. \",s_fdef_LEN:\"Returns the number of characters in the text value. \",s_fdef_LN:\"Returns the natural logarithm of the value. \",s_fdef_LOG:\"Returns the logarithm of the value using the specified base. \",s_fdef_LOG10:\"Returns the base 10 logarithm of the value. \",s_fdef_LOWER:\"Returns the text value with all uppercase characters converted to lowercase. \",s_fdef_MATCH:\"Look for the matching value for the given value in the range and return position (the first is 1) in that range. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match. If rangelookup is -1, act like 1 but the bracket is match>=value. \",\ns_fdef_MAX:\"Returns the maximum of the numeric values. \",s_fdef_MID:\"Returns the specified number of characters from the text value starting from the specified position. \",s_fdef_MIN:\"Returns the minimum of the numeric values. \",s_fdef_MINUTE:\"Returns the minute portion of a time or date/time value. \",s_fdef_MOD:\"Returns the remainder of the first value divided by the second. \",s_fdef_MONTH:\"Returns the month part of a date value. \",s_fdef_N:\"Returns the value if it is a numeric value otherwise an error. \",\ns_fdef_NA:\"Returns the #N/A error value which propagates through most operations. \",s_fdef_NOT:\"Returns FALSE if value is true, and TRUE if it is false. \",s_fdef_NOW:\"Returns the current date/time. \",s_fdef_NPER:\"Returns the number of periods at which payments invested each period at the given rate with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period) has the given present value. \",s_fdef_NPV:\"Returns the net present value of cash flows (which may be individual values and/or ranges) at the given rate. The flows are positive if income, negative if paid out, and are assumed at the end of each period. \",\ns_fdef_ODD:\"Rounds the value up in magnitude to the nearest odd integer. \",s_fdef_OR:\"True if any argument is true \",s_fdef_PI:\"The value 3.1415926... \",s_fdef_PMT:\"Returns the amount of each payment that must be invested at the given rate for the specified number of periods to have the specified present value, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). \",s_fdef_POWER:\"Returns the first value raised to the second value power. \",\ns_fdef_PRODUCT:\"Returns the result of multiplying the numeric values. \",s_fdef_PROPER:\"Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. \",s_fdef_PV:\"Returns the present value of the given number of payments each invested at the given rate, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). \",s_fdef_RADIANS:\"Converts value in degrees into radians. \",s_fdef_RATE:\"Returns the rate at which the given number of payments each invested at the given rate has the specified present value, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). Uses an iterative process that will return #NUM! error if it does not converge. There may be more than one possible solution. Providing the optional guess value may help in certain situations where it does not converge or finds an inappropriate solution (the default guess is 10%). \",\ns_fdef_REPLACE:\"Returns text1 with the specified number of characters starting from the specified position replaced by text2. \",s_fdef_REPT:\"Returns the text repeated the specified number of times. \",s_fdef_RIGHT:\"Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. \",s_fdef_ROUND:\"Rounds the value to the specified number of decimal places. If precision is negative, then round to powers of 10. The default precision is 0 (round to integer). \",\ns_fdef_ROWS:\"Returns the number of rows in the range. \",s_fdef_SECOND:\"Returns the second portion of a time or date/time value (truncated to an integer). \",s_fdef_SIN:\"Trigonometric sine function (value is in radians) \",s_fdef_SLN:\"Returns the amount of depreciation at each period of time using the straight-line method. \",s_fdef_SQRT:\"Square root of the value \",s_fdef_STDEV:\"Returns the sample standard deviation of the numeric values. \",s_fdef_STDEVP:\"Returns the standard deviation of the numeric values. \",\ns_fdef_SUBSTITUTE:'Returns text1 with the all occurrences of oldtext replaced by newtext. If \"occurrence\" is present, then only that occurrence is replaced. ',s_fdef_SUM:\"Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. \",s_fdef_SUMIF:'Sums the numeric values of cells in the range that meet the criteria. The criteria may be a value (\"x\", 15, 1+3) or a test (>25). If range2 is present, then range1 is tested and the corresponding range2 value is summed. ',\ns_fdef_SYD:\"Depreciation by Sum of Year's Digits method. \",s_fdef_T:\"Returns the text value or else a null string. \",s_fdef_TAN:\"Trigonometric tangent function (value is in radians) \",s_fdef_TIME:\"Returns the time value given the specified hour, minute, and second. \",s_fdef_TODAY:'Returns the current date (an integer). Note: In this program, day \"1\" is December 31, 1899 and the year 1900 is not a leap year. Some programs use January 1, 1900, as day \"1\" and treat 1900 as a leap year. In both cases, though, dates on or after March 1, 1900, are the same. ',\ns_fdef_TRIM:\"Returns the text value with leading, trailing, and repeated spaces removed. \",s_fdef_TRUE:'Returns the logical value \"true\". ',s_fdef_TRUNC:\"Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. \",s_fdef_UPPER:\"Returns the text value with all lowercase characters converted to uppercase. \",s_fdef_VALUE:\"Converts the specified text value into a numeric value. Various forms that look like numbers (including digits followed by %, forms that look like dates, etc.) are handled. This may not handle all of the forms accepted by other spreadsheets and may be locale dependent. \",\ns_fdef_VAR:\"Returns the sample variance of the numeric values. \",s_fdef_VARP:\"Returns the variance of the numeric values. \",s_fdef_VLOOKUP:\"Look for the matching value for the given value in the range and return the corresponding value in the cell specified by the column offset. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match>=value) instead of exact match. \",s_fdef_WEEKDAY:\"Returns the day of week specified by the date value. If type is 1 (the default), Sunday is day and Saturday is day 7. If type is 2, Monday is day 1 and Sunday is day 7. If type is 3, Monday is day 0 and Sunday is day 6. \",\ns_fdef_YEAR:\"Returns the year part of a date value. \",s_fdef_SUMPRODUCT:\"Sums the pairwise products of 2 or more ranges. The ranges must be of equal length.\",s_fdef_CEILING:\"Rounds the given number up to the nearest integer or multiple of significance. Significance is the value to whose multiple of ten the value is to be rounded up (.01, .1, 1, 10, etc.)\",s_fdef_FLOOR:\"Rounds the given number down to the nearest multiple of significance. Significance is the value to whose multiple of ten the number is to be rounded down (.01, .1, 1, 10, etc.)\",\ns_farg_v:\"value\",s_farg_vn:\"value1, value2, ...\",s_farg_xy:\"valueX, valueY\",s_farg_choose:\"index, value1, value2, ...\",s_farg_range:\"range\",s_farg_rangec:\"range, criteria\",s_farg_date:\"year, month, day\",s_farg_dfunc:\"databaserange, fieldname, criteriarange\",s_farg_ddb:\"cost, salvage, lifetime, period, [factor]\",s_farg_find:\"string1, string2, [start]\",s_farg_fv:\"rate, n, payment, [pv, [paytype]]\",s_farg_hlookup:\"value, range, row, [rangelookup]\",s_farg_iffunc:\"logical-expression, true-value, [false-value]\",\ns_farg_index:\"range, rownum, colnum\",s_farg_irr:\"range, [guess]\",s_farg_tc:\"text, count\",s_farg_log:\"value, base\",s_farg_match:\"value, range, [rangelookup]\",s_farg_mid:\"text, start, length\",s_farg_nper:\"rate, payment, pv, [fv, [paytype]]\",s_farg_npv:\"rate, value1, value2, ...\",s_farg_pmt:\"rate, n, pv, [fv, [paytype]]\",s_farg_pv:\"rate, n, payment, [fv, [paytype]]\",s_farg_rate:\"n, payment, pv, [fv, [paytype, [guess]]]\",s_farg_replace:\"text1, start, length, text2\",s_farg_vp:\"value, [precision]\",s_farg_valpre:\"value, precision\",\ns_farg_csl:\"cost, salvage, lifetime\",s_farg_cslp:\"cost, salvage, lifetime, period\",s_farg_subs:\"text1, oldtext, newtext, [occurrence]\",s_farg_sumif:\"range1, criteria, [range2]\",s_farg_hms:\"hour, minute, second\",s_farg_txt:\"text\",s_farg_vlookup:\"value, range, col, [rangelookup]\",s_farg_weekday:\"date, [type]\",s_farg_dt:\"date\",s_farg_rangen:\"range1, range2, ...\",s_farg_vsig:\"value, [significance]\",function_classlist:\"all stat lookup datetime financial test math text\".split(\" \"),s_fclass_all:\"All\",s_fclass_stat:\"Statistics\",\ns_fclass_lookup:\"Lookup\",s_fclass_datetime:\"Date & Time\",s_fclass_financial:\"Financial\",s_fclass_test:\"Test\",s_fclass_math:\"Math\",s_fclass_text:\"Text\",s_loc_to:\"to\",s_loc_tiddler:\"Tiddler\",s_loc_import:\"Import\",s_loc_export:\"Export\",s_loc_XclipboardX:\"[Clipboard]\",s_clipboard_menu_title:\"Import/Export<br>and Clipboard\",s_clipboard_export_error_tiddler_exists:\"Tiddler exists\",s_clipboard_export_error_tiddler_overwrite:\"Do you want to overwrite it ?\",s_clipboard_import_error_tiddler_format:\"Format error: tiddler's format field have incorrect value.\",\ns_loc_save_changes:\"Save changes\",s_notification_tiddler:\"Saved ~SocialCalc sheet\",lastone:null};\nSocialCalc.ConstantsDefaultClasses={defaultComment:\"\",defaultCommentNoGrid:\"\",defaultHighlightTypeCursor:\"\",defaultHighlightTypeRange:\"\",defaultColname:\"\",defaultSelectedColname:\"\",defaultRowname:\"\",defaultSelectedRowname:\"\",defaultUpperLeft:\"\",defaultSkippedCell:\"\",defaultPaneDivider:\"\",cteGriddiv:\"\",defaultInputEcho:{classname:\"\",style:\"filter:alpha(opacity=90);opacity:.9;\"},TCmain:\"\",TCendcap:\"\",TCpaneslider:\"\",TClessbutton:\"\",TCmorebutton:\"\",TCscrollarea:\"\",TCthumb:\"\",TCPStrackingline:\"\",TCTDFSthumbstatus:\"\",\nTDpopupElement:\"\"};SocialCalc.ConstantsDefaultClasses.defaultComment={classname:\"\",style:\"background-image:url(images/sc-commentbg.gif);\"};SocialCalc.ConstantsDefaultClasses.defaultInputEcho=\"\";SocialCalc.ConstantsSetClasses=function(a){var c=SocialCalc.ConstantsDefaultClasses,b=SocialCalc.Constants,d;a=a||\"\";for(d in c)\"string\"==typeof c[d]?(b[d+\"Class\"]=a+(c[d]||d),void 0!==b[d+\"Style\"]&&(b[d+\"Style\"]=\"\")):\"object\"==typeof c[d]&&(b[d+\"Class\"]=a+(c[d].classname||d),b[d+\"Style\"]=c[d].style)};\nSocialCalc.ConstantsSetImagePrefix=function(a){var c=SocialCalc.Constants,b;for(b in c)\"string\"==typeof c[b]&&(c[b]=c[b].replace(c.defaultImagePrefix,a));c.defaultImagePrefix=a};SocialCalc||(SocialCalc={});SocialCalc.Callbacks={expand_wiki:null,expand_markup:function(a,c,b){return SocialCalc.default_expand_markup(a,c,b)},MakePageLink:null,NormalizeSheetName:null};SocialCalc.Cell=function(a){this.coord=a;this.datavalue=\"\";this.datatype=null;this.formula=\"\";this.valuetype=\"b\";this.readonly=!1};\nSocialCalc.CellProperties={coord:1,datavalue:1,datatype:1,formula:1,valuetype:1,errors:1,comment:1,readonly:1,bt:2,br:2,bb:2,bl:2,layout:2,font:2,color:2,bgcolor:2,cellformat:2,nontextvalueformat:2,textvalueformat:2,colspan:2,rowspan:2,cssc:2,csss:2,mod:2,displaystring:3,parseinfo:3,hcolspan:3,hrowspan:3};\nSocialCalc.CellPropertiesTable={bt:\"borderstyle\",br:\"borderstyle\",bb:\"borderstyle\",bl:\"borderstyle\",layout:\"layout\",font:\"font\",color:\"color\",bgcolor:\"color\",cellformat:\"cellformat\",nontextvalueformat:\"valueformat\",textvalueformat:\"valueformat\"};SocialCalc.Sheet=function(){SocialCalc.ResetSheet(this);this.statuscallbackparams=this.statuscallback=null};\nSocialCalc.ResetSheet=function(a,c){a.cells={};a.attribs={lastcol:1,lastrow:1,defaultlayout:0,usermaxcol:0,usermaxrow:0};a.rowattribs={hide:{},height:{}};a.colattribs={width:{},hide:{}};a.names={};a.layouts=[];a.layouthash={};a.fonts=[];a.fonthash={};a.colors=[];a.colorhash={};a.borderstyles=[];a.borderstylehash={};a.cellformats=[];a.cellformathash={};a.valueformats=[];a.valueformathash={};a.copiedfrom=\"\";a.changes=new SocialCalc.UndoStack;a.renderneeded=!1;a.changedrendervalues=!0;a.recalcchangedavalue=\n!1;a.hiddencolrow=\"\";a.sci=new SocialCalc.SheetCommandInfo(a)};SocialCalc.Sheet.prototype.ResetSheet=function(){SocialCalc.ResetSheet(this)};SocialCalc.Sheet.prototype.AddCell=function(a){return this.cells[a.coord]=a};SocialCalc.Sheet.prototype.GetAssuredCell=function(a){return this.cells[a]||this.AddCell(new SocialCalc.Cell(a))};SocialCalc.Sheet.prototype.ParseSheetSave=function(a){SocialCalc.ParseSheetSave(a,this)};\nSocialCalc.Sheet.prototype.CellFromStringParts=function(a,c,b){return SocialCalc.CellFromStringParts(this,a,c,b)};SocialCalc.Sheet.prototype.CreateSheetSave=function(a,c){return SocialCalc.CreateSheetSave(this,a,c)};SocialCalc.Sheet.prototype.CellToString=function(a){return SocialCalc.CellToString(this,a)};SocialCalc.Sheet.prototype.CanonicalizeSheet=function(a){return SocialCalc.CanonicalizeSheet(this,a)};\nSocialCalc.Sheet.prototype.EncodeCellAttributes=function(a){return SocialCalc.EncodeCellAttributes(this,a)};SocialCalc.Sheet.prototype.EncodeSheetAttributes=function(){return SocialCalc.EncodeSheetAttributes(this)};SocialCalc.Sheet.prototype.DecodeCellAttributes=function(a,c,b){return SocialCalc.DecodeCellAttributes(this,a,c,b)};SocialCalc.Sheet.prototype.DecodeSheetAttributes=function(a){return SocialCalc.DecodeSheetAttributes(this,a)};\nSocialCalc.Sheet.prototype.ScheduleSheetCommands=function(a,c){return SocialCalc.ScheduleSheetCommands(this,a,c)};SocialCalc.Sheet.prototype.SheetUndo=function(){return SocialCalc.SheetUndo(this)};SocialCalc.Sheet.prototype.SheetRedo=function(){return SocialCalc.SheetRedo(this)};SocialCalc.Sheet.prototype.CreateAuditString=function(){return SocialCalc.CreateAuditString(this)};SocialCalc.Sheet.prototype.GetStyleNum=function(a,c){return SocialCalc.GetStyleNum(this,a,c)};\nSocialCalc.Sheet.prototype.GetStyleString=function(a,c){return SocialCalc.GetStyleString(this,a,c)};SocialCalc.Sheet.prototype.RecalcSheet=function(){return SocialCalc.RecalcSheet(this)};\nSocialCalc.ParseSheetSave=function(a,c){var b=a.split(/\\r\\n|\\n/),d=[],e,f,g,l,h=SocialCalc.Constants;for(e=0;e<b.length;e++)switch(d=b[e],d=d.split(\":\"),d[0]){case \"cell\":g=c.GetAssuredCell(d[1]);f=2;c.CellFromStringParts(g,d,f);break;case \"col\":l=d[1];for(f=2;g=d[f++];)switch(g){case \"w\":c.colattribs.width[l]=d[f++];break;case \"hide\":c.colattribs.hide[l]=d[f++];break;default:throw h.s_pssUnknownColType+\" '\"+g+\"'\";}break;case \"row\":l=d[1]-0;for(f=2;g=d[f++];)switch(g){case \"h\":c.rowattribs.height[l]=\nd[f++]-0;break;case \"hide\":c.rowattribs.hide[l]=d[f++];break;default:throw h.s_pssUnknownRowType+\" '\"+g+\"'\";}break;case \"sheet\":l=c.attribs;for(f=1;g=d[f++];)switch(g){case \"c\":l.lastcol=d[f++]-0;break;case \"r\":l.lastrow=d[f++]-0;break;case \"w\":l.defaultcolwidth=d[f++]+\"\";break;case \"h\":l.defaultrowheight=d[f++]-0;break;case \"tf\":l.defaulttextformat=d[f++]-0;break;case \"ntf\":l.defaultnontextformat=d[f++]-0;break;case \"layout\":l.defaultlayout=d[f++]-0;break;case \"font\":l.defaultfont=d[f++]-0;break;\ncase \"tvf\":l.defaulttextvalueformat=d[f++]-0;break;case \"ntvf\":l.defaultnontextvalueformat=d[f++]-0;break;case \"color\":l.defaultcolor=d[f++]-0;break;case \"bgcolor\":l.defaultbgcolor=d[f++]-0;break;case \"circularreferencecell\":l.circularreferencecell=d[f++];break;case \"recalc\":l.recalc=d[f++];break;case \"needsrecalc\":l.needsrecalc=d[f++];break;case \"usermaxcol\":l.usermaxcol=d[f++]-0;break;case \"usermaxrow\":l.usermaxrow=d[f++]-0;break;default:f+=1}break;case \"name\":f=SocialCalc.decodeFromSave(d[1]).toUpperCase();\nc.names[f]={desc:SocialCalc.decodeFromSave(d[2])};c.names[f].definition=SocialCalc.decodeFromSave(d[3]);break;case \"layout\":d=b[e].match(/^layout\\:(\\d+)\\:(.+)$/);c.layouts[d[1]-0]=d[2];c.layouthash[d[2]]=d[1]-0;break;case \"font\":c.fonts[d[1]-0]=d[2];c.fonthash[d[2]]=d[1]-0;break;case \"color\":c.colors[d[1]-0]=d[2];c.colorhash[d[2]]=d[1]-0;break;case \"border\":c.borderstyles[d[1]-0]=d[2];c.borderstylehash[d[2]]=d[1]-0;break;case \"cellformat\":f=SocialCalc.decodeFromSave(d[2]);c.cellformats[d[1]-0]=f;\nc.cellformathash[f]=d[1]-0;break;case \"valueformat\":f=SocialCalc.decodeFromSave(d[2]);c.valueformats[d[1]-0]=f;c.valueformathash[f]=d[1]-0;break;case \"version\":break;case \"copiedfrom\":c.copiedfrom=d[1]+\":\"+d[2];break;case \"clipboardrange\":case \"clipboard\":break;case \"\":break;default:throw alert(h.s_pssUnknownLineType+\" '\"+d[0]+\"'\"),h.s_pssUnknownLineType+\" '\"+d[0]+\"'\";}};\nSocialCalc.CellFromStringParts=function(a,c,b,d){for(;a=b[d++];)switch(a){case \"v\":c.datavalue=SocialCalc.decodeFromSave(b[d++])-0;c.datatype=\"v\";c.valuetype=\"n\";break;case \"t\":c.datavalue=SocialCalc.decodeFromSave(b[d++]);c.datatype=\"t\";c.valuetype=SocialCalc.Constants.textdatadefaulttype;break;case \"vt\":a=b[d++];c.valuetype=a;\"n\"==a.charAt(0)?(c.datatype=\"v\",c.datavalue=SocialCalc.decodeFromSave(b[d++])-0):(c.datatype=\"t\",c.datavalue=SocialCalc.decodeFromSave(b[d++]));break;case \"vtf\":a=b[d++];\nc.valuetype=a;\"n\"==a.charAt(0)?c.datavalue=SocialCalc.decodeFromSave(b[d++])-0:c.datavalue=SocialCalc.decodeFromSave(b[d++]);c.formula=SocialCalc.decodeFromSave(b[d++]);c.datatype=\"f\";break;case \"vtc\":a=b[d++];c.valuetype=a;\"n\"==a.charAt(0)?c.datavalue=SocialCalc.decodeFromSave(b[d++])-0:c.datavalue=SocialCalc.decodeFromSave(b[d++]);c.formula=SocialCalc.decodeFromSave(b[d++]);c.datatype=\"c\";break;case \"ro\":ro=SocialCalc.decodeFromSave(b[d++]);c.readonly=\"yes\"==ro.toLowerCase();break;case \"e\":c.errors=\nSocialCalc.decodeFromSave(b[d++]);break;case \"b\":c.bt=b[d++]-0;c.br=b[d++]-0;c.bb=b[d++]-0;c.bl=b[d++]-0;break;case \"l\":c.layout=b[d++]-0;break;case \"f\":c.font=b[d++]-0;break;case \"c\":c.color=b[d++]-0;break;case \"bg\":c.bgcolor=b[d++]-0;break;case \"cf\":c.cellformat=b[d++]-0;break;case \"ntvf\":c.nontextvalueformat=b[d++]-0;break;case \"tvf\":c.textvalueformat=b[d++]-0;break;case \"colspan\":c.colspan=b[d++]-0;break;case \"rowspan\":c.rowspan=b[d++]-0;break;case \"cssc\":c.cssc=b[d++];break;case \"csss\":c.csss=\nSocialCalc.decodeFromSave(b[d++]);break;case \"mod\":d+=1;break;case \"comment\":c.comment=SocialCalc.decodeFromSave(b[d++]);break;default:throw SocialCalc.Constants.s_cfspUnknownCellType+\" '\"+a+\"'\";}};SocialCalc.sheetfields=\"defaultrowheight defaultcolwidth circularreferencecell recalc needsrecalc usermaxcol usermaxrow\".split(\" \");SocialCalc.sheetfieldsshort=\"h w circularreferencecell recalc needsrecalc usermaxcol usermaxrow\".split(\" \");SocialCalc.sheetfieldsxlat=\"defaulttextformat defaultnontextformat defaulttextvalueformat defaultnontextvalueformat defaultcolor defaultbgcolor defaultfont defaultlayout\".split(\" \");\nSocialCalc.sheetfieldsxlatshort=\"tf ntf tvf ntvf color bgcolor font layout\".split(\" \");SocialCalc.sheetfieldsxlatxlt=\"cellformat cellformat valueformat valueformat color color font layout\".split(\" \");\nSocialCalc.CreateSheetSave=function(a,c,b){var d,e,f,g,l,h=[];a.CanonicalizeSheet(b||SocialCalc.Constants.doCanonicalizeSheet);var m=a.xlt;e=c?SocialCalc.ParseRange(c):{cr1:{row:1,col:1},cr2:{row:m.maxrow,col:m.maxcol}};b=e.cr1;e=e.cr2;h.push(\"version:1.5\");for(f=b.row;f<=e.row;f++)for(g=b.col;g<=e.col;g++)if(l=SocialCalc.crToCoord(g,f),d=a.cells[l])d=a.CellToString(d),0!=d.length&&(d=\"cell:\"+l+d,h.push(d));for(g=1;g<=m.maxcol;g++)l=SocialCalc.rcColname(g),a.colattribs.width[l]&&h.push(\"col:\"+l+\":w:\"+\na.colattribs.width[l]),a.colattribs.hide[l]&&h.push(\"col:\"+l+\":hide:\"+a.colattribs.hide[l]);for(f=1;f<=m.maxrow;f++)a.rowattribs.height[f]&&h.push(\"row:\"+f+\":h:\"+a.rowattribs.height[f]),a.rowattribs.hide[f]&&h.push(\"row:\"+f+\":hide:\"+a.rowattribs.hide[f]);d=\"sheet:c:\"+m.maxcol+\":r:\"+m.maxrow;for(f=0;f<SocialCalc.sheetfields.length;f++)(g=SocialCalc.encodeForSave(a.attribs[SocialCalc.sheetfields[f]]))&&(d+=\":\"+SocialCalc.sheetfieldsshort[f]+\":\"+g);for(f=0;f<SocialCalc.sheetfieldsxlat.length;f++)(g=\na.attribs[SocialCalc.sheetfieldsxlat[f]])&&(d+=\":\"+SocialCalc.sheetfieldsxlatshort[f]+\":\"+m[SocialCalc.sheetfieldsxlatxlt[f]+\"sxlat\"][g]);h.push(d);for(f=1;f<m.newborderstyles.length;f++)h.push(\"border:\"+f+\":\"+m.newborderstyles[f]);for(f=1;f<m.newcellformats.length;f++)h.push(\"cellformat:\"+f+\":\"+SocialCalc.encodeForSave(m.newcellformats[f]));for(f=1;f<m.newcolors.length;f++)h.push(\"color:\"+f+\":\"+m.newcolors[f]);for(f=1;f<m.newfonts.length;f++)h.push(\"font:\"+f+\":\"+m.newfonts[f]);for(f=1;f<m.newlayouts.length;f++)h.push(\"layout:\"+\nf+\":\"+m.newlayouts[f]);for(f=1;f<m.newvalueformats.length;f++)h.push(\"valueformat:\"+f+\":\"+SocialCalc.encodeForSave(m.newvalueformats[f]));for(f=0;f<m.namesorder.length;f++)d=m.namesorder[f],h.push(\"name:\"+SocialCalc.encodeForSave(d).toUpperCase()+\":\"+SocialCalc.encodeForSave(a.names[d].desc)+\":\"+SocialCalc.encodeForSave(a.names[d].definition));c&&h.push(\"copiedfrom:\"+SocialCalc.crToCoord(b.col,b.row)+\":\"+SocialCalc.crToCoord(e.col,e.row));h.push(\"\");delete a.xlt;return h.join(\"\\n\")};\nSocialCalc.CellToString=function(a,c){var b,d,e,f,g,l;b=\"\";if(!c)return b;d=SocialCalc.encodeForSave(c.datavalue);\"v\"==c.datatype?b=\"n\"==c.valuetype?b+(\":v:\"+d):b+(\":vt:\"+c.valuetype+\":\"+d):\"t\"==c.datatype?b=c.valuetype==SocialCalc.Constants.textdatadefaulttype?b+(\":t:\"+d):b+(\":vt:\"+c.valuetype+\":\"+d):(e=SocialCalc.encodeForSave(c.formula),\"f\"==c.datatype?b+=\":vtf:\"+c.valuetype+\":\"+d+\":\"+e:\"c\"==c.datatype&&(b+=\":vtc:\"+c.valuetype+\":\"+d+\":\"+e));c.readonly&&(b+=\":ro:yes\");c.errors&&(b+=\":e:\"+SocialCalc.encodeForSave(c.errors));\nd=c.bt||\"\";e=c.br||\"\";f=c.bb||\"\";g=c.bl||\"\";if(a.xlt){l=a.xlt;if(d||e||f||g)b+=\":b:\"+l.borderstylesxlat[d||0]+\":\"+l.borderstylesxlat[e||0]+\":\"+l.borderstylesxlat[f||0]+\":\"+l.borderstylesxlat[g||0];c.layout&&(b+=\":l:\"+l.layoutsxlat[c.layout]);c.font&&(b+=\":f:\"+l.fontsxlat[c.font]);c.color&&(b+=\":c:\"+l.colorsxlat[c.color]);c.bgcolor&&(b+=\":bg:\"+l.colorsxlat[c.bgcolor]);c.cellformat&&(b+=\":cf:\"+l.cellformatsxlat[c.cellformat]);c.textvalueformat&&(b+=\":tvf:\"+l.valueformatsxlat[c.textvalueformat]);c.nontextvalueformat&&\n(b+=\":ntvf:\"+l.valueformatsxlat[c.nontextvalueformat])}else{if(d||e||f||g)b+=\":b:\"+d+\":\"+e+\":\"+f+\":\"+g;c.layout&&(b+=\":l:\"+c.layout);c.font&&(b+=\":f:\"+c.font);c.color&&(b+=\":c:\"+c.color);c.bgcolor&&(b+=\":bg:\"+c.bgcolor);c.cellformat&&(b+=\":cf:\"+c.cellformat);c.textvalueformat&&(b+=\":tvf:\"+c.textvalueformat);c.nontextvalueformat&&(b+=\":ntvf:\"+c.nontextvalueformat)}c.colspan&&(b+=\":colspan:\"+c.colspan);c.rowspan&&(b+=\":rowspan:\"+c.rowspan);c.cssc&&(b+=\":cssc:\"+c.cssc);c.csss&&(b+=\":csss:\"+SocialCalc.encodeForSave(c.csss));\nc.mod&&(b+=\":mod:\"+c.mod);c.comment&&(b+=\":comment:\"+SocialCalc.encodeForSave(c.comment));return b};\nSocialCalc.CanonicalizeSheet=function(a,c){var b,d,e,f,g,l,h,m=0,p=0,r=\"borderstyle cellformat color font layout valueformat\".split(\" \"),q={namesorder:[]};for(g in a.names)q.namesorder.push(g);q.namesorder.sort();if(SocialCalc.Constants.doCanonicalizeSheet&&c){for(f=0;f<r.length;f++)g=r[f],q[g+\"sUsed\"]={};h=q.colorsUsed;l=q.borderstylesUsed;var n=q.fontsUsed,s=q.layoutsUsed,t=q.cellformatsUsed,u=q.valueformatsUsed;for(d in a.cells)e=SocialCalc.coordToCr(d),f=a.cells[d],g=!1,f.valuetype&&\"b\"!=f.valuetype&&\n(g=!0),f.color&&(h[f.color]=1,g=!0),f.bgcolor&&(h[f.bgcolor]=1,g=!0),f.bt&&(l[f.bt]=1,g=!0),f.br&&(l[f.br]=1,g=!0),f.bb&&(l[f.bb]=1,g=!0),f.bl&&(l[f.bl]=1,g=!0),f.layout&&(s[f.layout]=1,g=!0),f.font&&(n[f.font]=1,g=!0),f.cellformat&&(t[f.cellformat]=1,g=!0),f.textvalueformat&&(u[f.textvalueformat]=1,g=!0),f.nontextvalueformat&&(u[f.nontextvalueformat]=1,g=!0),g&&(e.row>m&&(m=e.row),e.col>p&&(p=e.col));for(h=0;h<SocialCalc.sheetfieldsxlat.length;h++)(b=a.attribs[SocialCalc.sheetfieldsxlat[h]])&&(q[SocialCalc.sheetfieldsxlatxlt[h]+\n\"sUsed\"][b]=1);g={height:1,hide:1};for(b in g)for(e in a.rowattribs[b])e>m&&(m=e);g={hide:1,width:1};for(b in g)for(d in a.colattribs[b])e=SocialCalc.coordToCr(d+\"1\"),e.col>p&&(p=e.col);for(f=0;f<r.length;f++){g=r[f];d=[];e=q[g+\"sUsed\"];for(b in e)d.push(a[g+\"s\"][b]);d.sort();d.unshift(\"\");e=[\"\"];l=a[g+\"hash\"];for(h=1;h<d.length;h++)e[l[d[h]]]=h;q[g+\"sxlat\"]=e;q[\"new\"+g+\"s\"]=d}q.maxrow=m||1;q.maxcol=p||1}else{for(f=0;f<r.length;f++){g=r[f];q[\"new\"+g+\"s\"]=a[g+\"s\"];b=a[g+\"s\"].length;e=Array(b);e[0]=\n\"\";for(h=1;h<b;h++)e[h]=h;q[g+\"sxlat\"]=e}q.maxrow=a.attribs.lastrow;q.maxcol=a.attribs.lastcol}a.xlt=q};\nSocialCalc.EncodeCellAttributes=function(a,c){var b,d,e={},f=function(a){e[a]={def:!0,val:\"\"}},g=function(a){for(var b=0;b<a.length;b++)f(a[b])},l=function(a,b){e[a].def=!1;e[a].val=b||\"\"};b=function(a,b){\"*\"!=b&&(e[a].def=!1,e[a].val=b)};var h=a.GetAssuredCell(c);f(\"alignhoriz\");h.cellformat&&l(\"alignhoriz\",a.cellformats[h.cellformat]);g([\"alignvert\",\"padtop\",\"padright\",\"padbottom\",\"padleft\"]);h.layout&&(parts=a.layouts[h.layout].match(/^padding:\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+);vertical-align:\\s*(\\S+);/),\nb(\"padtop\",parts[1]),b(\"padright\",parts[2]),b(\"padbottom\",parts[3]),b(\"padleft\",parts[4]),b(\"alignvert\",parts[5]));g([\"fontfamily\",\"fontlook\",\"fontsize\"]);h.font&&(parts=a.fonts[h.font].match(/^(\\*|\\S+? \\S+?) (\\S+?) (\\S.*)$/),b(\"fontfamily\",parts[3]),b(\"fontsize\",parts[2]),b(\"fontlook\",parts[1]));f(\"textcolor\");h.color&&l(\"textcolor\",a.colors[h.color]);f(\"bgcolor\");h.bgcolor&&l(\"bgcolor\",a.colors[h.bgcolor]);g([\"numberformat\",\"textformat\"]);h.nontextvalueformat&&l(\"numberformat\",a.valueformats[h.nontextvalueformat]);\nh.textvalueformat&&l(\"textformat\",a.valueformats[h.textvalueformat]);g([\"colspan\",\"rowspan\"]);l(\"colspan\",h.colspan||1);l(\"rowspan\",h.rowspan||1);for(b=0;4>b;b++)d=\"trbl\".charAt(b),d=\"b\"+d,f(d),l(d,h[d]?a.borderstyles[h[d]]:\"\"),f(d+\"thickness\"),f(d+\"style\"),f(d+\"color\"),h[d]&&(parts=a.borderstyles[h[d]].match(/(\\S+)\\s+(\\S+)\\s+(\\S.+)/),l(d+\"thickness\",parts[1]),l(d+\"style\",parts[2]),l(d+\"color\",parts[3]));g([\"cssc\",\"csss\",\"mod\"]);l(\"cssc\",h.cssc||\"\");l(\"csss\",h.csss||\"\");l(\"mod\",h.mod||\"n\");return e};\nSocialCalc.EncodeSheetAttributes=function(a){var c=a.attribs,b={},d=function(a){b[a]={def:!0,val:\"\"}},e=function(a){for(var b=0;b<a.length;b++)d(a[b])},f=function(a,c){b[a].def=!1;b[a].val=c||void 0},g=function(a,c){\"*\"!=c&&(b[a].def=!1,b[a].val=c)};d(\"colwidth\");c.defaultcolwidth&&f(\"colwidth\",c.defaultcolwidth);d(\"rowheight\");c.rowheight&&f(\"rowheight\",c.defaultrowheight);d(\"textalignhoriz\");c.defaulttextformat&&f(\"textalignhoriz\",a.cellformats[c.defaulttextformat]);d(\"numberalignhoriz\");c.defaultnontextformat&&\nf(\"numberalignhoriz\",a.cellformats[c.defaultnontextformat]);e([\"alignvert\",\"padtop\",\"padright\",\"padbottom\",\"padleft\"]);c.defaultlayout&&(parts=a.layouts[c.defaultlayout].match(/^padding:\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+);vertical-align:\\s*(\\S+);/),g(\"padtop\",parts[1]),g(\"padright\",parts[2]),g(\"padbottom\",parts[3]),g(\"padleft\",parts[4]),g(\"alignvert\",parts[5]));e([\"fontfamily\",\"fontlook\",\"fontsize\"]);c.defaultfont&&(parts=a.fonts[c.defaultfont].match(/^(\\*|\\S+? \\S+?) (\\S+?) (\\S.*)$/),g(\"fontfamily\",\nparts[3]),g(\"fontsize\",parts[2]),g(\"fontlook\",parts[1]));d(\"textcolor\");c.defaultcolor&&f(\"textcolor\",a.colors[c.defaultcolor]);d(\"bgcolor\");c.defaultbgcolor&&f(\"bgcolor\",a.colors[c.defaultbgcolor]);e([\"numberformat\",\"textformat\"]);c.defaultnontextvalueformat&&f(\"numberformat\",a.valueformats[c.defaultnontextvalueformat]);c.defaulttextvalueformat&&f(\"textformat\",a.valueformats[c.defaulttextvalueformat]);d(\"recalc\");c.recalc&&f(\"recalc\",c.recalc);d(\"usermaxcol\");c.usermaxcol&&f(\"usermaxcol\",c.usermaxcol);\nd(\"usermaxrow\");c.usermaxrow&&f(\"usermaxrow\",c.usermaxrow);return b};\nSocialCalc.DecodeCellAttributes=function(a,c,b,d){var e,f=a.GetAssuredCell(c),g=!1,l=function(a,c,d){b[a]&&(a=b[a].def?\"\":b[a].val,a!=(c||\"\")&&m(d+\" \"+a))},h=\"\",m=function(a){h&&(h+=\"\\n\");h+=\"set \"+(d||c)+\" \"+a;g=!0};l(\"alignhoriz\",a.cellformats[f.cellformat],\"cellformat\");e=b.alignvert.def&&b.padtop.def&&b.padright.def&&b.padbottom.def&&b.padleft.def?\"\":\"padding:\"+(b.padtop.def?\"* \":b.padtop.val+\" \")+(b.padright.def?\"* \":b.padright.val+\" \")+(b.padbottom.def?\"* \":b.padbottom.val+\" \")+(b.padleft.def?\n\"*\":b.padleft.val)+\";vertical-align:\"+(b.alignvert.def?\"*;\":b.alignvert.val+\";\");e!=(a.layouts[f.layout]||\"\")&&m(\"layout \"+e);e=b.fontlook.def&&b.fontsize.def&&b.fontfamily.def?\"\":(b.fontlook.def?\"* \":b.fontlook.val+\" \")+(b.fontsize.def?\"* \":b.fontsize.val+\" \")+(b.fontfamily.def?\"*\":b.fontfamily.val);e!=(a.fonts[f.font]||\"\")&&m(\"font \"+e);l(\"textcolor\",a.colors[f.color],\"color\");l(\"bgcolor\",a.colors[f.bgcolor],\"bgcolor\");l(\"numberformat\",a.valueformats[f.nontextvalueformat],\"nontextvalueformat\");\nl(\"textformat\",a.valueformats[f.textvalueformat],\"textvalueformat\");for(i=0;4>i;i++)e=\"trbl\".charAt(i),e=\"b\"+e,l(e,a.borderstyles[f[e]],e);l(\"cssc\",f.cssc,\"cssc\");l(\"csss\",f.csss,\"csss\");b.mod&&(e=b.mod.def?\"n\":b.mod.val,e!=(f.mod||\"n\")&&(\"n\"==e&&(e=\"\"),m(\"mod \"+e)));return g?h:null};\nSocialCalc.DecodeSheetAttributes=function(a,c){var b,d=a.attribs,e=!1,f=function(a,b,d){c[a]&&(a=c[a].def?\"\":c[a].val,a!=(b||\"\")&&l(d+\" \"+a))},g=\"\",l=function(a){g&&(g+=\"\\n\");g+=\"set sheet \"+a;e=!0};f(\"colwidth\",d.defaultcolwidth,\"defaultcolwidth\");f(\"rowheight\",d.defaultrowheight,\"defaultrowheight\");f(\"textalignhoriz\",a.cellformats[d.defaulttextformat],\"defaulttextformat\");f(\"numberalignhoriz\",a.cellformats[d.defaultnontextformat],\"defaultnontextformat\");b=c.alignvert.def&&c.padtop.def&&c.padright.def&&\nc.padbottom.def&&c.padleft.def?\"\":\"padding:\"+(c.padtop.def?\"* \":c.padtop.val+\" \")+(c.padright.def?\"* \":c.padright.val+\" \")+(c.padbottom.def?\"* \":c.padbottom.val+\" \")+(c.padleft.def?\"*\":c.padleft.val)+\";vertical-align:\"+(c.alignvert.def?\"*;\":c.alignvert.val+\";\");b!=(a.layouts[d.defaultlayout]||\"\")&&l(\"defaultlayout \"+b);b=c.fontlook.def&&c.fontsize.def&&c.fontfamily.def?\"\":(c.fontlook.def?\"* \":c.fontlook.val+\" \")+(c.fontsize.def?\"* \":c.fontsize.val+\" \")+(c.fontfamily.def?\"*\":c.fontfamily.val);b!=(a.fonts[d.defaultfont]||\n\"\")&&l(\"defaultfont \"+b);f(\"textcolor\",a.colors[d.defaultcolor],\"defaultcolor\");f(\"bgcolor\",a.colors[d.defaultbgcolor],\"defaultbgcolor\");f(\"numberformat\",a.valueformats[d.defaultnontextvalueformat],\"defaultnontextvalueformat\");f(\"textformat\",a.valueformats[d.defaulttextvalueformat],\"defaulttextvalueformat\");f(\"recalc\",a.attribs.recalc,\"recalc\");f(\"usermaxcol\",a.attribs.usermaxcol,\"usermaxcol\");f(\"usermaxrow\",a.attribs.usermaxrow,\"usermaxrow\");return e?g:null};\nSocialCalc.SheetCommandInfo=function(a){this.sheetobj=a;this.timerobj=this.parseobj=null;this.firsttimerdelay=50;this.timerdelay=1;this.maxtimeslice=100;this.saveundo=!1;this.CmdExtensionCallbacks={};this.cmdextensionbusy=\"\"};\nSocialCalc.ScheduleSheetCommands=function(a,c,b){hack.log('\"'+c+'\"',hack.com,\"SocialCalc.ScheduleSheetCommands\");var d=a.sci;d.parseobj=new SocialCalc.Parse(c);d.saveundo=b;d.sheetobj.statuscallback&&a.statuscallback(d,\"cmdstart\",\"\",d.sheetobj.statuscallbackparams);d.saveundo&&d.sheetobj.changes.PushChange(\"\");d.timerobj=SocialCalc.Callbacks.broadcast?window.setTimeout(function(){var a=d.parseobj;d.parseobj=new SocialCalc.Parse(c);SocialCalc.SheetCommandsTimerRoutine(d);d.parseobj=a},d.firsttimerdelay):\nwindow.setTimeout(function(){SocialCalc.SheetCommandsTimerRoutine(d)},d.firsttimerdelay)};\nSocialCalc.SheetCommandsTimerRoutine=function(a){var c,b=new Date;for(a.timerobj=null;!a.parseobj.EOF();){(c=SocialCalc.ExecuteSheetCommand(a.sheetobj,a.parseobj,a.saveundo))&&alert(c);a.parseobj.NextLine();if(0<a.cmdextensionbusy.length){a.sheetobj.statuscallback&&a.sheetobj.statuscallback(a,\"cmdextension\",a.cmdextensionbusy,a.sheetobj.statuscallbackparams);return}if(new Date-b>=a.maxtimeslice){a.timerobj=window.setTimeout(function(){SocialCalc.SheetCommandsTimerRoutine(a)},a.timerdelay);return}}a.sheetobj.statuscallback&&\na.sheetobj.statuscallback(a,\"cmdend\",\"\",a.sheetobj.statuscallbackparams)};SocialCalc.ResumeFromCmdExtension=function(a){a.cmdextensionbusy=\"\";SocialCalc.SheetCommandsTimerRoutine(a)};\nSocialCalc.ExecuteSheetCommand=function(a,c,b){var d,e,f,g,l,h,m,p,r,q,n,s,t,u,w,v,x,y,z,C,D,G,I,E,H,B,A=a.attribs;B=a.changes;D=SocialCalc.CellProperties;w=SocialCalc.Constants;q=function(){var a=SocialCalc.ParseRange(g);p=a.cr1;r=a.cr2;r.col>A.lastcol&&(A.lastcol=r.col);r.row>A.lastrow&&(A.lastrow=r.row)};m=\"\";d=c.RestOfStringNoMove();b&&a.changes.AddDo(d);e=c.NextToken();TiddlyWiki&&(n=SocialCalc.GetSpreadsheetControlObject(),n.tiddlyWiki.monitorCallback&&n.tiddlyWiki.monitorCallback(d));switch(e){case \"set\":g=\nc.NextToken();l=c.NextToken();f=c.RestOfString();c=\"set \"+g+\" \"+l;if(\"sheet\"==g)switch(a.renderneeded=!0,l){case \"defaultcolwidth\":b&&B.AddUndo(c,A[l]);A[l]=f;break;case \"defaultcolor\":case \"defaultbgcolor\":b&&B.AddUndo(c,a.GetStyleString(\"color\",A[l]));A[l]=a.GetStyleNum(\"color\",f);break;case \"defaultlayout\":b&&B.AddUndo(c,a.GetStyleString(\"layout\",A[l]));A[l]=a.GetStyleNum(\"layout\",f);break;case \"defaultfont\":b&&B.AddUndo(c,a.GetStyleString(\"font\",A[l]));\"* * *\"==f&&(f=\"\");A[l]=a.GetStyleNum(\"font\",\nf);break;case \"defaulttextformat\":case \"defaultnontextformat\":b&&B.AddUndo(c,a.GetStyleString(\"cellformat\",A[l]));A[l]=a.GetStyleNum(\"cellformat\",f);break;case \"defaulttextvalueformat\":case \"defaultnontextvalueformat\":b&&B.AddUndo(c,a.GetStyleString(\"valueformat\",A[l]));A[l]=a.GetStyleNum(\"valueformat\",f);for(h in a.cells)delete a.cells[h].displaystring;break;case \"lastcol\":case \"lastrow\":b&&B.AddUndo(c,A[l]-0);a=f-0;\"number\"==typeof a&&(A[l]=0<a?a:1);break;case \"recalc\":b&&B.AddUndo(c,A[l]);\"off\"==\nf?A.recalc=f:delete A.recalc;break;case \"usermaxcol\":case \"usermaxrow\":b&&B.AddUndo(c,A[l]-0);a=f-0;\"number\"==typeof a&&(A[l]=0<a?a:0);break;default:m=w.s_escUnknownSheetCmd+d}else if(/^[a-z]{1,2}(:[a-z]{1,2})?$/i.test(g))for(a.renderneeded=!0,g=g.toUpperCase(),h=g.indexOf(\":\"),0<=h?(p=SocialCalc.coordToCr(g.substring(0,h)+\"1\"),r=SocialCalc.coordToCr(g.substring(h+1)+\"1\")):r=p=SocialCalc.coordToCr(g+\"1\"),c=p.col;c<=r.col;c++)\"width\"==l?(h=SocialCalc.rcColname(c),b&&B.AddUndo(\"set \"+h+\" width\",a.colattribs.width[h]),\n0<f.length?a.colattribs.width[h]=f:delete a.colattribs.width[h]):\"hide\"==l&&(a.hiddencolrow=\"col\",h=SocialCalc.rcColname(c),b&&B.AddUndo(\"set \"+h+\" hide\",a.colattribs.hide[h]),0<f.length?a.colattribs.hide[h]=f:delete a.colattribs.hide[h]);else if(/^\\d+(:\\d+)?$/i.test(g))for(a.renderneeded=!0,g=g.toUpperCase(),h=g.indexOf(\":\"),0<=h?(p=SocialCalc.coordToCr(\"A\"+g.substring(0,h)),r=SocialCalc.coordToCr(\"A\"+g.substring(h+1))):r=p=SocialCalc.coordToCr(\"A\"+g),q=p.row;q<=r.row;q++)\"height\"==l?(b&&B.AddUndo(\"set \"+\nq+\" height\",a.rowattribs.height[q]),0<f.length?a.rowattribs.height[q]=f:delete a.rowattribs.height[q]):\"hide\"==l&&(a.hiddencolrow=\"row\",b&&B.AddUndo(\"set \"+q+\" hide\",a.rowattribs.hide[q]),0<f.length?a.rowattribs.hide[q]=f:delete a.rowattribs.hide[q]);else if(/^[a-z]{1,2}\\d+(:[a-z]{1,2}\\d+)?$/i.test(g))for(q(),p.row!=r.row||p.col!=r.col||a.celldisplayneeded||a.renderneeded?(a.renderneeded=!0,a.celldisplayneeded=\"\"):a.celldisplayneeded=SocialCalc.crToCoord(p.col,p.row),q=p.row;q<=r.row;q++)for(c=p.col;c<=\nr.col;c++)h=SocialCalc.crToCoord(c,q),n=a.GetAssuredCell(h),n.readonly&&\"readonly\"!=l||(b&&B.AddUndo(\"set \"+h+\" all\",a.CellToString(n)),\"value\"==l?(h=f.indexOf(\" \"),n.datavalue=f.substring(h+1)-0,delete n.errors,n.datatype=\"v\",n.valuetype=f.substring(0,h),delete n.displaystring,delete n.parseinfo,A.needsrecalc=\"yes\"):\"text\"==l?(h=f.indexOf(\" \"),n.datavalue=SocialCalc.decodeFromSave(f.substring(h+1)),delete n.errors,n.datatype=\"t\",n.valuetype=f.substring(0,h),delete n.displaystring,delete n.parseinfo,\nA.needsrecalc=\"yes\"):\"formula\"==l?(n.datavalue=0,delete n.errors,n.datatype=\"f\",n.valuetype=\"e#N/A\",n.formula=f,delete n.displaystring,delete n.parseinfo,A.needsrecalc=\"yes\"):\"constant\"==l?(h=f.indexOf(\" \"),e=f.substring(h+1).indexOf(\" \"),n.datavalue=f.substring(h+1,h+1+e)-0,n.valuetype=f.substring(0,h),\"e\"==n.valuetype.charAt(0)?n.errors=n.valuetype.substring(1):delete n.errors,n.datatype=\"c\",n.formula=f.substring(h+e+2),delete n.displaystring,delete n.parseinfo,A.needsrecalc=\"yes\"):\"empty\"==l?(n.datavalue=\n\"\",delete n.errors,n.datatype=null,n.formula=\"\",n.valuetype=\"b\",delete n.displaystring,delete n.parseinfo,A.needsrecalc=\"yes\"):\"all\"==l?(0<f.length?(n=new SocialCalc.Cell(h),a.CellFromStringParts(n,f.split(\":\"),1),a.cells[h]=n):delete a.cells[h],A.needsrecalc=\"yes\"):/^b[trbl]$/.test(l)?(n[l]=a.GetStyleNum(\"borderstyle\",f),a.renderneeded=!0):\"color\"==l||\"bgcolor\"==l?n[l]=a.GetStyleNum(\"color\",f):\"layout\"==l||\"cellformat\"==l?n[l]=a.GetStyleNum(l,f):\"font\"==l?(\"* * *\"==f&&(f=\"\"),n[l]=a.GetStyleNum(\"font\",\nf)):\"textvalueformat\"==l||\"nontextvalueformat\"==l?(n[l]=a.GetStyleNum(\"valueformat\",f),delete n.displaystring):\"cssc\"==l?(f=f.replace(/[^a-zA-Z0-9\\-]/g,\"\"),n.cssc=f):\"csss\"==l?(f=f.replace(/\\n/g,\"\"),n.csss=f):\"mod\"==l?(f=f.replace(/[^yY]/g,\"\").toLowerCase(),n.mod=f):\"comment\"==l?n.comment=SocialCalc.decodeFromSave(f):\"readonly\"==l?n.readonly=\"yes\"==f.toLowerCase():m=w.s_escUnknownSetCoordCmd+d);break;case \"merge\":a.renderneeded=!0;g=c.NextToken();f=c.RestOfString();q();n=a.GetAssuredCell(p.coord);\nif(n.readonly)break;b&&B.AddUndo(\"unmerge \"+p.coord);r.col>p.col?n.colspan=r.col-p.col+1:delete n.colspan;r.row>p.row?n.rowspan=r.row-p.row+1:delete n.rowspan;a.changedrendervalues=!0;break;case \"unmerge\":a.renderneeded=!0;g=c.NextToken();f=c.RestOfString();q();n=a.GetAssuredCell(p.coord);if(n.readonly)break;b&&B.AddUndo(\"merge \"+p.coord+\":\"+SocialCalc.crToCoord(p.col+(n.colspan||1)-1,p.row+(n.rowspan||1)-1));delete n.colspan;delete n.rowspan;a.changedrendervalues=!0;break;case \"erase\":case \"cut\":a.renderneeded=\n!0;a.changedrendervalues=!0;g=c.NextToken();f=c.RestOfString();q();b&&B.AddUndo(\"changedrendervalues\");\"cut\"==e&&(b&&B.AddUndo(\"loadclipboard\",SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)),SocialCalc.Clipboard.clipboard=SocialCalc.CreateSheetSave(a,g));for(q=p.row;q<=r.row;q++)for(c=p.col;c<=r.col;c++)h=SocialCalc.crToCoord(c,q),n=a.GetAssuredCell(h),n.readonly||(b&&B.AddUndo(\"set \"+h+\" all\",a.CellToString(n)),\"all\"==f?delete a.cells[h]:\"formulas\"==f?(n.datavalue=\"\",n.datatype=null,n.formula=\n\"\",n.valuetype=\"b\",delete n.errors,delete n.displaystring,delete n.parseinfo,n.comment&&delete n.comment):\"formats\"==f&&(l=new SocialCalc.Cell(h),l.datavalue=n.datavalue,l.datatype=n.datatype,l.formula=n.formula,l.valuetype=n.valuetype,n.comment&&(l.comment=n.comment),a.cells[h]=l));A.needsrecalc=\"yes\";break;case \"fillright\":case \"filldown\":a.renderneeded=!0;a.changedrendervalues=!0;b&&B.AddUndo(\"changedrendervalues\");g=c.NextToken();f=c.RestOfString();q();\"fillright\"==e?(e=!0,s=p.row,t=p.col+1):\n(e=!1,s=p.row+1,t=p.col);for(q=s;q<=r.row;q++)for(c=t;c<=r.col;c++)if(h=SocialCalc.crToCoord(c,q),n=a.GetAssuredCell(h),!n.readonly){b&&B.AddUndo(\"set \"+h+\" all\",a.CellToString(n));e?(u=SocialCalc.crToCoord(p.col,q),w=c-t+1,d=0):(u=SocialCalc.crToCoord(c,p.row),w=0,d=q-s+1);v=a.GetAssuredCell(u);if(\"all\"==f||\"formats\"==f)for(l in D)1!=D[l]&&(void 0===typeof v[l]||3==D[l]?delete n[l]:n[l]=v[l]);if(\"all\"==f||\"formulas\"==f)n.datavalue=v.datavalue,n.datatype=v.datatype,n.valuetype=v.valuetype,n.formula=\n\"f\"==n.datatype?SocialCalc.OffsetFormulaCoords(v.formula,w,d):v.formula,delete n.parseinfo,n.errors=v.errors;delete n.displaystring}A.needsrecalc=\"yes\";break;case \"copy\":g=c.NextToken();f=c.RestOfString();b&&B.AddUndo(\"loadclipboard\",SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard));SocialCalc.Clipboard.clipboard=SocialCalc.CreateSheetSave(a,g);break;case \"loadclipboard\":f=c.RestOfString();b&&B.AddUndo(\"loadclipboard\",SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard));TiddlyWiki&&f&&\n(SocialCalc.Clipboard.clipboard=SocialCalc.decodeFromSave(f));break;case \"clearclipboard\":b&&B.AddUndo(\"loadclipboard\",SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard));SocialCalc.Clipboard.clipboard=\"\";break;case \"paste\":a.renderneeded=!0;a.changedrendervalues=!0;b&&B.AddUndo(\"changedrendervalues\");g=c.NextToken();f=c.RestOfString();q();if(!SocialCalc.Clipboard.clipboard)break;e=new SocialCalc.Sheet;e.ParseSheetSave(SocialCalc.Clipboard.clipboard);x=SocialCalc.ParseRange(e.copiedfrom);w=\np.col-x.cr1.col;d=p.row-x.cr1.row;y=Math.max(r.col-p.col+1,x.cr2.col-x.cr1.col+1);z=Math.max(r.row-p.row+1,x.cr2.row-x.cr1.row+1);p.col+y-1>A.lastcol&&(A.lastcol=p.col+y-1);p.row+z-1>A.lastrow&&(A.lastrow=p.row+z-1);for(q=p.row;q<p.row+z;q++)for(c=p.col;c<p.col+y;c++)if(h=SocialCalc.crToCoord(c,q),n=a.GetAssuredCell(h),!n.readonly){b&&B.AddUndo(\"set \"+h+\" all\",a.CellToString(n));u=SocialCalc.crToCoord(x.cr1.col+(c-p.col)%(x.cr2.col-x.cr1.col+1),x.cr1.row+(q-p.row)%(x.cr2.row-x.cr1.row+1));v=e.GetAssuredCell(u);\nif(\"all\"==f||\"formats\"==f)for(l in D)1!=D[l]&&(void 0===typeof v[l]||3==D[l]?delete n[l]:(h=SocialCalc.CellPropertiesTable[l],n[l]=h&&v[l]?a.GetStyleNum(h,e.GetStyleString(h,v[l])):v[l]));if(\"all\"==f||\"formulas\"==f)n.datavalue=v.datavalue,n.datatype=v.datatype,n.valuetype=v.valuetype,n.formula=\"f\"==n.datatype?SocialCalc.OffsetFormulaCoords(v.formula,w,d):v.formula,delete n.parseinfo,n.errors=v.errors,v.comment?n.comment=v.comment:n.comment&&delete n.comment;delete n.displaystring}A.needsrecalc=\"yes\";\nbreak;case \"sort\":a.renderneeded=!0;a.changedrendervalues=!0;b&&B.AddUndo(\"changedrendervalues\");g=c.NextToken();q();d=[];G=[];for(w=I=0;3>=w;w++)d[w]=c.NextToken(),G[w]=c.NextToken(),d[w]&&(I=w);e={};l=[];E=[];H=[];for(q=p.row;q<=r.row;q++){for(c=p.col;c<=r.col;c++)h=SocialCalc.crToCoord(c,q),(n=a.cells[h])?(e[h]=a.CellToString(n),b&&B.AddUndo(\"set \"+h+\" all\",e[h])):b&&B.AddUndo(\"set \"+h+\" all\");l.push(l.length);E.push([]);H.push([]);slast=H.length-1;for(w=0;w<=I;w++)h=d[w]+q,n=a.GetAssuredCell(h),\nh=n.datavalue,c=n.valuetype.charAt(0)||\"b\",\"t\"==c&&(h=h.toLowerCase()),E[slast].push(h),H[slast].push(c)}b=function(a,b){var c,d,e,f,g;for(c=0;c<=I;c++)if(\"up\"==G[c]?(d=a,e=b):(d=b,e=a),f=H[d][c],tb=H[e][c],\"t\"==f?\"t\"==tb?(d=E[d][c],e=E[e][c],g=d>e?1:d<e?-1:0):\"n\"==tb?g=1:\"b\"==tb?g=\"up\"==G[c]?-1:1:\"e\"==tb&&(g=-1):\"n\"==f?\"t\"==tb?g=-1:\"n\"==tb?(d=E[d][c]-0,e=E[e][c]-0,g=d>e?1:d<e?-1:0):\"b\"==tb?g=\"up\"==G[c]?-1:1:\"e\"==tb&&(g=-1):\"e\"==f?\"e\"==tb?(d=E[d][c],e=E[e][c],g=d>e?1:d<e?-1:0):g=\"b\"==tb?\"up\"==G[c]?\n-1:1:1:\"b\"==f&&(g=\"b\"==tb?0:\"up\"==G[c]?1:-1),g)return g;return a>b?1:a<b?-1:0};l.sort(b);for(q=p.row;q<=r.row;q++)for(b=l[q-p.row],c=p.col;c<=r.col;c++)h=SocialCalc.crToCoord(c,q),B=SocialCalc.crToCoord(c,b+p.row),e[B]?(n=new SocialCalc.Cell(h),a.CellFromStringParts(n,e[B].split(\":\"),1),\"f\"==n.datatype&&(n.formula=SocialCalc.OffsetFormulaCoords(n.formula,0,q-p.row-b)),a.cells[h]=n):delete a.cells[h];A.needsrecalc=\"yes\";break;case \"insertcol\":case \"insertrow\":a.renderneeded=!0;a.changedrendervalues=\n!0;g=c.NextToken();f=c.RestOfString();q();\"insertcol\"==e?(w=1,f=p.col,d=0,t=1,C=s=p.col,n=1,y=A.lastrow,b&&B.AddUndo(\"deletecol \"+p.coord)):(w=0,d=f=1,t=p.row,s=1,C=A.lastcol,y=n=p.row,b&&B.AddUndo(\"deleterow \"+p.coord));for(q=A.lastrow;q>=t;q--)for(c=A.lastcol;c>=f;c--)u=SocialCalc.crToCoord(c,q),h=SocialCalc.crToCoord(c+w,q+d),a.cells[u]?a.cells[h]=a.cells[u]:delete a.cells[h];for(q=n;q<=y;q++)for(c=s;c<=C;c++)for(l in h=SocialCalc.crToCoord(c,q),n=new SocialCalc.Cell(h),a.cells[h]=n,u=SocialCalc.crToCoord(c-\nw,q-d),v=a.GetAssuredCell(u),D)2==D[l]&&(n[l]=v[l]);for(h in a.cells)(n=a.cells[h])&&\"f\"==n.datatype&&(n.formula=SocialCalc.AdjustFormulaCoords(n.formula,p.col,w,p.row,d)),n&&delete n.parseinfo;for(x in a.names)a.names[x]&&(h=a.names[x].definition,c=\"\",\"=\"==h.charAt(0)&&(c=\"=\",h=h.substring(1)),a.names[x].definition=c+SocialCalc.AdjustFormulaCoords(h,p.col,w,p.row,d));for(q=A.lastrow;q>=t&&\"insertrow\"==e;q--)for(l in b=q+d,a.rowattribs)h=a.rowattribs[l][q],a.rowattribs[l][b]!=h&&(h?a.rowattribs[l][b]=\nh:delete a.rowattribs[l][b]);for(c=A.lastcol;c>=f&&\"insertcol\"==e;c--)for(l in q=SocialCalc.rcColname(c),b=SocialCalc.rcColname(c+w),a.colattribs)h=a.colattribs[l][q],a.colattribs[l][b]!=h&&(h?a.colattribs[l][b]=h:delete a.colattribs[l][b]);A.lastcol+=w;A.lastrow+=d;A.needsrecalc=\"yes\";break;case \"deletecol\":case \"deleterow\":a.renderneeded=!0;a.changedrendervalues=!0;g=c.NextToken();f=c.RestOfString();f=A.lastcol;D=A.lastrow;q();\"deletecol\"==e?(w=p.col-r.col-1,d=0,t=r.col+1,s=1):(w=0,d=p.row-r.row-\n1,t=1,s=r.row+1);for(q=s;q<=D-d;q++)for(c=t;c<=f-w;c++)if(h=SocialCalc.crToCoord(c+w,q+d),(n=a.cells[h])&&n.readonly)return m;for(q=s;q<=D-d;q++)for(c=t;c<=f-w;c++)h=SocialCalc.crToCoord(c+w,q+d),b&&(q<s-d||c<t-w)&&((n=a.cells[h])?B.AddUndo(\"set \"+h+\" all\",a.CellToString(n)):B.AddUndo(\"erase \"+h+\" all\")),u=SocialCalc.crToCoord(c,q),(n=a.cells[u])?a.cells[h]=n:delete a.cells[h];for(h in a.cells)if(n=a.cells[h])\"f\"==n.datatype?(q=n.formula,n.formula=SocialCalc.AdjustFormulaCoords(q,p.col,w,p.row,d),\nn.formula!=q&&(delete n.parseinfo,b&&-1!=n.formula.indexOf(\"#REF!\")&&(c=SocialCalc.coordToCr(h),B.AddUndo(\"set \"+SocialCalc.rcColname(c.col-w)+(c.row-d)+\" formula \"+q)))):delete n.parseinfo;for(x in a.names)a.names[x]&&(h=a.names[x].definition,c=\"\",\"=\"==h.charAt(0)&&(c=\"=\",h=h.substring(1)),a.names[x].definition=c+SocialCalc.AdjustFormulaCoords(h,p.col,w,p.row,d));for(q=s;q<=D-d&&\"deleterow\"==e;q++)for(l in c=q+d,a.rowattribs)h=a.rowattribs[l][q],a.rowattribs[l][c]!=h&&(b&&B.AddUndo(\"set \"+c+\" \"+\nl,a.rowattribs[l][c]),h?a.rowattribs[l][c]=h:delete a.rowattribs[l][c]);for(c=t;c<=f-w&&\"deletecol\"==e;c++)for(l in q=SocialCalc.rcColname(c),n=SocialCalc.rcColname(c+w),a.colattribs)h=a.colattribs[l][q],a.colattribs[l][n]!=h&&(b&&B.AddUndo(\"set \"+n+\" \"+l,a.colattribs[l][n]),h?a.colattribs[l][n]=h:delete a.colattribs[l][n]);if(b)if(\"deletecol\"==e)for(c=p.col;c<=r.col;c++)B.AddUndo(\"insertcol \"+SocialCalc.rcColname(c));else for(q=p.row;q<=r.row;q++)B.AddUndo(\"insertrow \"+q);\"deletecol\"==e?p.col<=f&&\n(A.lastcol=r.col<=f?A.lastcol+w:p.col-1):p.row<=D&&(A.lastrow=r.row<=D?A.lastrow+d:p.row-1);A.needsrecalc=\"yes\";break;case \"movepaste\":case \"moveinsert\":var J,F;a.renderneeded=!0;a.changedrendervalues=!0;b&&B.AddUndo(\"changedrendervalues\");g=c.NextToken();n=c.NextToken();f=c.RestOfString();\"\"==f&&(f=\"all\");q();F=SocialCalc.coordToCr(n);w=F.col-p.col;d=F.row-p.row;y=r.col-p.col+1;z=r.row-p.row+1;J={};for(q=p.row;q<=r.row;q++)for(c=p.col;c<=r.col;c++)if(h=SocialCalc.crToCoord(c,q),n=a.GetAssuredCell(h),\n!n.readonly&&(b&&B.AddUndo(\"set \"+h+\" all\",a.CellToString(n)),a.cells[h])){J[h]=new SocialCalc.Cell(h);for(l in D)void 0!==typeof n[l]&&(J[h][l]=n[l],\"all\"==f&&delete n[l],\"formulas\"==f&&(1!=D[l]&&3!=D[l]||delete n[l]),\"formats\"==f&&2==D[l]&&delete n[l]);\"formulas\"==f&&(n.datavalue=\"\",n.datatype=null,n.formula=\"\",n.valuetype=\"b\");\"all\"==f&&delete a.cells[h]}\"moveinsert\"==e&&(s=t=!1,0==d&&(F.col<p.col||F.col>r.col)?F.col<p.col?(C=p.col-F.col,t=-1):(--F.col,w=F.col-r.col,C=F.col-r.col,t=1):0==w&&(F.row<\np.row||F.row>r.row)?F.row<p.row?(C=p.row-F.row,s=-1):(--F.row,d=F.row-r.row,C=F.row-r.row,s=1):e=\"movepaste\");e={};if(s)for(q=0;q<C;q++)for(c=p.col;c<=r.col;c++){0>s?(u=SocialCalc.crToCoord(c,F.row+C-q-1),h=SocialCalc.crToCoord(c,r.row-q)):(u=SocialCalc.crToCoord(c,F.row-C+q+1),h=SocialCalc.crToCoord(c,p.row+q));v=a.GetAssuredCell(u);b&&B.AddUndo(\"set \"+u+\" all\",a.CellToString(v));n=a.GetAssuredCell(h);if(\"all\"==f||\"formats\"==f)for(l in D)1!=D[l]&&(void 0===typeof v[l]||3==D[l]?delete n[l]:n[l]=v[l]);\nif(\"all\"==f||\"formulas\"==f)n.datavalue=v.datavalue,n.datatype=v.datatype,n.valuetype=v.valuetype,n.formula=v.formula,delete n.parseinfo,n.errors=v.errors;delete n.displaystring;e[u]=h}if(t)for(c=0;c<C;c++)for(q=p.row;q<=r.row;q++){0>t?(u=SocialCalc.crToCoord(F.col+C-c-1,q),h=SocialCalc.crToCoord(r.col-c,q)):(u=SocialCalc.crToCoord(F.col-C+c+1,q),h=SocialCalc.crToCoord(p.col+c,q));v=a.GetAssuredCell(u);b&&B.AddUndo(\"set \"+u+\" all\",a.CellToString(v));n=a.GetAssuredCell(h);if(\"all\"==f||\"formats\"==f)for(l in D)1!=\nD[l]&&(void 0===typeof v[l]||3==D[l]?delete n[l]:n[l]=v[l]);if(\"all\"==f||\"formulas\"==f)n.datavalue=v.datavalue,n.datatype=v.datatype,n.valuetype=v.valuetype,n.formula=v.formula,delete n.parseinfo,n.errors=v.errors;delete n.displaystring;e[u]=h}F.col+y-1>A.lastcol&&(A.lastcol=F.col+y-1);F.row+z-1>A.lastrow&&(A.lastrow=F.row+z-1);for(q=p.row;q<p.row+z;q++)for(c=p.col;c<p.col+y;c++)if(h=SocialCalc.crToCoord(c+w,q+d),n=a.GetAssuredCell(h),!n.readonly)if(b&&B.AddUndo(\"set \"+h+\" all\",a.CellToString(n)),\nu=SocialCalc.crToCoord(c,q),e[u]=h,\"all\"!=f||J[u]){(v=J[u])||(v=a.GetAssuredCell(u));if(\"all\"==f||\"formats\"==f)for(l in D)1!=D[l]&&(void 0===typeof v[l]||3==D[l]?delete n[l]:n[l]=v[l]);if(\"all\"==f||\"formulas\"==f)n.datavalue=v.datavalue,n.datatype=v.datatype,n.valuetype=v.valuetype,n.formula=v.formula,delete n.parseinfo,n.errors=v.errors,v.comment?n.comment=v.comment:n.comment&&delete n.comment;delete n.displaystring}else delete a.cells[h];for(h in a.cells)if(n=a.cells[h])\"f\"==n.datatype?(q=n.formula,\nn.formula=SocialCalc.ReplaceFormulaCoords(q,e),n.formula!=q&&(delete n.parseinfo,b&&!e[h]&&B.AddUndo(\"set \"+h+\" formula \"+q))):delete n.parseinfo;for(x in a.names)a.names[x]&&(q=h=a.names[x].definition,c=\"\",\"=\"==h.charAt(0)&&(c=\"=\",h=h.substring(1)),a.names[x].definition=c+SocialCalc.ReplaceFormulaCoords(h,e),b&&a.names[x].definition!=q&&B.AddUndo(\"name define \"+x+\" \"+q));A.needsrecalc=\"yes\";break;case \"name\":g=c.NextToken();x=c.NextToken();f=c.RestOfString();x=x.toUpperCase().replace(/[^A-Z0-9_\\.]/g,\n\"\");if(\"\"==x)break;if(\"define\"==g){if(\"\"==f)break;a.names[x]?(b&&B.AddUndo(\"name define \"+x+\" \"+a.names[x].definition),a.names[x].definition=f):(b&&B.AddUndo(\"name delete \"+x),a.names[x]={definition:f,desc:\"\"})}else\"desc\"==g?a.names[x]&&(b&&B.AddUndo(\"name desc \"+x+\" \"+a.names[x].desc),a.names[x].desc=f):\"delete\"==g&&(b&&(a.names[x].desc&&B.AddUndo(\"name desc \"+x+\" \"+a.names[x].desc),B.AddUndo(\"name define \"+x+\" \"+a.names[x].definition)),delete a.names[x]);A.needsrecalc=\"yes\";break;case \"recalc\":A.needsrecalc=\n\"yes\";a.recalconce=!0;break;case \"redisplay\":a.renderneeded=!0;break;case \"changedrendervalues\":a.changedrendervalues=!0;break;case \"startcmdextension\":x=c.NextToken();(B=a.sci.CmdExtensionCallbacks[x])&&B.func(x,B.data,a,c,b);break;default:m=w.s_escUnknownCmd+d}return m};SocialCalc.SheetUndo=function(a){var c,b=a.changes.TOS(),d=\"\";for(c=b?b.undo.length-1:-1;0<=c;c--)d&&(d+=\"\\n\"),d+=b.undo[c];a.changes.Undo();a.ScheduleSheetCommands(d,!1)};\nSocialCalc.SheetRedo=function(a){var c,b;if(a.changes.Redo()){c=a.changes.TOS();var d=\"\";for(b=0;c&&b<c.command.length;b++)d&&(d+=\"\\n\"),d+=c.command[b];a.ScheduleSheetCommands(d,!1)}else a.ScheduleSheetCommands(\"\",!1)};SocialCalc.CreateAuditString=function(a){var c,b=\"\",d=a.changes.stack,e=a.changes.tos;for(a=0;a<=e;a++)for(c=0;c<d[a].command.length;c++)b+=d[a].command[c]+\"\\n\";return b};\nSocialCalc.GetStyleNum=function(a,c,b){var d;if(0==b.length)return 0;d=a[c+\"hash\"][b];d||(1>a[c+\"s\"].length&&a[c+\"s\"].push(\"\"),d=a[c+\"s\"].push(b)-1,a[c+\"hash\"][b]=d,a.changedrendervalues=!0);return d};SocialCalc.GetStyleString=function(a,c,b){return b?a[c+\"s\"][b]:null};\nSocialCalc.OffsetFormulaCoords=function(a,c,b){var d,e,f,g,l=\"\";d=SocialCalc.Formula;if(!d)return\"Need SocialCalc.Formula\";var h=d.TokenType,m=h.op,p=h.string,h=h.coord,r=d.TokenOpExpansion;a=d.ParseFormulaIntoTokens(a);for(f=0;f<a.length;f++)if(e=a[f].type,d=a[f].text,e==h){g=\"\";e=SocialCalc.coordToCr(d);\"$\"!=d.charAt(0)?e.col+=c:g+=\"$\";g+=SocialCalc.rcColname(e.col);-1==d.indexOf(\"$\",1)?e.row+=b:g+=\"$\";g+=e.row;if(1>e.row||1>e.col)g=\"#REF!\";l+=g}else l=e==p?0<=d.indexOf('\"')?l+('\"'+d.replace(/\"/,\n'\"\"')+'\"'):l+('\"'+d+'\"'):e==m?l+(r[d]||d):l+d;return l};\nSocialCalc.AdjustFormulaCoords=function(a,c,b,d,e){var f,g,l=\"\",h=!1,m=SocialCalc.Formula;if(!m)return\"Need SocialCalc.Formula\";var p=m.TokenType,r=p.op,q=p.string,p=p.coord,m=m.TokenOpExpansion;parseinfo=SocialCalc.Formula.ParseFormulaIntoTokens(a);for(g=0;g<parseinfo.length;g++){f=parseinfo[g].type;a=parseinfo[g].text;f==r&&(\"!\"==a?h=!0:\":\"!=a&&(h=!1),a=m[a]||a);if(f==p){cr=SocialCalc.coordToCr(a);(0>b&&cr.col>=c&&cr.col<c-b||0>e&&cr.row>=d&&cr.row<d-e)&&!h&&(cr.col=0,cr.row=0);h||(cr.col>=c&&(cr.col+=\nb),cr.row>=d&&(cr.row+=e));f=\"$\"==a.charAt(0)?\"$\"+SocialCalc.rcColname(cr.col):SocialCalc.rcColname(cr.col);f=-1!=a.indexOf(\"$\",1)?f+(\"$\"+cr.row):f+cr.row;if(1>cr.row||1>cr.col)f=\"#REF!\";a=f}else f==q&&(a=0<=a.indexOf('\"')?'\"'+a.replace(/\"/,'\"\"')+'\"':'\"'+a+'\"');l+=a}return l};\nSocialCalc.ReplaceFormulaCoords=function(a,c){var b,d,e,f=\"\",g=!1;d=SocialCalc.Formula;if(!d)return\"Need SocialCalc.Formula\";var l=d.TokenType,h=l.op,m=l.string,l=l.coord,p=d.TokenOpExpansion;parseinfo=SocialCalc.Formula.ParseFormulaIntoTokens(a);for(e=0;e<parseinfo.length;e++)b=parseinfo[e].type,d=parseinfo[e].text,b==h&&(\"!\"==d?g=!0:\":\"!=d&&(g=!1),d=p[d]||d),b==l?(cr=SocialCalc.coordToCr(d),b=SocialCalc.crToCoord(cr.col,cr.row),c[b]&&!g&&(cr=SocialCalc.coordToCr(c[b]),b=\"$\"==d.charAt(0)?\"$\"+SocialCalc.rcColname(cr.col):\nSocialCalc.rcColname(cr.col),d=b=-1!=d.indexOf(\"$\",1)?b+(\"$\"+cr.row):b+cr.row)):b==m&&(d=0<=d.indexOf('\"')?'\"'+d.replace(/\"/,'\"\"')+'\"':'\"'+d+'\"'),f+=d;return f};SocialCalc.RecalcInfo={sheet:null,currentState:0,state:{idle:0,start_calc:1,order:2,calc:3,start_wait:4,done_wait:5},recalctimer:null,maxtimeslice:100,timeslicedelay:1,starttime:0,queue:[],LoadSheet:function(a){return!1}};\nSocialCalc.RecalcData=function(){this.inrecalc=!0;this.celllist=[];this.celllistitem=0;this.calclist=null;this.calclistlength=0;this.nextcalc=this.lastcalc=this.firstcalc=null;this.count=0;this.checkinfo={}};SocialCalc.RecalcCheckInfo=function(){this.oldcoord=null;this.parsepos=0;this.inrangestart=this.inrange=!1;this.r=this.c=this.r2=this.r1=this.c2=this.c1=this.cr2=this.cr1=null};\nSocialCalc.RecalcSheet=function(a){hack.log(\"\",hack.recalc,\"SocialCalc.RecalcSheet\");var c=SocialCalc.RecalcInfo;c.currentState!=c.state.idle?c.queue.push(a):(delete a.attribs.circularreferencecell,SocialCalc.Formula.FreshnessInfoReset(),SocialCalc.RecalcClearTimeout(),c.sheet=a,c.currentState=c.state.start_calc,c.starttime=new Date,a.statuscallback&&a.statuscallback(c,\"calcstart\",null,a.statuscallbackparams),SocialCalc.RecalcSetTimeout())};\nSocialCalc.RecalcSetTimeout=function(){var a=SocialCalc.RecalcInfo;a.recalctimer=window.setTimeout(SocialCalc.RecalcTimerRoutine,a.timeslicedelay)};SocialCalc.RecalcClearTimeout=function(){var a=SocialCalc.RecalcInfo;a.recalctimer&&(window.clearTimeout(a.recalctimer),a.recalctimer=null)};\nSocialCalc.RecalcLoadedSheet=function(a,c,b,d,e){var f=SocialCalc.RecalcInfo,g=SocialCalc.Formula;a=SocialCalc.Formula.AddSheetToCache(a||g.SheetCache.waitingForLoading,c,d,e);b&&a&&\"off\"!=a.attribs.recalc&&(a.previousrecalcsheet=f.sheet,f.sheet=a,f.currentState=f.state.start_calc);g.SheetCache.waitingForLoading=null;SocialCalc.RecalcSetTimeout()};\nSocialCalc.RecalcTimerRoutine=function(){hack.log(\"\",hack.recalc,\"SocialCalc.RecalcTimerRoutine\");var a,c,b,d=new Date,e=0,f=SocialCalc.Formula;if(!f)return\"Need SocialCalc.Formula\";var g=SocialCalc.RecalcInfo,l=g.sheet;if(l){var h=l.recalcdata,m=function(a,b){l.statuscallback&&l.statuscallback(h,a,b,l.statuscallbackparams)};SocialCalc.RecalcClearTimeout();if(g.currentState==g.state.start_calc){h=new SocialCalc.RecalcData;l.recalcdata=h;for(b in l.cells)b&&h.celllist.push(b);h.calclist={};g.currentState=\ng.state.order}if(g.currentState==g.state.order){for(;h.celllistitem<h.celllist.length;)if(b=h.celllist[h.celllistitem++],SocialCalc.RecalcCheckCell(l,b),new Date-d>=g.maxtimeslice){m(\"calcorder\",{coord:b,total:h.celllist.length,count:h.celllistitem});SocialCalc.RecalcSetTimeout();return}m(\"calccheckdone\",h.calclistlength);h.nextcalc=h.firstcalc;g.currentState=g.state.calc;SocialCalc.RecalcSetTimeout()}else if(g.currentState==g.state.start_wait){g.currentState=g.state.done_wait;if(g.LoadSheet&&(a=\ng.LoadSheet(f.SheetCache.waitingForLoading)))return;SocialCalc.RecalcLoadedSheet(null,\"\",!1)}else if(g.currentState==g.state.done_wait)g.currentState=g.state.calc,SocialCalc.RecalcSetTimeout();else{g.currentState!=g.state.calc&&alert(\"Recalc state error: \"+g.currentState+\". Error in SocialCalc code.\");for(b=l.recalcdata.nextcalc;b;){c=l.cells[b];a=f.evaluate_parsed_formula(c.parseinfo,l,!1);if(f.SheetCache.waitingForLoading){h.nextcalc=b;h.count+=e;m(\"calcloading\",{sheetname:f.SheetCache.waitingForLoading});\ng.currentState=g.state.start_wait;SocialCalc.RecalcSetTimeout();return}if(f.RemoteFunctionInfo.waitingForServer){h.nextcalc=b;h.count+=e;m(\"calcserverfunc\",{funcname:f.RemoteFunctionInfo.waitingForServer,coord:b,total:h.calclistlength,count:h.count});g.currentState=g.state.done_wait;return}if(c.datavalue!=a.value||c.valuetype!=a.type)c.datavalue=a.value,c.valuetype=a.type,delete c.displaystring,l.recalcchangedavalue=!0;a.error&&(c.errors=a.error);e++;b=l.recalcdata.calclist[b];if(new Date-d>=g.maxtimeslice){h.nextcalc=\nb;h.count+=e;m(\"calcstep\",{coord:b,total:h.calclistlength,count:h.count});SocialCalc.RecalcSetTimeout();return}}h.inrecalc=!1;delete l.recalcdata;delete l.attribs.needsrecalc;g.sheet=l.previousrecalcsheet||null;g.sheet?(g.currentState=g.state.calc,SocialCalc.RecalcSetTimeout()):(f.FreshnessInfo.recalc_completed=!0,g.currentState=g.state.idle,m(\"calcfinished\",new Date-g.starttime),0<g.queue.length&&(l=g.queue.shift(),l.RecalcSheet()))}}};\nSocialCalc.RecalcCheckCell=function(a,c){var b,d,e,f,g,l,h,m,p=SocialCalc.Formula;if(!p)return\"Need SocialCalc.Formula\";f=p.TokenType;var r=f.op,q=f.name,n=f.coord,s=a.recalcdata,t=s.checkinfo,u=!1,w=null,v=c;a:for(;v;)if(h=a.cells[v],m=t[v],!h||\"f\"!=h.datatype||m&&\"object\"!=typeof m)v=w,t[v]&&(w=t[v].oldcoord);else{m||(m=new SocialCalc.RecalcCheckInfo,t[v]=m);h.errors&&delete h.errors;h.parseinfo||(h.parseinfo=p.ParseFormulaIntoTokens(h.formula));b=h.parseinfo;for(f=m.parsepos;f<b.length;f++){if(m.inrange){m.inrangestart&&\n(m.cr1.col>m.cr2.col?(m.c1=m.cr2.col,m.c2=m.cr1.col):(m.c1=m.cr1.col,m.c2=m.cr2.col),m.c=m.c1-1,m.cr1.row>m.cr2.row?(m.r1=m.cr2.row,m.r2=m.cr1.row):(m.r1=m.cr1.row,m.r2=m.cr2.row),m.r=m.r1,m.inrangestart=!1);m.c+=1;if(m.c>m.c2){m.r+=1;if(m.r>m.r2){m.inrange=!1;continue}m.c=m.c1}b=SocialCalc.crToCoord(m.c,m.r);m.parsepos=f;m.oldcoord=w;w=v;v=b;if(t[v]&&\"object\"==typeof t[v])return h.errors=SocialCalc.Constants.s_caccCircRef+c,t[c]=!0,s.firstcalc?s.calclist[s.lastcalc]=c:s.firstcalc=c,s.lastcalc=c,\ns.calclistlength++,a.attribs.circularreferencecell=v+\"|\"+w,h.errors;continue a}e=b[f].type;d=b[f].text;e==r&&(\"!\"==d?u=!0:\":\"!=d&&(u=!1));if(e==q)if(g=p.LookupName(a,d),\"range\"==g.type){if(l=g.value.indexOf(\"|\"),-1!=l){m.cr1=SocialCalc.coordToCr(g.value.substring(0,l));d=g.value.indexOf(\"|\",l+1);m.cr2=SocialCalc.coordToCr(g.value.substring(l+1,d));m.inrange=!0;m.inrangestart=!0;--f;continue}}else\"coord\"==g.type&&(e=n,d=g.value);if(e==n)if(2<=f&&b[f-1].type==r&&\":\"==b[f-1].text&&b[f-2].type==n&&!u)m.cr1=\nSocialCalc.coordToCr(b[f-2].text),m.cr2=SocialCalc.coordToCr(d),m.inrange=!0,m.inrangestart=!0,--f;else if(!u){-1!=d.indexOf(\"$\")&&(d=d.replace(/\\$/g,\"\"));m.parsepos=f+1;m.oldcoord=w;w=v;v=d;if(t[v]&&\"object\"==typeof t[v])return h.errors=SocialCalc.Constants.s_caccCircRef+c,t[c]=!0,s.firstcalc?s.calclist[s.lastcalc]=c:s.firstcalc=c,s.lastcalc=c,s.calclistlength++,a.attribs.circularreferencecell=v+\"|\"+w,h.errors;continue a}}u=!1;t[v]=!0;s.firstcalc?s.calclist[s.lastcalc]=v:s.firstcalc=v;s.lastcalc=\nv;s.calclistlength++;v=w;w=t[v]?t[v].oldcoord:null}return\"\"};SocialCalc.Parse=function(a){this.str=a;this.pos=0;this.delimiter=\" \";this.lineEnd=a.indexOf(\"\\n\");0>this.lineEnd&&(this.lineEnd=a.length)};SocialCalc.Parse.prototype.NextToken=function(){if(0>this.pos)return\"\";var a=this.str.indexOf(this.delimiter,this.pos),c=this.pos;a>this.lineEnd&&(a=this.lineEnd);if(0<=a)return this.pos=a+1,this.str.substring(c,a);this.pos=this.lineEnd;return this.str.substring(c,this.lineEnd)};\nSocialCalc.Parse.prototype.RestOfString=function(){var a=this.pos;if(0>this.pos||this.pos>=this.lineEnd)return\"\";this.pos=this.lineEnd;return this.str.substring(a,this.lineEnd)};SocialCalc.Parse.prototype.RestOfStringNoMove=function(){return 0>this.pos||this.pos>=this.lineEnd?\"\":this.str.substring(this.pos,this.lineEnd)};SocialCalc.Parse.prototype.NextLine=function(){this.pos=this.lineEnd+1;this.lineEnd=this.str.indexOf(\"\\n\",this.pos);0>this.lineEnd&&(this.lineEnd=this.str.length)};\nSocialCalc.Parse.prototype.EOF=function(){return 0>this.pos||this.pos>=this.str.length?!0:!1};SocialCalc.UndoStack=function(){this.stack=[];this.tos=-1;this.maxRedo=0;this.maxUndo=50};\nSocialCalc.UndoStack.prototype.PushChange=function(a){for(;0<this.stack.length&&this.stack.length-1>this.tos;)this.stack.pop();this.stack.push({command:[],type:a,undo:[]});this.maxRedo&&this.stack.length>this.maxRedo&&this.stack.shift();this.maxUndo&&this.stack.length>this.maxUndo&&(this.stack[this.stack.length-this.maxUndo-1].undo=[]);this.tos=this.stack.length-1};\nSocialCalc.UndoStack.prototype.AddDo=function(){if(this.stack[this.stack.length-1]){for(var a=[],c=0;c<arguments.length;c++)null!=arguments[c]&&a.push(arguments[c]);a=a.join(\" \");this.stack[this.stack.length-1].command.push(a)}};SocialCalc.UndoStack.prototype.AddUndo=function(){if(this.stack[this.stack.length-1]){for(var a=[],c=0;c<arguments.length;c++)null!=arguments[c]&&a.push(arguments[c]);a=a.join(\" \");this.stack[this.stack.length-1].undo.push(a)}};\nSocialCalc.UndoStack.prototype.TOS=function(){return 0<=this.tos?this.stack[this.tos]:null};SocialCalc.UndoStack.prototype.Undo=function(){return 0<=this.tos&&(!this.maxUndo||this.tos>this.stack.length-this.maxUndo-1)?(--this.tos,!0):!1};SocialCalc.UndoStack.prototype.Redo=function(){return this.tos<this.stack.length-1?(this.tos+=1,!0):!1};SocialCalc.Clipboard={clipboard:\"\"};\nSocialCalc.RenderContext=function(a){var c=a.attribs,b=SocialCalc.Constants;this.sheetobj=a;this.showRCHeaders=this.showGrid=this.hideRowsCols=!1;this.rownamewidth=b.defaultRowNameWidth;this.pixelsPerRow=b.defaultAssumedRowHeight;this.cellskip={};this.coordToCR={};this.colwidth=[];this.totalwidth=0;this.rowpanes=[];this.colpanes=[];this.colunhideleft=[];this.colunhideright=[];this.rowunhidetop=[];this.rowunhidebottom=[];this.maxrow=this.maxcol=0;this.highlights={};this.cursorsuffix=\"\";this.highlightTypes=\n{cursor:{style:b.defaultHighlightTypeCursorStyle,className:b.defaultHighlightTypeCursorClass},range:{style:b.defaultHighlightTypeRangeStyle,className:b.defaultHighlightTypeRangeClass},cursorinsertup:{style:TiddlyWiki.getModifiedCssImageStyle(\"color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url(\"+b.defaultImagePrefix+\"cursorinsertup.gif);\"),className:b.defaultHighlightTypeCursorClass},cursorinsertleft:{style:TiddlyWiki.getModifiedCssImageStyle(\"color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url(\"+\nb.defaultImagePrefix+\"cursorinsertleft.gif);\"),className:b.defaultHighlightTypeCursorClass},range2:{style:TiddlyWiki.getModifiedCssImageStyle(\"color:#000;backgroundColor:#FFF;backgroundImage:url(\"+b.defaultImagePrefix+\"range2.gif);\"),className:\"\"}};this.cellIDprefix=b.defaultCellIDPrefix;this.defaultlinkstyle=null;this.defaultHTMLlinkstyle={type:\"html\"};this.defaultfontstyle=b.defaultCellFontStyle;this.defaultfontsize=b.defaultCellFontSize;this.defaultfontfamily=b.defaultCellFontFamily;this.defaultlayout=\nb.defaultCellLayout;this.defaultpanedividerwidth=b.defaultPaneDividerWidth;this.defaultpanedividerheight=b.defaultPaneDividerHeight;this.gridCSS=b.defaultGridCSS;this.commentClassName=b.defaultCommentClass;this.commentCSS=b.defaultCommentStyle;this.commentNoGridClassName=b.defaultCommentNoGridClass;this.commentNoGridCSS=b.defaultCommentNoGridStyle;this.readonlyClassName=b.defaultReadonlyClass;this.readonlyCSS=b.defaultReadonlyStyle;this.readonlyNoGridClassName=b.defaultReadonlyNoGridClass;this.readonlyNoGridCSS=\nb.defaultReadonlyNoGridStyle;this.readonlyComment=b.defaultReadonlyComment;this.classnames={colname:b.defaultColnameClass,rowname:b.defaultRownameClass,selectedcolname:b.defaultSelectedColnameClass,selectedrowname:b.defaultSelectedRownameClass,upperleft:b.defaultUpperLeftClass,skippedcell:b.defaultSkippedCellClass,panedivider:b.defaultPaneDividerClass,unhideleft:b.defaultUnhideLeftClass,unhideright:b.defaultUnhideRightClass,unhidetop:b.defaultUnhideTopClass,unhidebottom:b.defaultUnhideBottomClass};\nthis.explicitStyles={colname:b.defaultColnameStyle,rowname:b.defaultRownameStyle,selectedcolname:b.defaultSelectedColnameStyle,selectedrowname:b.defaultSelectedRownameStyle,upperleft:b.defaultUpperLeftStyle,skippedcell:b.defaultSkippedCellStyle,panedivider:b.defaultPaneDividerStyle,unhideleft:b.defaultUnhideLeftStyle,unhideright:b.defaultUnhideRightStyle,unhidetop:b.defaultUnhideTopStyle,unhidebottom:b.defaultUnhideBottomStyle};this.cellskip=null;this.needcellskip=!0;this.fonts=[];this.layouts=[];\nthis.needprecompute=!0;if(c)this.rowpanes[0]={first:1,last:c.lastrow},this.colpanes[0]={first:1,last:c.lastcol},this.usermaxcol=c.usermaxcol,this.usermaxrow=c.usermaxrow;else throw b.s_rcMissingSheet;};SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts=function(){SocialCalc.PrecomputeSheetFontsAndLayouts(this)};SocialCalc.RenderContext.prototype.CalculateCellSkipData=function(){SocialCalc.CalculateCellSkipData(this)};SocialCalc.RenderContext.prototype.CalculateColWidthData=function(){SocialCalc.CalculateColWidthData(this)};\nSocialCalc.RenderContext.prototype.SetRowPaneFirstLast=function(a,c,b){this.rowpanes[a]={first:c,last:b}};SocialCalc.RenderContext.prototype.SetColPaneFirstLast=function(a,c,b){this.colpanes[a]={first:c,last:b}};SocialCalc.RenderContext.prototype.CoordInPane=function(a,c,b){return SocialCalc.CoordInPane(this,a,c,b)};SocialCalc.RenderContext.prototype.CellInPane=function(a,c,b,d){return SocialCalc.CellInPane(this,a,c,b,d)};\nSocialCalc.RenderContext.prototype.InitializeTable=function(a){SocialCalc.InitializeTable(this,a)};SocialCalc.RenderContext.prototype.RenderSheet=function(a,c){return SocialCalc.RenderSheet(this,a,c)};SocialCalc.RenderContext.prototype.RenderColGroup=function(){return SocialCalc.RenderColGroup(this)};SocialCalc.RenderContext.prototype.RenderColHeaders=function(){return SocialCalc.RenderColHeaders(this)};SocialCalc.RenderContext.prototype.RenderSizingRow=function(){return SocialCalc.RenderSizingRow(this)};\nSocialCalc.RenderContext.prototype.RenderRow=function(a,c,b){return SocialCalc.RenderRow(this,a,c,b)};SocialCalc.RenderContext.prototype.RenderSpacingRow=function(){return SocialCalc.RenderSpacingRow(this)};SocialCalc.RenderContext.prototype.RenderCell=function(a,c,b,d,e,f){return SocialCalc.RenderCell(this,a,c,b,d,e,f)};\nSocialCalc.PrecomputeSheetFontsAndLayouts=function(a){var c,b,d,e,f,g,l=a.sheetobj;e=l.attribs;e.defaultfont&&(c=l.fonts[e.defaultfont],c=c.replace(/^\\*/,SocialCalc.Constants.defaultCellFontStyle),c=c.replace(/(.+)\\*(.+)/,\"$1\"+SocialCalc.Constants.defaultCellFontSize+\"$2\"),c=c.replace(/\\*$/,SocialCalc.Constants.defaultCellFontFamily),b=c.match(/^(\\S+? \\S+?) (\\S+?) (\\S.*)$/),a.defaultfontstyle=b[1],a.defaultfontsize=b[2],a.defaultfontfamily=b[3]);for(f=1;f<l.fonts.length;f++)b=l.fonts[f],b=b.replace(/^\\*/,\na.defaultfontstyle),b=b.replace(/(.+)\\*(.+)/,\"$1\"+a.defaultfontsize+\"$2\"),b=b.replace(/\\*$/,a.defaultfontfamily),b=b.match(/^(\\S+?) (\\S+?) (\\S+?) (\\S.*)$/),a.fonts[f]={style:b[1],weight:b[2],size:b[3],family:b[4]};c=/^padding:\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+);vertical-align:\\s*(\\S+);/;d=SocialCalc.Constants.defaultCellLayout.match(c);e=e.defaultlayout?l.layouts[e.defaultlayout].match(c):\" * * * * *\".split(\" \");for(f=1;f<l.layouts.length;f++){b=l.layouts[f];b=b.match(c);for(g=1;5>=g;g++)\"*\"==b[g]&&\n(b[g]=\"*\"!=e[g]?e[g]:d[g]);a.layouts[f]=\"padding:\"+b[1]+\" \"+b[2]+\" \"+b[3]+\" \"+b[4]+\";vertical-align:\"+b[5]+\";\"}a.needprecompute=!1};\nSocialCalc.CalculateCellSkipData=function(a){var c,b,d,e,f,g,l,h,m=a.sheetobj;a.maxrow=0;a.maxcol=0;a.cellskip={};for(c=1;c<=m.attribs.lastrow;c++)for(b=1;b<=m.attribs.lastcol;b++)if(d=SocialCalc.crToCoord(b,c),e=m.cells[d],void 0!==e&&!a.cellskip[d]&&(f=e.colspan||1,e=e.rowspan||1,1<f||1<e))for(g=c;g<c+e;g++)for(l=b;l<b+f;l++)h=SocialCalc.crToCoord(l,g),h==d?a.coordToCR[d]={row:c,col:b}:a.cellskip[h]=d,g>a.maxrow&&(maxrow=g),l>a.maxcol&&(maxcol=l);a.needcellskip=!1};\nSocialCalc.CalculateColWidthData=function(a){var c,b,d,e=a.sheetobj;d=a.showRCHeaders?a.rownamewidth-0:0;for(colpane=0;colpane<a.colpanes.length;colpane++)for(c=a.colpanes[colpane].first;c<=a.colpanes[colpane].last;c++)if(b=SocialCalc.rcColname(c),\"yes\"==e.colattribs.hide[b])a.colwidth[c]=0;else{b=e.colattribs.width[b]||e.attribs.defaultcolwidth||SocialCalc.Constants.defaultColWidth;if(\"blank\"==b||\"auto\"==b)b=\"\";a.colwidth[c]=b+\"\";d+=b&&0<b-0?b-0:10}a.totalwidth=d};\nSocialCalc.InitializeTable=function(a,c){c.style.borderCollapse=\"collapse\";c.cellSpacing=\"0\";c.cellPadding=\"0\";c.style.width=a.totalwidth+\"px\"};\nSocialCalc.RenderSheet=function(a,c,b){var d,e,f,g;a.sheetobj.changedrendervalues&&(a.needcellskip=!0,a.needprecompute=!0,a.sheetobj.changedrendervalues=!1);a.needcellskip&&a.CalculateCellSkipData();a.needprecompute&&a.PrecomputeSheetFontsAndLayouts();a.CalculateColWidthData();f=document.createElement(\"table\");a.InitializeTable(f);d=a.RenderColGroup();f.appendChild(d);g=document.createElement(\"tbody\");g.appendChild(a.RenderSizingRow());a.showRCHeaders&&(d=a.RenderColHeaders())&&g.appendChild(d);for(e=\n0;e<a.rowpanes.length;e++){for(rownum=a.rowpanes[e].first;rownum<=a.rowpanes[e].last;rownum++)d=a.RenderRow(rownum,e,b),g.appendChild(d);e<a.rowpanes.length-1&&(d=a.RenderSpacingRow(),g.appendChild(d))}f.appendChild(g);c&&(a=c.parentNode)&&a.replaceChild(f,c);return f};\nSocialCalc.RenderRow=function(a,c,b,d){var e=a.sheetobj,f=document.createElement(\"tr\"),g,l,h;a.showRCHeaders&&(l=document.createElement(\"td\"),a.classnames&&(l.className=a.classnames.rowname),a.explicitStyles&&(l.style.cssText=a.explicitStyles.rowname),l.width=a.rownamewidth,l.style.verticalAlign=\"top\",l.innerHTML=c+\"\",c<a.rowpanes[a.rowpanes.length-1].last&&\"yes\"==e.rowattribs.hide[c+1]&&(h=document.createElement(\"div\"),h.style.position=\"relative\",g=document.createElement(\"div\"),a.classnames&&(g.className=\na.classnames.unhidetop),a.explicitStyles&&(g.style.cssText=a.explicitStyles.unhidetop),a.rowunhidetop[c]=g,h.appendChild(g),l.appendChild(h)),1<c&&\"yes\"==e.rowattribs.hide[c-1]&&(g=document.createElement(\"div\"),a.classnames&&(g.className=a.classnames.unhidebottom),a.explicitStyles&&(g.style.cssText=a.explicitStyles.unhidebottom),a.rowunhidebottom[c]=g,l.appendChild(g)),f.appendChild(l));for(h=0;h<a.colpanes.length;h++){for(g=a.colpanes[h].first;g<=a.colpanes[h].last;g++)(l=a.RenderCell(c,g,b,h,null,\nd))&&f.appendChild(l);h<a.colpanes.length-1&&(l=document.createElement(\"td\"),l.width=a.defaultpanedividerwidth,a.classnames.panedivider&&(l.className=a.classnames.panedivider),a.explicitStyles.panedivider&&(l.style.cssText=a.explicitStyles.panedivider),g=document.createElement(\"div\"),g.style.width=a.defaultpanedividerwidth+\"px\",g.style.overflow=\"hidden\",l.appendChild(g),f.appendChild(l))}\"yes\"==e.rowattribs.hide[c]&&(f.style.cssText+=\";display:none\");return f};\nSocialCalc.RenderSpacingRow=function(a){var c,b,d,e,f=document.createElement(\"tr\");a.showRCHeaders&&(b=document.createElement(\"td\"),b.width=a.rownamewidth,b.height=a.defaultpanedividerheight,a.classnames.panedivider&&(b.className=a.classnames.panedivider),a.explicitStyles.panedivider&&(b.style.cssText=a.explicitStyles.panedivider),f.appendChild(b));for(d=0;d<a.colpanes.length;d++){for(c=a.colpanes[d].first;c<=a.colpanes[d].last;c++){b=document.createElement(\"td\");if(e=a.colwidth[c])b.width=e;b.height=\na.defaultpanedividerheight;a.classnames.panedivider&&(b.className=a.classnames.panedivider);a.explicitStyles.panedivider&&(b.style.cssText=a.explicitStyles.panedivider);b&&f.appendChild(b)}d<a.colpanes.length-1&&(b=document.createElement(\"td\"),b.width=a.defaultpanedividerwidth,b.height=a.defaultpanedividerheight,a.classnames.panedivider&&(b.className=a.classnames.panedivider),a.explicitStyles.panedivider&&(b.style.cssText=a.explicitStyles.panedivider),f.appendChild(b))}return f};\nSocialCalc.RenderColHeaders=function(a){var c=a.sheetobj,b=document.createElement(\"tr\"),d,e;if(!a.showRCHeaders)return null;e=document.createElement(\"td\");a.classnames&&(e.className=a.classnames.upperleft);a.explicitStyles&&(e.style.cssText=a.explicitStyles.upperleft);e.width=a.rownamewidth;b.appendChild(e);for(colpane=0;colpane<a.colpanes.length;colpane++){for(d=a.colpanes[colpane].first;d<=a.colpanes[colpane].last;d++){e=document.createElement(\"td\");a.classnames&&(e.className=a.classnames.colname);\na.explicitStyles&&(e.style.cssText=a.explicitStyles.colname);\"yes\"==c.colattribs.hide[SocialCalc.rcColname(d)]&&(e.style.cssText+=\";display:none\");e.innerHTML=SocialCalc.rcColname(d);if(d<a.colpanes[a.colpanes.length-1].last&&\"yes\"==c.colattribs.hide[SocialCalc.rcColname(d+1)]){var f=document.createElement(\"div\");a.classnames&&(f.className=a.classnames.unhideleft);a.explicitStyles&&(f.style.cssText=a.explicitStyles.unhideleft);a.colunhideleft[d]=f;e.appendChild(f)}1<d&&\"yes\"==c.colattribs.hide[SocialCalc.rcColname(d-\n1)]&&(f=document.createElement(\"div\"),a.classnames&&(f.className=a.classnames.unhideright),a.explicitStyles&&(f.style.cssText=a.explicitStyles.unhideright),a.colunhideright[d]=f,e.appendChild(f));b.appendChild(e)}colpane<a.colpanes.length-1&&(e=document.createElement(\"td\"),e.width=a.defaultpanedividerwidth,a.classnames.panedivider&&(e.className=a.classnames.panedivider),a.explicitStyles.panedivider&&(e.style.cssText=a.explicitStyles.panedivider),b.appendChild(e))}return b};\nSocialCalc.RenderColGroup=function(a){var c,b,d,e,f=a.sheetobj,g=document.createElement(\"colgroup\");a.showRCHeaders&&(d=document.createElement(\"col\"),d.width=a.rownamewidth,g.appendChild(d));for(c=0;c<a.colpanes.length;c++){for(b=a.colpanes[c].first;b<=a.colpanes[c].last;b++)if(d=document.createElement(\"col\"),\"yes\"==f.colattribs.hide[SocialCalc.rcColname(b)])d.width=\"1\";else{if(e=a.colwidth[b])d.width=e;g.appendChild(d)}c<a.colpanes.length-1&&(d=document.createElement(\"col\"),d.width=a.defaultpanedividerwidth,\ng.appendChild(d))}return g};\nSocialCalc.RenderSizingRow=function(a){var c,b,d,e,f=a.sheetobj,g=document.createElement(\"tr\");a.showRCHeaders&&(d=document.createElement(\"td\"),d.style.width=a.rownamewidth+\"px\",d.height=\"1\",g.appendChild(d));for(c=0;c<a.colpanes.length;c++){for(b=a.colpanes[c].first;b<=a.colpanes[c].last;b++){d=document.createElement(\"td\");if(\"yes\"==f.colattribs.hide[SocialCalc.rcColname(b)])d.width=\"1\";else if(e=a.colwidth[b])d.width=e;d.height=\"1\";g.appendChild(d)}c<a.colpanes.length-1&&(d=document.createElement(\"td\"),\nd.width=a.defaultpanedividerwidth,d.height=\"1\",g.appendChild(d))}return g};\nSocialCalc.RenderCell=function(a,c,b,d,e,f,g){var l=a.sheetobj,h,m,p,r,q,n=\"\";c-=0;b-=0;var s=SocialCalc.crToCoord(b,c);if(a.cellskip[s]){if(a.CoordInPane(a.cellskip[s],d,e))return null;f=f?SocialCalc.CreatePseudoElement():document.createElement(\"td\");a.classnames.skippedcell&&(f.className=a.classnames.skippedcell);a.explicitStyles.skippedcell&&(f.style.cssText=a.explicitStyles.skippedcell);f.innerHTML=\" \";return f}f=f?SocialCalc.CreatePseudoElement():document.createElement(\"td\");a.cellIDprefix&&\n(f.id=a.cellIDprefix+s);(p=l.cells[s])||(p=new SocialCalc.Cell(s));q=l.attribs;scc=SocialCalc.Constants;if(1<p.colspan){for(h=m=1;h<p.colspan;h++)\"yes\"!=l.colattribs.hide[SocialCalc.rcColname(b+h)]&&a.CellInPane(c,b+h,d,e)&&m++;f.colSpan=m}if(1<p.rowspan){for(h=m=1;h<p.rowspan;h++)\"yes\"!=l.rowattribs.hide[c+h+\"\"]&&a.CellInPane(c+h,b,d,e)&&m++;f.rowSpan=m}void 0==p.displaystring&&(p.displaystring=SocialCalc.FormatValueForDisplay(l,p.datavalue,s,g||a.defaultlinkstyle));f.innerHTML=p.displaystring;n=\n(h=p.layout||q.defaultlayout)&&\"undefined\"!==typeof a.layouts[h]?n+a.layouts[h]:n+scc.defaultCellLayout;(h=p.font||q.defaultfont)&&\"undefined\"!==typeof a.fonts[h]?(g=a.fonts[h],n+=\"font-style:\"+g.style+\";font-weight:\"+g.weight+\";font-size:\"+g.size+\";font-family:\"+g.family+\";\"):(scc.defaultCellFontSize&&(n+=\"font-size:\"+scc.defaultCellFontSize+\";\"),scc.defaultCellFontFamily&&(n+=\"font-family:\"+scc.defaultCellFontFamily+\";\"));(h=p.color||q.defaultcolor)&&\"undefined\"!==typeof l.colors[h]&&(n+=\"color:\"+\nl.colors[h]+\";\");(h=p.bgcolor||q.defaultbgcolor)&&\"undefined\"!==typeof l.colors[h]&&(n+=\"background-color:\"+l.colors[h]+\";\");(h=p.cellformat)&&\"undefined\"!==typeof l.cellformats[h]?n+=\"text-align:\"+l.cellformats[h]+\";\":(g=p.valuetype.charAt(0),\"t\"==g?(h=q.defaulttextformat)&&\"undefined\"!==typeof l.cellformats[h]&&(n+=\"text-align:\"+l.cellformats[h]+\";\"):\"n\"==g?n=(h=q.defaultnontextformat)&&\"undefined\"!==typeof l.cellformats[h]?n+(\"text-align:\"+l.cellformats[h]+\";\"):n+\"text-align:right;\":n+=\"text-align:left;\");\nif(1<p.colspan||1<p.rowspan)r=l.cells[SocialCalc.crToCoord(b+(p.colspan||1)-1,c+(p.rowspan||1)-1)];(h=p.bt)&&\"undefined\"!==typeof l.borderstyles[h]&&(n+=\"border-top:\"+l.borderstyles[h]+\";\");(h=\"undefined\"!=typeof r?r.br:p.br)&&\"undefined\"!==typeof l.borderstyles[h]?n+=\"border-right:\"+l.borderstyles[h]+\";\":a.showGrid&&(g=a.CellInPane(c,b+(p.colspan||1),d,e)?SocialCalc.crToCoord(b+(p.colspan||1),c):\"nomatch\",a.cellskip[g]&&(g=a.cellskip[g]),l.cells[g]&&l.cells[g].bl||(n+=\"border-right:\"+a.gridCSS));\n(h=\"undefined\"!=typeof r?r.bb:p.bb)&&\"undefined\"!==typeof l.borderstyles[h]?n+=\"border-bottom:\"+l.borderstyles[h]+\";\":a.showGrid&&(g=a.CellInPane(c+(p.rowspan||1),b,d,e)?SocialCalc.crToCoord(b,c+(p.rowspan||1)):\"nomatch\",a.cellskip[g]&&(g=a.cellskip[g]),l.cells[g]&&l.cells[g].bt||(n+=\"border-bottom:\"+a.gridCSS));(h=p.bl)&&\"undefined\"!==typeof l.borderstyles[h]&&(n+=\"border-left:\"+l.borderstyles[h]+\";\");p.comment&&(f.title=p.comment,a.showGrid?(a.commentClassName&&(f.className=(f.className?f.className+\n\" \":\"\")+a.commentClassName),n+=a.commentCSS):(a.commentNoGridClassName&&(f.className=(f.className?f.className+\" \":\"\")+a.commentNoGridClassName),n+=a.commentNoGridCSS));p.readonly&&(p.comment||(f.title=a.readonlyComment),a.showGrid?(a.readonlyClassName&&(f.className=(f.className?f.className+\" \":\"\")+a.readonlyClassName),n+=a.readonlyCSS):(a.readonlyNoGridClassName&&(f.className=(f.className?f.className+\" \":\"\")+a.readonlyNoGridClassName),n+=a.readonlyNoGridCSS));f.style.cssText=n;if(g=a.highlights[s])\"cursor\"==\ng&&(g+=a.cursorsuffix),a.highlightTypes[g].className&&(f.className=(f.className?f.className+\" \":\"\")+a.highlightTypes[g].className),SocialCalc.setStyles(f,a.highlightTypes[g].style);\"yes\"==l.colattribs.hide[SocialCalc.rcColname(b)]&&(f.style.cssText+=\";display:none\");\"yes\"==l.rowattribs.hide[c]&&(f.style.cssText+=\";display:none\");return f};SocialCalc.CoordInPane=function(a,c,b,d){var e=a.coordToCR[c];if(!e||!e.row||!e.col)throw\"Bad coordToCR for \"+c;return a.CellInPane(e.row,e.col,b,d)};\nSocialCalc.CellInPane=function(a,c,b,d,e){var f=a.rowpanes[d];a=a.colpanes[e];if(!f||!a)throw\"CellInPane called with unknown panes \"+d+\"/\"+e;return c<f.first||c>f.last||b<a.first||b>a.last?!1:!0};SocialCalc.CreatePseudoElement=function(){return{style:{cssText:\"\"},innerHTML:\"\",className:\"\"}};SocialCalc.rcColname=function(a){702<a&&(a=702);1>a&&(a=1);var c=(a-1)%26+65;return(a=Math.floor((a-1)/26))?String.fromCharCode(a+64)+String.fromCharCode(c):String.fromCharCode(c)};SocialCalc.letters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\nSocialCalc.crToCoord=function(a,c){1>a&&(a=1);702<a&&(a=702);1>c&&(c=1);var b=(a-1)%26,d=Math.floor((a-1)/26);return d?SocialCalc.letters[d-1]+SocialCalc.letters[b]+c:SocialCalc.letters[b]+c};SocialCalc.coordToCol={};SocialCalc.coordToRow={};\nSocialCalc.coordToCr=function(a){var c,b,d,e=SocialCalc.coordToRow[a];if(e)return{row:e,col:SocialCalc.coordToCol[a]};for(b=e=c=0;b<a.length;b++)d=a.charCodeAt(b),36!=d&&(57>=d?e=10*e+d-48:97<=d?c=26*c+d-96:65<=d&&(c=26*c+d-64));SocialCalc.coordToCol[a]=c;SocialCalc.coordToRow[a]=e;return{row:e,col:c}};\nSocialCalc.ParseRange=function(a){var c,b,d;a||(a=\"A1:A1\");a=a.toUpperCase();c=a.indexOf(\":\");0<=c?(b=a.substring(0,c),d=SocialCalc.coordToCr(b),d.coord=b,b=a.substring(c+1),c=SocialCalc.coordToCr(b),c.coord=b):(d=SocialCalc.coordToCr(a),d.coord=a,c=SocialCalc.coordToCr(a),c.coord=a);return{cr1:d,cr2:c}};SocialCalc.decodeFromSave=function(a){if(\"string\"!=typeof a||-1==a.indexOf(\"\\\\\"))return a;a=a.replace(/\\\\c/g,\":\");a=a.replace(/\\\\n/g,\"\\n\");return a.replace(/\\\\b/g,\"\\\\\")};\nSocialCalc.decodeFromAjax=function(a){if(\"string\"!=typeof a||-1==a.indexOf(\"\\\\\"))return a;a=a.replace(/\\\\c/g,\":\");a=a.replace(/\\\\n/g,\"\\n\");a=a.replace(/\\\\e/g,\"]]\");return a.replace(/\\\\b/g,\"\\\\\")};SocialCalc.encodeForSave=function(a){if(\"string\"!=typeof a)return a;-1!=a.indexOf(\"\\\\\")&&(a=a.replace(/\\\\/g,\"\\\\b\"));-1!=a.indexOf(\":\")&&(a=a.replace(/:/g,\"\\\\c\"));-1!=a.indexOf(\"\\n\")&&(a=a.replace(/\\n/g,\"\\\\n\"));return a};\nSocialCalc.special_chars=function(a){/[&<>\"]/.test(a)&&(a=a.replace(/&/g,\"&\"),a=a.replace(/</g,\"<\"),a=a.replace(/>/g,\">\"),a=a.replace(/\"/g,\""\"));return a};SocialCalc.Lookup=function(a,c){for(i=0;i<c.length;i++)if(c[i]>a)return 0<i?i-1:null;return c.length-1};\nSocialCalc.setStyles=function(a,c){var b,d,e,f;if(c)for(b=c.split(\";\"),d=0;d<b.length;d++)if(e=b[d].indexOf(\":\"),-1!=e&&(f=b[d].substring(0,e),e=b[d].substring(e+1),f&&e)){if(TiddlyWiki&&\"backgroundImage\"==f){var g=TiddlyWiki.pathImages;if(e.match(\".*?url(.+).*\")){var l=/.*?url[(][\"]?.*?images\\/(.+?)[\"]?[)].*$/.exec(e);!l||2>l.length||(e=(g=TiddlyWiki.getRawTiddlerImage(g+\"/\"+l[1]))?e.replace(/url[(].+?[)]/,\"url(\"+g+\")\"):e)}}a.style[f]=e}};\nSocialCalc.GetViewportInfo=function(){var a={};window.innerWidth?(a.width=window.innerWidth,a.height=window.innerHeight,a.horizontalScroll=window.pageXOffset,a.verticalScroll=window.pageYOffset):document.documentElement&&document.documentElement.clientWidth?(a.width=document.documentElement.clientWidth,a.height=document.documentElement.clientHeight,a.horizontalScroll=document.documentElement.scrollLeft,a.verticalScroll=document.documentElement.scrollTop):document.body.clientWidth&&(a.width=document.body.clientWidth,\na.height=document.body.clientHeight,a.horizontalScroll=document.body.scrollLeft,a.verticalScroll=document.body.scrollTop);return a};SocialCalc.GetElementPosition=function(a){for(var c=0,b=0;a&&\"relative\"!=SocialCalc.GetComputedStyle(a,\"position\");)c+=a.offsetLeft,b+=a.offsetTop,a=a.offsetParent;return{left:c,top:b}};\nSocialCalc.GetElementPositionWithScroll=function(a){a=a.getBoundingClientRect();return{left:a.left,right:a.right,top:a.top,bottom:a.bottom,width:a.width?a.width:a.right-a.left,height:a.height?a.height:a.bottom-a.top}};SocialCalc.GetElementFixedParent=function(a){for(;a&&\"HTML\"!=a.tagName;){if(\"fixed\"==SocialCalc.GetComputedStyle(a,\"position\"))return a;a=a.parentNode}return!1};\nSocialCalc.GetComputedStyle=function(a,c){return(\"undefined\"!=typeof a.currentStyle?a.currentStyle:document.defaultView.getComputedStyle(a,null))[c]};SocialCalc.LookupElement=function(a,c){var b;for(b=0;b<c.length;b++)if(c[b].element==a)return c[b];return null};SocialCalc.AssignID=function(a,c,b){a.idPrefix&&(c.id=a.idPrefix+b)};\nSocialCalc.GetCellContents=function(a,c){var b=\"\",d=a.cells[c];if(d)switch(d.datatype){case \"v\":b=d.datavalue+\"\";break;case \"t\":b=\"'\"+d.datavalue;break;case \"f\":b=\"=\"+d.formula;break;case \"c\":b=d.formula}return b};\nSocialCalc.FormatValueForDisplay=function(a,c,b,d){var e,f=a.attribs,g=a.cells[b];g||(g=new SocialCalc.Cell(b));b=g.valuetype||\"\";e=b.substring(1);b=b.charAt(0);if(g.errors||\"e\"==b)return c=g.errors||e||\"Error in cell\";if(\"t\"==b){b=a.valueformats[g.textvalueformat-0]||a.valueformats[f.defaulttextvalueformat-0]||\"\";if(\"formula\"==b)return c=\"f\"==g.datatype?SocialCalc.special_chars(\"=\"+g.formula)||\" \":\"c\"==g.datatype?SocialCalc.special_chars(\"'\"+g.formula)||\" \":SocialCalc.special_chars(\"'\"+\nc)||\" \";c=SocialCalc.format_text_for_display(c,g.valuetype,b,a,d,g.nontextvalueformat)}else if(\"n\"==b){b=g.nontextvalueformat;if(null==b||\"\"==b)b=f.defaultnontextvalueformat;b=a.valueformats[b-0];if(null==b||\"none\"==b)b=\"\";if(\"formula\"==b)return c=\"f\"==g.datatype?SocialCalc.special_chars(\"=\"+g.formula)||\" \":\"c\"==g.datatype?SocialCalc.special_chars(\"'\"+g.formula)||\" \":SocialCalc.special_chars(\"'\"+c)||\" \";if(\"forcetext\"==b)return c=\"f\"==g.datatype?SocialCalc.special_chars(\"=\"+g.formula)||\n\" \":\"c\"==g.datatype?SocialCalc.special_chars(g.formula)||\" \":SocialCalc.special_chars(c)||\" \";c=SocialCalc.format_number_for_display(c,g.valuetype,b)}else c=\" \";return c};\nSocialCalc.format_text_for_display=function(a,c,b,d,e,f){var g,l,h;g=c.substring(1);h=a;if(\"none\"==b||null==b)b=\"\";/^(text-|custom|hidden)/.test(b)||(b=\"\");if(\"\"==b||\"General\"==b){\"h\"==g&&(b=\"text-html\");if(\"w\"==g||\"r\"==g)b=\"text-wiki\";\"l\"==g&&(b=\"text-link\");g||(b=\"text-plain\")}\"text-html\"!=b&&(SocialCalc.Callbacks.expand_wiki&&/^text-wiki/.test(b)?h=SocialCalc.Callbacks.expand_wiki(h,d,e,b):\"text-wiki\"==b?h=SocialCalc.Callbacks.expand_markup&&SocialCalc.Callbacks.expand_markup(h,d,e)||SocialCalc.special_chars(\"wiki-text:\"+\nh):\"text-url\"==b?(a=SocialCalc.special_chars(h),c=encodeURI(h),h='<a href=\"'+c+'\">'+a+\"</a>\"):\"text-link\"==b?h=SocialCalc.expand_text_link(h,d,e,b):\"text-image\"==b?(c=encodeURI(h),h='<img src=\"'+c+'\">'):\"text-custom:\"==b.substring(0,12)?(a=SocialCalc.special_chars(h),a=a.replace(/ /g,\" \"),a=a.replace(/\\n/g,\"<br>\"),c=encodeURI(h),l={},l.r=h,l.s=a,l.u=c,h=b.substring(12),h=h.replace(/@(r|s|u)/g,function(a,b){return l[b]})):\"custom\"==b.substring(0,6)?(h=SocialCalc.special_chars(h),h=h.replace(/ /g,\n\" \"),h=h.replace(/\\n/g,\"<br>\"),h+=\" (custom format)\"):\"hidden\"==b?h=\" \":null!=f&&\"\"!=f&&\"none\"!=d.valueformats[f-0]&&\"\"!=d.valueformats[f-0]?(b=d.valueformats[f],h=SocialCalc.format_number_for_display(a,c,b)):(h=SocialCalc.special_chars(h),h=h.replace(/ /g,\" \"),h=h.replace(/\\n/g,\"<br>\")));return h};\nSocialCalc.format_number_for_display=function(a,c,b){var d,e=SocialCalc.Constants;d=a-0;c=c.substring(1);if(\"Auto\"==b||\"\"==b)b=\"%\"==c?e.defaultFormatp:\"$\"==c?e.defaultFormatc:\"dt\"==c?e.defaultFormatdt:\"d\"==c?e.defaultFormatd:\"t\"==c?e.defaultFormatt:\"l\"==c?\"logical\":\"General\";return\"logical\"==b?d?e.defaultDisplayTRUE:e.defaultDisplayFALSE:\"hidden\"==b?\" \":SocialCalc.FormatNumber.formatNumberWithFormat(a,b,\"\")};\nSocialCalc.DetermineValueType=function(a){var c=a+\"\",b=\"t\",d,e;d=c.replace(/^\\s+/,\"\");d=d.replace(/\\s+$/,\"\");0==c.length?b=\"\":c.match(/^\\s+$/)||(d.match(/^[-+]?\\d*(?:\\.)?\\d*(?:[eE][-+]?\\d+)?$/)?(c=d-0,isNaN(c)?c=a+\"\":b=\"n\"):d.match(/^[-+]?\\d*(?:\\.)?\\d*\\s*%$/)?(c=(d.slice(0,-1)-0)/100,b=\"n%\"):d.match(/^[-+]?\\$\\s*\\d*(?:\\.)?\\d*\\s*$/)&&d.match(/\\d/)?(c=d.replace(/\\$/,\"\")-0,b=\"n$\"):d.match(/^[-+]?(\\d*,\\d*)+(?:\\.)?\\d*$/)?(c=d.replace(/,/g,\"\")-0,b=\"n\"):d.match(/^[-+]?(\\d*,\\d*)+(?:\\.)?\\d*\\s*%$/)?(c=(d.replace(/[%,]/g,\n\"\")-0)/100,b=\"n%\"):d.match(/^[-+]?\\$\\s*(\\d*,\\d*)+(?:\\.)?\\d*$/)&&d.match(/\\d/)?(c=d.replace(/[\\$,]/g,\"\")-0,b=\"n$\"):(a=c.match(/^(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{1,4})\\s*$/))?(c=a[3]-0,c=SocialCalc.FormatNumber.convert_date_gregorian_to_julian(1E3>c?c+2E3:c,a[1]-0,a[2]-0)-2415019,b=\"nd\"):(a=c.match(/^(\\d{4})[\\/\\-](\\d{1,2})[\\/\\-](\\d{1,2})\\s*$/))?(c=a[1]-0,c=1E3>c?c+2E3:c,c=SocialCalc.FormatNumber.convert_date_gregorian_to_julian(c,a[2]-0,a[3]-0)-2415019,b=\"nd\"):(a=c.match(/^(\\d{1,2}):(\\d{1,2})\\s*$/))?\n(d=a[1]-0,e=a[2]-0,24>d&&60>e&&(c=d/24+e/1440,b=\"nt\")):(a=c.match(/^(\\d{1,2}):(\\d{1,2}):(\\d{1,2})\\s*$/))?(d=a[1]-0,e=a[2]-0,a=a[3]-0,24>d&&60>e&&60>a&&(c=d/24+e/1440+a/86400,b=\"nt\")):(a=c.match(/^\\s*([-+]?\\d+) (\\d+)\\/(\\d+)\\s*$/))?(e=a[1]-0,d=a[2]-0,(a=a[3]-0)&&0<a&&(c=e+(0>e?-d/a:d/a),b=\"n\")):(a=SocialCalc.InputConstants[c.toUpperCase()])?(d=a.indexOf(\",\"),c=a.substring(0,d)-0,b=a.substring(d+1)):7<d.length&&\"http://\"==d.substring(0,7).toLowerCase()?(c=d,b=\"tl\"):d.match(/<([A-Z][A-Z0-9]*)\\b[^>]*>[\\s\\S]*?<\\/\\1>/i)&&\n(c=d,b=\"th\"));return{value:c,type:b}};SocialCalc.InputConstants={TRUE:\"1,nl\",FALSE:\"0,nl\",\"#N/A\":\"0,e#N/A\",\"#NULL!\":\"0,e#NULL!\",\"#NUM!\":\"0,e#NUM!\",\"#DIV/0!\":\"0,e#DIV/0!\",\"#VALUE!\":\"0,e#VALUE!\",\"#REF!\":\"0,e#REF!\",\"#NAME?\":\"0,e#NAME?\"};SocialCalc.default_expand_markup=function(a,c,b){a=SocialCalc.special_chars(a);a=a.replace(/ /g,\" \");return a=a.replace(/\\n/g,\"<br>\")};\nSocialCalc.expand_text_link=function(a,c,b,d){var e;e=SocialCalc.Constants;var f=\"\";c=SocialCalc.ParseCellLinkText(a+\"\");hack.log(\"desc=\"+c.desc+\", url=\"+c.url+\", pagename=\"+c.pagename,hack.url,\"SocialCalc.expand_text_link\");e=c.desc?SocialCalc.special_chars(c.desc):c.pagename?e.defaultPageLinkFormatString:e.defaultLinkFormatString;7<a.length&&\"http://\"==a.substring(0,7).toLowerCase()&&\">\"!=a.charAt(a.length-1)&&(e=e.substring(7));a=c.newwin||!b?' target=\"_blank\"':\"\";c.pagename?SocialCalc.Callbacks.MakePageLink&&\n(f=SocialCalc.Callbacks.MakePageLink(c.pagename,c.workspacename,b,d)):f=encodeURI(c.url);b='<a href=\"'+f+'\"'+a+\">\"+e+\"</a>\";TiddlyWiki&&(d=SocialCalc.GetSpreadsheetControlObject(),a=null,c.pagename||c.url.match(/^tw:/))&&(c.desc&&(e=SocialCalc.special_chars(c.desc)),c.pagename?(a=c.pagename,c.desc||(e=c.pagename)):(a=c.url.replace(/^tw:/,\"\"),c.desc||(e=a)),a=d.tiddlyWiki.resolvePath(a),b='<a href=\"javascript:void(0);\" title=\"'+a+'\" onclick=\"TiddlyWiki.navigateToTiddler(\\''+a+\"');\\\">\"+e+\"</a>\");hack.log(\"html = \"+\nb,hack.url,\"SocialCalc.expand_text_link\");return b};\nSocialCalc.ParseCellLinkText=function(a){var c={url:\"\",desc:\"\",newwin:!1,pagename:\"\",workspace:\"\"},b=!1,d=a.length-1,e=0,f=a.lastIndexOf(\"<\"),g=a.lastIndexOf(\"[\"),l=a.lastIndexOf(\"{\"),h=-1;\">\"==a.charAt(d)&&-1!=f||\"]\"==a.charAt(d)&&-1!=g||!(\"}\"!=a.charAt(d)||\"]\"!=a.charAt(d-1)||-1==l||-1==g||g<l)?(\">\"==a.charAt(d)?(h=f-1,0<f&&\"<\"==a.charAt(h)&&\">\"==a.charAt(d-1)&&(h--,d--,c.newwin=!0)):\"]\"==a.charAt(d)?(h=g-1,b=!0,0<g&&\"[\"==a.charAt(h)&&\"]\"==a.charAt(d-1)&&(h--,d--,c.newwin=!0)):\"}\"==a.charAt(d)&&\n(h=l-1,b=!0,wsend=g,d--,0<g&&\"[\"==a.charAt(g-1)&&\"]\"==a.charAt(d-1)&&(wsend=g-1,d--,c.newwin=!0),\" \"==a.charAt(wsend-1)&&wsend--,c.workspace=a.substring(l+1,wsend)||\"\"),\" \"==a.charAt(h)&&h--,'\"'==a.charAt(e)&&'\"'==a.charAt(h)&&(e++,h--)):(d++,h=d);b?c.pagename=a.substring(g+1,d)||\"\":c.url=a.substring(f+1,d)||\"\";h>=e&&(c.desc=a.substring(e,h+1));return c};\nSocialCalc.ConvertSaveToOtherFormat=function(a,c,b){var d,e,f,g;e=\"\";if(\"scsave\"==c)return a;if(\"\"==a)return\"\";d=new SocialCalc.Sheet;d.ParseSheetSave(a);if(b)throw\"SocialCalc.ConvertSaveToOtherFormat: Not doing recalc.\";a=d.copiedfrom?SocialCalc.ParseRange(d.copiedfrom):{cr1:{row:1,col:1},cr2:{row:d.attribs.lastrow,col:d.attribs.lastcol}};if(\"html\"==c)return e=new SocialCalc.RenderContext(d),d.copiedfrom&&(e.rowpanes[0]={first:a.cr1.row,last:a.cr2.row},e.colpanes[0]={first:a.cr1.col,last:a.cr2.col}),\nc=document.createElement(\"div\"),a=e.RenderSheet(null,e.defaultHTMLlinkstyle),c.appendChild(a),delete e,delete d,e=c.innerHTML,delete a,delete c,e;for(b=a.cr1.row;b<=a.cr2.row;b++){for(f=a.cr1.col;f<=a.cr2.col;f++)g=SocialCalc.crToCoord(f,b),g=d.GetAssuredCell(g),g=g.errors?g.errors:g.datavalue+\"\",\"csv\"==c?(-1!=g.indexOf('\"')&&(g=g.replace(/\"/g,'\"\"')),/[, \\n\"]/.test(g)&&(g='\"'+g+'\"'),f>a.cr1.col&&(g=\",\"+g)):\"tab\"==c&&(-1!=g.indexOf(\"\\n\")&&(-1!=g.indexOf('\"')&&(g=g.replace(/\"/g,'\"\"')),g='\"'+g+'\"'),\nf>a.cr1.col&&(g=\"\\t\"+g)),e+=g;e+=\"\\n\"}return e};\nSocialCalc.ConvertOtherFormatToSave=function(a,c){var b,d,e,f,g,l,h,m,p,r,q,n,s=\"\",t=function(){r++;r>n&&(n=r);q=SocialCalc.crToCoord(r,p);SocialCalc.SetConvertedCell(b,q,g);g=\"\"};if(\"scsave\"==c)return a;b=new SocialCalc.Sheet;d=a.split(/\\r\\n|\\n/);n=0;if(\"csv\"==c){p=0;l=!1;for(e=0;e<d.length&&(e!=d.length-1||\"\"!=d[e]);e++)for(l?g+=\"\\n\":(g=\"\",p++,r=0),f=d[e],h=0;h<f.length;h++)m=f.charAt(h),'\"'==m?l?h<f.length-1&&'\"'==f.charAt(h+1)?(h++,g+='\"'):(l=!1,h==f.length-1&&t()):l=!0:(\",\"!=m||l?g+=m:t(),h!=\nf.length-1||l||t());0<n&&(b.attribs.lastrow=p,b.attribs.lastcol=n,s=b.CreateSheetSave(\"A1:\"+SocialCalc.crToCoord(n,p)))}if(\"tab\"==c){p=0;l=!1;for(e=0;e<d.length&&(e!=d.length-1||\"\"!=d[e]);e++)for(l?g+=\"\\n\":(g=\"\",p++,r=0),f=d[e],h=0;h<f.length;h++){m=f.charAt(h);if('\"'==m){if(l){h<f.length-1?'\"'==f.charAt(h+1)?(h++,g+='\"'):\"\\t\"==f.charAt(h+1)&&(h++,l=!1,t()):(l=!1,t());continue}if(\"\"==g){l=!0;continue}}\"\\t\"!=m||l?g+=m:t();h!=f.length-1||l||t()}0<n&&(b.attribs.lastrow=p,b.attribs.lastcol=n,s=b.CreateSheetSave(\"A1:\"+\nSocialCalc.crToCoord(n,p)))}return s};SocialCalc.SetConvertedCell=function(a,c,b){a=a.GetAssuredCell(c);c=SocialCalc.DetermineValueType(b);\"n\"==c.type&&c.value==b?(a.datatype=\"v\",a.valuetype=\"n\",a.datavalue=c.value):\"t\"==c.type.charAt(0)?(a.datatype=\"t\",a.valuetype=c.type,a.datavalue=c.value):(a.datatype=\"c\",a.valuetype=c.type,a.datavalue=c.value,a.formula=b)};SocialCalc||(SocialCalc={});\nSocialCalc.TableEditor=function(a){var c=SocialCalc.Constants;this.context=a;this.fullgrid=this.toplevel=null;this.noEdit=!1;this.timeout=this.cellhandles=this.logo=this.horizontaltablecontrol=this.verticaltablecontrol=this.inputEcho=this.inputBox=this.tableheight=this.height=this.tablewidth=this.width=null;this.ensureecell=this.busy=!1;this.deferredCommands=[];this.lastvisiblecol=this.lastnonscrollingcol=this.firstscrollingcolleft=this.firstscrollingcol=this.lastvisiblerow=this.lastnonscrollingrow=\nthis.firstscrollingrowtop=this.firstscrollingrow=this.headposition=this.gridposition=null;this.rowpositions=[];this.colpositions=[];this.rowheight=[];this.colwidth=[];this.ecell=null;this.state=\"start\";this.workingvalues={};this.imageprefix=c.defaultImagePrefix;this.idPrefix=c.defaultTableEditorIDPrefix;this.pageUpDnAmount=c.defaultPageUpDnAmount;this.recalcFunction=function(a){if(a.context.sheetobj.RecalcSheet)a.context.sheetobj.RecalcSheet(SocialCalc.EditorSheetStatusCallback,a);else return null};\nthis.ctrlkeyFunction=function(a,c){var e,f,g,l;switch(c){case \"[ctrl-c]\":case \"[ctrl-x]\":e=a.pasteTextarea;e.value=\"\";if(f=SocialCalc.GetEditorCellElement(a,a.ecell.row,a.ecell.col))f=SocialCalc.GetElementPosition(f.element),e.style.left=f.left-1+\"px\",e.style.top=f.top-1+\"px\";l=a.range.hasrange?SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom):a.ecell.coord;f=SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(a.context.sheetobj,l),\"tab\");\ng=\"[ctrl-c]\"==c||a.noEdit||a.ECellReadonly()?\"copy \"+l+\" formulas\":\"cut \"+l+\" formulas\";a.EditorScheduleSheetCommands(g,!0,!1);e.style.display=\"block\";e.value=f;e.focus();e.select();window.setTimeout(function(){var c=a.pasteTextarea;c.blur();c.style.display=\"none\";SocialCalc.KeyboardFocus()},200);break;case \"[ctrl-v]\":if(a.noEdit||a.ECellReadonly())break;e=a.pasteTextarea;e.value=\"\";if(f=SocialCalc.GetEditorCellElement(a,a.ecell.row,a.ecell.col))f=SocialCalc.GetElementPosition(f.element),e.style.left=\nf.left-1+\"px\",e.style.top=f.top-1+\"px\";e.style.display=\"block\";e.value=\"\";e.focus();window.setTimeout(function(){var c=a.pasteTextarea,d=c.value;c.blur();c.style.display=\"none\";var c=\"\",e=SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard,\"tab\"),d=d.replace(/\\r\\n/g,\"\\n\");d==e||1==d.length-e.length&&d.substring(0,d.length-1)==e||(c=\"loadclipboard \"+SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(d,\"tab\"))+\"\\n\");d=a.range.hasrange?SocialCalc.crToCoord(a.range.left,a.range.top):\na.ecell.coord;a.EditorScheduleSheetCommands(c+(\"paste \"+d+\" formulas\"),!0,!1);SocialCalc.KeyboardFocus()},200);break;case \"[ctrl-z]\":return a.EditorScheduleSheetCommands(\"undo\",!0,!1),!1;case \"[ctrl-s]\":if(!SocialCalc.Constants.AllowCtrlS)break;TiddlyWiki&&(e=SocialCalc.GetSpreadsheetControlObject(),TiddlyWiki.executeExtensionCmd(e,\"tiddlywiki-save\"),SocialCalc.KeyboardFocus());return!1;case \"[ctrl-j]\":if(!SocialCalc.Constants.AllowCtrlJ)break;window.setTimeout(function(){var c=a.context.sheetobj,\nd=c.GetAssuredCell(a.ecell.coord),c=window.prompt(\"Advanced Feature:\\n\\nCustom Numeric Format or Command\",d.nontextvalueformat?c.valueformats[d.nontextvalueformat-0]||\"\":\"\");if(null!=c){if(c.match(/^cmd:/))g=c.substring(4);else{if(c.match(/^edit:/)){g=c.substring(5);SocialCalc.CtrlSEditor&&SocialCalc.CtrlSEditor(g);return}l=a.range.hasrange?SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom):a.ecell.coord;g=\"set \"+l+\" nontextvalueformat \"+c}a.EditorScheduleSheetCommands(g,\n!0,!1)}},200);return!1}return!0};a.sheetobj.statuscallback=SocialCalc.EditorSheetStatusCallback;a.sheetobj.statuscallbackparams=this;this.StatusCallback={};this.MoveECellCallback={};this.RangeChangeCallback={};this.SettingsCallbacks={};this.ecell={coord:\"A1\",row:1,col:1};a.highlights[this.ecell.coord]=\"cursor\";this.range={hasrange:!1};this.range2={hasrange:!1}};SocialCalc.TableEditor.prototype.CreateTableEditor=function(a,c){return SocialCalc.CreateTableEditor(this,a,c)};\nSocialCalc.TableEditor.prototype.ResizeTableEditor=function(a,c){return SocialCalc.ResizeTableEditor(this,a,c)};SocialCalc.TableEditor.prototype.SaveEditorSettings=function(){return SocialCalc.SaveEditorSettings(this)};SocialCalc.TableEditor.prototype.LoadEditorSettings=function(a,c){return SocialCalc.LoadEditorSettings(this,a,c)};SocialCalc.TableEditor.prototype.EditorRenderSheet=function(){SocialCalc.EditorRenderSheet(this)};\nSocialCalc.TableEditor.prototype.EditorScheduleSheetCommands=function(a,c,b){SocialCalc.EditorScheduleSheetCommands(this,a,c,b)};SocialCalc.TableEditor.prototype.ScheduleSheetCommands=function(a,c){this.context.sheetobj.ScheduleSheetCommands(a,c)};SocialCalc.TableEditor.prototype.SheetUndo=function(){this.context.sheetobj.SheetUndo()};SocialCalc.TableEditor.prototype.SheetRedo=function(){this.context.sheetobj.SheetRedo()};\nSocialCalc.TableEditor.prototype.EditorStepSet=function(a,c){SocialCalc.EditorStepSet(this,a,c)};SocialCalc.TableEditor.prototype.GetStatuslineString=function(a,c,b){return SocialCalc.EditorGetStatuslineString(this,a,c,b)};SocialCalc.TableEditor.prototype.EditorMouseRegister=function(){return SocialCalc.EditorMouseRegister(this)};SocialCalc.TableEditor.prototype.EditorMouseUnregister=function(){return SocialCalc.EditorMouseUnregister(this)};\nSocialCalc.TableEditor.prototype.EditorMouseRange=function(a){return SocialCalc.EditorMouseRange(this,a)};SocialCalc.TableEditor.prototype.EditorProcessKey=function(a,c){return SocialCalc.EditorProcessKey(this,a,c)};SocialCalc.TableEditor.prototype.EditorAddToInput=function(a,c){return SocialCalc.EditorAddToInput(this,a,c)};SocialCalc.TableEditor.prototype.DisplayCellContents=function(){return SocialCalc.EditorDisplayCellContents(this)};\nSocialCalc.TableEditor.prototype.EditorSaveEdit=function(a){return SocialCalc.EditorSaveEdit(this,a)};SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange=function(a,c){return SocialCalc.EditorApplySetCommandsToRange(this,a,c)};SocialCalc.TableEditor.prototype.MoveECellWithKey=function(a){return SocialCalc.MoveECellWithKey(this,a)};SocialCalc.TableEditor.prototype.MoveECell=function(a){return SocialCalc.MoveECell(this,a)};\nSocialCalc.TableEditor.prototype.ReplaceCell=function(a,c,b){SocialCalc.ReplaceCell(this,a,c,b)};SocialCalc.TableEditor.prototype.UpdateCellCSS=function(a,c,b){SocialCalc.UpdateCellCSS(this,a,c,b)};SocialCalc.TableEditor.prototype.SetECellHeaders=function(a){SocialCalc.SetECellHeaders(this,a)};SocialCalc.TableEditor.prototype.EnsureECellVisible=function(){SocialCalc.EnsureECellVisible(this)};SocialCalc.TableEditor.prototype.ECellReadonly=function(a){return SocialCalc.ECellReadonly(this,a)};\nSocialCalc.TableEditor.prototype.RangeAnchor=function(a){SocialCalc.RangeAnchor(this,a)};SocialCalc.TableEditor.prototype.RangeExtend=function(a){SocialCalc.RangeExtend(this,a)};SocialCalc.TableEditor.prototype.RangeRemove=function(){SocialCalc.RangeRemove(this)};SocialCalc.TableEditor.prototype.Range2Remove=function(){SocialCalc.Range2Remove(this)};SocialCalc.TableEditor.prototype.FitToEditTable=function(){SocialCalc.FitToEditTable(this)};\nSocialCalc.TableEditor.prototype.CalculateEditorPositions=function(){SocialCalc.CalculateEditorPositions(this)};SocialCalc.TableEditor.prototype.ScheduleRender=function(){SocialCalc.ScheduleRender(this)};SocialCalc.TableEditor.prototype.DoRenderStep=function(){SocialCalc.DoRenderStep(this)};SocialCalc.TableEditor.prototype.SchedulePositionCalculations=function(){SocialCalc.SchedulePositionCalculations(this)};SocialCalc.TableEditor.prototype.DoPositionCalculations=function(){SocialCalc.DoPositionCalculations(this)};\nSocialCalc.TableEditor.prototype.CalculateRowPositions=function(a,c,b){return SocialCalc.CalculateRowPositions(this,a,c,b)};SocialCalc.TableEditor.prototype.CalculateColPositions=function(a,c,b){return SocialCalc.CalculateColPositions(this,a,c,b)};SocialCalc.TableEditor.prototype.ScrollRelative=function(a,c){SocialCalc.ScrollRelative(this,a,c)};SocialCalc.TableEditor.prototype.ScrollRelativeBoth=function(a,c){SocialCalc.ScrollRelativeBoth(this,a,c)};\nSocialCalc.TableEditor.prototype.PageRelative=function(a,c){SocialCalc.PageRelative(this,a,c)};SocialCalc.TableEditor.prototype.LimitLastPanes=function(){SocialCalc.LimitLastPanes(this)};SocialCalc.TableEditor.prototype.ScrollTableUpOneRow=function(){return SocialCalc.ScrollTableUpOneRow(this)};SocialCalc.TableEditor.prototype.ScrollTableDownOneRow=function(){return SocialCalc.ScrollTableDownOneRow(this)};SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol=function(){return SocialCalc.ScrollTableLeftOneCol(this)};\nSocialCalc.TableEditor.prototype.ScrollTableRightOneCol=function(){return SocialCalc.ScrollTableRightOneCol(this)};\nSocialCalc.CreateTableEditor=function(a,c,b){var d=SocialCalc.Constants,e=SocialCalc.AssignID;a.toplevel=document.createElement(\"div\");a.toplevel.style.position=\"relative\";e(a,a.toplevel,\"toplevel\");a.width=c;a.height=b;a.griddiv=document.createElement(\"div\");a.tablewidth=Math.max(0,c-d.defaultTableControlThickness);a.tableheight=Math.max(0,b-d.defaultTableControlThickness);a.griddiv.style.width=a.tablewidth+\"px\";a.griddiv.style.height=a.tableheight+\"px\";a.griddiv.style.overflow=\"hidden\";a.griddiv.style.cursor=\n\"default\";d.cteGriddivClass&&(a.griddiv.className=d.cteGriddivClass);e(a,a.griddiv,\"griddiv\");a.FitToEditTable();a.EditorRenderSheet();a.griddiv.appendChild(a.fullgrid);a.verticaltablecontrol=new SocialCalc.TableControl(a,!0,a.tableheight);a.verticaltablecontrol.CreateTableControl();e(a,a.verticaltablecontrol.main,\"tablecontrolv\");a.horizontaltablecontrol=new SocialCalc.TableControl(a,!1,a.tablewidth);a.horizontaltablecontrol.CreateTableControl();e(a,a.horizontaltablecontrol.main,\"tablecontrolh\");\nc=document.createElement(\"table\");a.layouttable=c;c.cellSpacing=0;c.cellPadding=0;e(a,c,\"layouttable\");d=document.createElement(\"tbody\");c.appendChild(d);c=document.createElement(\"tr\");d.appendChild(c);b=document.createElement(\"td\");b.appendChild(a.griddiv);c.appendChild(b);b=document.createElement(\"td\");b.appendChild(a.verticaltablecontrol.main);c.appendChild(b);c=document.createElement(\"tr\");d.appendChild(c);b=document.createElement(\"td\");b.appendChild(a.horizontaltablecontrol.main);c.appendChild(b);\nb=document.createElement(\"td\");d=\"url(\"+a.imageprefix+\"logo.gif) no-repeat center center\";TiddlyWiki&&(d=TiddlyWiki.getModifiedCssImageStyle(d));b.style.background=d;d=\"<div style='cursor:pointer;font-size:1px;'><img src='\"+a.imageprefix+\"1x1.gif' border='0' width='18' height='18'></div>\";if(TiddlyWiki)for(var f=/['][.]?[/]?images\\/(.+?)[']/g,g;g=f.exec(d);){var l=TiddlyWiki.getModifiedImgSrc(g[0].replace(/\\'/g,\"\"));l&&(d=d.replace(g[0],'\"'+l+'\"'))}b.innerHTML=d;c.appendChild(b);a.logo=b;e(a,a.logo,\n\"logo\");SocialCalc.TooltipRegister(b.firstChild.firstChild,\"SocialCalc\",null,a.toplevel);a.toplevel.appendChild(a.layouttable);a.noEdit||(a.inputEcho=new SocialCalc.InputEcho(a),e(a,a.inputEcho.main,\"inputecho\"));a.cellhandles=new SocialCalc.CellHandles(a);c=document.createElement(\"textarea\");SocialCalc.setStyles(c,\"display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);\");c.value=\"\";a.pasteTextarea=c;e(a,a.pasteTextarea,\"pastetextarea\");navigator.userAgent.match(/Safari\\//)&&\n!navigator.userAgent.match(/Chrome\\//)&&(window.removeEventListener(\"beforepaste\",SocialCalc.SafariPasteFunction,!1),window.addEventListener(\"beforepaste\",SocialCalc.SafariPasteFunction,!1),window.removeEventListener(\"beforecopy\",SocialCalc.SafariPasteFunction,!1),window.addEventListener(\"beforecopy\",SocialCalc.SafariPasteFunction,!1),window.removeEventListener(\"beforecut\",SocialCalc.SafariPasteFunction,!1),window.addEventListener(\"beforecut\",SocialCalc.SafariPasteFunction,!1));a.toplevel.appendChild(a.pasteTextarea);\nSocialCalc.MouseWheelRegister(a.toplevel,{WheelMove:SocialCalc.EditorProcessMouseWheel,editor:a});SocialCalc.KeyboardSetFocus(a);SocialCalc.EditorSheetStatusCallback(null,\"startup\",null,a);return a.toplevel};SocialCalc.SafariPasteFunction=function(a){a.preventDefault()};\nSocialCalc.ResizeTableEditor=function(a,c,b){var d=SocialCalc.Constants;a.width=c;a.height=b;a.toplevel.style.width=c+\"px\";a.toplevel.style.height=b+\"px\";a.tablewidth=Math.max(0,c-d.defaultTableControlThickness);a.tableheight=Math.max(0,b-d.defaultTableControlThickness);a.griddiv.style.width=a.tablewidth+\"px\";a.griddiv.style.height=a.tableheight+\"px\";a.verticaltablecontrol.main.style.height=a.tableheight+\"px\";a.horizontaltablecontrol.main.style.width=a.tablewidth+\"px\";a.FitToEditTable();a.ScheduleRender()};\nSocialCalc.SaveEditorSettings=function(a){var c,b,d=a.context,e=a.range,f;f=\"version:1.0\\n\";for(c=0;c<d.rowpanes.length;c++)f+=\"rowpane:\"+c+\":\"+d.rowpanes[c].first+\":\"+d.rowpanes[c].last+\"\\n\";for(c=0;c<d.colpanes.length;c++)f+=\"colpane:\"+c+\":\"+d.colpanes[c].first+\":\"+d.colpanes[c].last+\"\\n\";a.ecell&&(f+=\"ecell:\"+a.ecell.coord+\"\\n\");e.hasrange&&(f+=\"range:\"+e.anchorcoord+\":\"+e.top+\":\"+e.bottom+\":\"+e.left+\":\"+e.right+\"\\n\");for(b in a.SettingsCallbacks)f+=a.SettingsCallbacks[b].save(a,b);return f};\nSocialCalc.LoadEditorSettings=function(a,c,b){c=c.split(/\\r\\n|\\n/);var d=[],e,f,g,l=a.context,h,m;l.rowpanes=[{first:1,last:1}];l.colpanes=[{first:1,last:1}];a.ecell=null;a.range={hasrange:!1};a.range2={hasrange:!1};m=a.range;l.highlights={};h=l.highlights;for(f=0;f<c.length;f++)switch(e=c[f],d=e.split(\":\"),g=d[0],g){case \"version\":break;case \"rowpane\":l.rowpanes[d[1]-0]={first:d[2]-0,last:d[3]-0};break;case \"colpane\":l.colpanes[d[1]-0]={first:d[2]-0,last:d[3]-0};break;case \"ecell\":a.ecell=SocialCalc.coordToCr(d[1]);\na.ecell.coord=d[1];h[d[1]]=\"cursor\";break;case \"range\":m.hasrange=!0;m.anchorcoord=d[1];e=SocialCalc.coordToCr(m.anchorcoord);m.anchorrow=e.row;m.anchorcol=e.col;m.top=d[2]-0;m.bottom=d[3]-0;m.left=d[4]-0;m.right=d[5]-0;for(d=m.top;d<=m.bottom;d++)for(e=m.left;e<=m.right;e++)g=SocialCalc.crToCoord(e,d),\"cursor\"!=h[g]&&(h[g]=\"range\");break;default:a.SettingsCallbacks[g]&&a.SettingsCallbacks[g].load(a,g,e,b)}};\nSocialCalc.EditorRenderSheet=function(a){a.EditorMouseUnregister();a.fullgrid=a.context.RenderSheet(a.fullgrid);a.ecell&&a.SetECellHeaders(\"selected\");SocialCalc.AssignID(a,a.fullgrid,\"fullgrid\");a.EditorMouseRegister()};\nSocialCalc.EditorScheduleSheetCommands=function(a,c,b,d){if(\"start\"==a.state||d)if(a.busy&&!d)a.deferredCommands.push({cmdstr:c,saveundo:b});else switch(c){case \"recalc\":case \"redisplay\":a.context.sheetobj.ScheduleSheetCommands(c,!1);break;case \"undo\":a.SheetUndo();break;case \"redo\":a.SheetRedo();break;default:a.context.sheetobj.ScheduleSheetCommands(c,b)}};\nSocialCalc.EditorSheetStatusCallback=function(a,c,b,d){var e;a=d.context.sheetobj;var f=function(a){for(e in d.StatusCallback)d.StatusCallback[e].func&&d.StatusCallback[e].func(d,a,b,d.StatusCallback[e].params)};switch(c){case \"startup\":break;case \"cmdstart\":d.busy=!0;a.celldisplayneeded=\"\";break;case \"cmdextension\":break;case \"cmdend\":f(c);a.changedrendervalues&&(d.context.PrecomputeSheetFontsAndLayouts(),d.context.CalculateCellSkipData(),a.changedrendervalues=!1);a.celldisplayneeded&&!a.renderneeded&&\n(cr=SocialCalc.coordToCr(a.celldisplayneeded),c=SocialCalc.GetEditorCellElement(d,cr.row,cr.col),d.ReplaceCell(c,cr.row,cr.col));if(d.deferredCommands.length){a=d.deferredCommands.shift();d.EditorScheduleSheetCommands(a.cmdstr,a.saveundo,!0);return}a.attribs.needsrecalc&&(\"off\"!=a.attribs.recalc||a.recalconce)&&d.recalcFunction?(d.FitToEditTable(),a.renderneeded=!1,a.recalconce&&delete a.recalconce,d.recalcFunction(d)):a.renderneeded?(d.FitToEditTable(),a.renderneeded=!1,d.ScheduleRender()):d.SchedulePositionCalculations();\nif(\"col\"==a.hiddencolrow){for(c=d.ecell.col;\"yes\"==a.colattribs.hide[SocialCalc.rcColname(c)];)c++;c=SocialCalc.crToCoord(c,d.ecell.row);d.MoveECell(c);a.hiddencolrow=\"\"}if(\"row\"==a.hiddencolrow){for(c=d.ecell.row;\"yes\"==a.rowattribs.hide[c];)c++;c=SocialCalc.crToCoord(d.ecell.col,c);d.MoveECell(c);a.hiddencolrow=\"\"}return;case \"calcstart\":d.busy=!0;break;case \"calccheckdone\":case \"calcorder\":case \"calcstep\":case \"calcloading\":case \"calcserverfunc\":break;case \"calcfinished\":f(c);d.ScheduleRender();\nreturn;case \"schedrender\":d.busy=!0;break;case \"renderdone\":break;case \"schedposcalc\":d.busy=!0;break;case \"doneposcalc\":d.deferredCommands.length?(f(c),a=d.deferredCommands.shift(),d.EditorScheduleSheetCommands(a.cmdstr,a.saveundo,!0)):(d.busy=!1,f(c),\"start\"==d.state&&d.DisplayCellContents());return;default:addmsg(\"Unknown status: \"+c)}f(c)};\nSocialCalc.EditorGetStatuslineString=function(a,c,b,d){var e=SocialCalc.Constants,f,g,l;f=\"\";switch(c){case \"moveecell\":case \"rangechange\":case \"startup\":break;case \"cmdstart\":d.command=!0;document.body.style.cursor=\"progress\";a.griddiv.style.cursor=\"progress\";f=e.s_statusline_executing;break;case \"cmdextension\":f=\"Command Extension: \"+b;break;case \"cmdend\":d.command=!1;break;case \"schedrender\":f=e.s_statusline_displaying;break;case \"renderdone\":f=\" \";break;case \"schedposcalc\":f=e.s_statusline_displaying;\nbreak;case \"cmdendnorender\":case \"doneposcalc\":document.body.style.cursor=\"default\";a.griddiv.style.cursor=\"default\";break;case \"calcorder\":f=e.s_statusline_ordering+Math.floor(100*b.count/(b.total||1))+\"%\";break;case \"calcstep\":f=e.s_statusline_calculating+Math.floor(100*b.count/(b.total||1))+\"%\";break;case \"calcloading\":f=e.s_statusline_calculatingls+\": \"+b.sheetname;break;case \"calcserverfunc\":f=e.s_statusline_calculating+Math.floor(100*b.count/(b.total||1))+\"%, \"+e.s_statusline_doingserverfunc+\nb.funcname+e.s_statusline_incell+b.coord;break;case \"calcstart\":d.calculating=!0;document.body.style.cursor=\"progress\";a.griddiv.style.cursor=\"progress\";f=e.s_statusline_calcstart;break;case \"calccheckdone\":break;case \"calcfinished\":d.calculating=!1;break;default:f=c}!f&&d.calculating&&(f=e.s_statusline_calculating);if(!(d.calculating||d.command||f||!a.range.hasrange||a.range.left==a.range.right&&a.range.top==a.range.bottom)){c=0;for(b=a.range.top;b<=a.range.bottom;b++)for(g=a.range.left;g<=a.range.right;g++)(l=\na.context.sheetobj.cells[SocialCalc.crToCoord(g,b)])&&l.valuetype&&\"n\"==l.valuetype.charAt(0)&&(c+=l.datavalue-0);c=SocialCalc.FormatNumber.formatNumberWithFormat(c,\"[,]General\",\"\");b=SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom);f=b+\" (\"+(a.range.right-a.range.left+1)+\"x\"+(a.range.bottom-a.range.top+1)+\") \"+e.s_statusline_sum+\"=\"+c+\" \"+f}f=a.ecell.coord+\" \"+f;d.calculating||\"yes\"!=a.context.sheetobj.attribs.needsrecalc||(f+=\" \"+\ne.s_statusline_recalcneeded);if(a=a.context.sheetobj.attribs.circularreferencecell)a=a.replace(/\\|/,\" referenced by \"),f+=\" \"+e.s_statusline_circref+a+\"</span>\";return f};SocialCalc.EditorMouseInfo={registeredElements:[],editor:null,element:null,ignore:!1,mousedowncoord:\"\",mouselastcoord:\"\",mouseresizecol:\"\",mouseresizeclientx:null,mouseresizedisplay:null};\nSocialCalc.EditorMouseRegister=function(a){var c=SocialCalc.EditorMouseInfo,b=a.fullgrid,d;for(d=0;d<c.registeredElements.length;d++)if(c.registeredElements[d].editor==a){if(c.registeredElements[d].element==b)return;break}d<c.registeredElements.length?c.registeredElements[d].element=b:c.registeredElements.push({element:b,editor:a});if(b.addEventListener)b.addEventListener(\"mousedown\",SocialCalc.ProcessEditorMouseDown,!1),b.addEventListener(\"dblclick\",SocialCalc.ProcessEditorDblClick,!1);else if(b.attachEvent)b.attachEvent(\"onmousedown\",\nSocialCalc.ProcessEditorMouseDown),b.attachEvent(\"ondblclick\",SocialCalc.ProcessEditorDblClick);else throw\"Browser not supported\";c.ignore=!1};\nSocialCalc.EditorMouseUnregister=function(a){var c=SocialCalc.EditorMouseInfo,b;for(b=0;b<c.registeredElements.length&&c.registeredElements[b].editor!=a;b++);b<c.registeredElements.length&&(a=c.registeredElements[b].element,a.removeEventListener?(a.removeEventListener(\"mousedown\",SocialCalc.ProcessEditorMouseDown,!1),a.removeEventListener(\"dblclick\",SocialCalc.ProcessEditorDblClick,!1)):a.detachEvent&&(a.detachEvent(\"onmousedown\",SocialCalc.ProcessEditorMouseDown),a.detachEvent(\"ondblclick\",SocialCalc.ProcessEditorDblClick)),\nc.registeredElements.splice(b,1))};\nSocialCalc.ProcessEditorMouseDown=function(a){var c,b,d,e=a||window.event,f=SocialCalc.EditorMouseInfo,g=e.target||e.srcElement;if(!f.ignore){for(c=null;!c&&g;g=g.parentNode)c=SocialCalc.LookupElement(g,f.registeredElements);if(c){if(c=c.editor,f.element=g,d=c.range,b=SocialCalc.GetElementPositionWithScroll(c.toplevel),b=SocialCalc.GridMousePosition(c,e.clientX-b.left,e.clientY-b.top))f.editor=c,b.rowheader&&b.rowtounhide?SocialCalc.ProcessEditorRowsizeMouseDown(a,g,b):b.colheader&&b.coltoresize?\nSocialCalc.ProcessEditorColsizeMouseDown(a,g,b):b.coord&&(d.hasrange||a.shiftKey&&c.RangeAnchor(),b=c.MoveECell(b.coord),d.hasrange&&(a.shiftKey?c.RangeExtend():c.RangeRemove()),f.mousedowncoord=b,f.mouselastcoord=b,c.EditorMouseRange(b),SocialCalc.KeyboardSetFocus(c),\"start\"!=c.state&&c.inputBox&&c.inputBox.element.focus(),TiddlyWiki&&(a=SocialCalc.GetSpreadsheetControlObject(),a.inputView&&a.inputView.focus()),document.addEventListener?(document.addEventListener(\"mousemove\",SocialCalc.ProcessEditorMouseMove,\n!0),document.addEventListener(\"mouseup\",SocialCalc.ProcessEditorMouseUp,!0)):g.attachEvent&&(g.setCapture(),g.attachEvent(\"onmousemove\",SocialCalc.ProcessEditorMouseMove),g.attachEvent(\"onmouseup\",SocialCalc.ProcessEditorMouseUp),g.attachEvent(\"onlosecapture\",SocialCalc.ProcessEditorMouseUp)),e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,e.preventDefault?e.preventDefault():e.returnValue=!1)}else f.editor=null}};\nSocialCalc.EditorMouseRange=function(a,c){var b,d,e=a.range;switch(a.state){case \"input\":b=a.inputBox.GetText();d=a.workingvalues;if(0<=\"(+-*/,:!&<>=^\".indexOf(b.slice(-1))&&\"=\"==b.slice(0,1)||\"=\"==b)d.partialexpr=b;d.partialexpr?c&&(e.hasrange?a.inputBox.SetText(d.partialexpr+SocialCalc.crToCoord(e.left,e.top)+\":\"+SocialCalc.crToCoord(e.right,e.bottom)):a.inputBox.SetText(d.partialexpr+c)):(a.inputBox.Blur(),a.inputBox.ShowInputBox(!1),a.state=\"start\",a.cellhandles.ShowCellHandles(!0),a.EditorSaveEdit(),\na.inputBox.DisplayCellContents(null));break;case \"inputboxdirect\":a.inputBox.Blur(),a.inputBox.ShowInputBox(!1),a.state=\"start\",a.cellhandles.ShowCellHandles(!0),a.EditorSaveEdit(),a.inputBox.DisplayCellContents(null)}};\nSocialCalc.ProcessEditorMouseMove=function(a){var c,b,d=a||window.event,e=SocialCalc.EditorMouseInfo;(c=e.editor)&&!e.ignore&&(b=SocialCalc.GetElementPositionWithScroll(c.toplevel),b=SocialCalc.GridMousePosition(c,d.clientX-b.left,d.clientY-b.top))&&(b&&!b.coord?SocialCalc.SetDragAutoRepeat(c,b):(SocialCalc.SetDragAutoRepeat(c,null),b.coord&&(b.coord!=e.mouselastcoord&&(a.shiftKey||c.range.hasrange||c.RangeAnchor(e.mousedowncoord),c.MoveECell(b.coord),c.RangeExtend()),e.mouselastcoord=b.coord,c.EditorMouseRange(b.coord),\nd.stopPropagation?d.stopPropagation():d.cancelBubble=!0,d.preventDefault?d.preventDefault():d.returnValue=!1)))};\nSocialCalc.ProcessEditorMouseUp=function(a){var c,b,d=a||window.event,e=SocialCalc.EditorMouseInfo;if((a=e.editor)&&!e.ignore&&(c=e.element,b=SocialCalc.GetElementPositionWithScroll(a.toplevel),b=SocialCalc.GridMousePosition(a,d.clientX-b.left,d.clientY-b.top),SocialCalc.SetDragAutoRepeat(a,null),b))return b.coord||(b.coord=a.ecell.coord),a.range.hasrange?(a.MoveECell(b.coord),a.RangeExtend()):b.coord&&b.coord!=e.mousedowncoord&&(a.RangeAnchor(e.mousedowncoord),a.MoveECell(b.coord),a.RangeExtend()),\na.EditorMouseRange(b.coord),d.stopPropagation?d.stopPropagation():d.cancelBubble=!0,d.preventDefault?d.preventDefault():d.returnValue=!1,document.removeEventListener?(document.removeEventListener(\"mousemove\",SocialCalc.ProcessEditorMouseMove,!0),document.removeEventListener(\"mouseup\",SocialCalc.ProcessEditorMouseUp,!0)):c.detachEvent&&(c.detachEvent(\"onlosecapture\",SocialCalc.ProcessEditorMouseUp),c.detachEvent(\"onmouseup\",SocialCalc.ProcessEditorMouseUp),c.detachEvent(\"onmousemove\",SocialCalc.ProcessEditorMouseMove),\nc.releaseCapture()),e.editor=null,!1};\nSocialCalc.ProcessEditorColsizeMouseDown=function(a,c,b){a=a||window.event;c=SocialCalc.EditorMouseInfo;var d=c.editor,e=SocialCalc.GetElementPositionWithScroll(d.toplevel),e=a.clientX-e.left;c.mouseresizecolnum=b.coltoresize;c.mouseresizecol=SocialCalc.rcColname(b.coltoresize);c.mousedownclientx=e;c.mousecoltounhide=b.coltounhide;c.mousecoltounhide||(e=document.createElement(\"div\"),c.mouseresizedisplay=e,e.style.width=\"auto\",e.style.position=\"absolute\",e.style.zIndex=100,e.style.top=d.headposition.top+\n\"px\",e.style.left=d.colpositions[b.coltoresize]+\"px\",e.innerHTML='<table cellpadding=\"0\" cellspacing=\"0\"><tr><td style=\"height:100px;border:1px dashed black;background-color:white;width:'+(d.context.colwidth[c.mouseresizecolnum]-2)+'px;\"> </td><td><div style=\"font-size:small;color:white;background-color:gray;padding:4px;\">'+d.context.colwidth[c.mouseresizecolnum]+\"</div></td></tr></table>\",SocialCalc.setStyles(e.firstChild.lastChild.firstChild.childNodes[0],\"filter:alpha(opacity=85);opacity:.85;\"),\nd.toplevel.appendChild(e));document.addEventListener?(document.addEventListener(\"mousemove\",SocialCalc.ProcessEditorColsizeMouseMove,!0),document.addEventListener(\"mouseup\",SocialCalc.ProcessEditorColsizeMouseUp,!0)):d.toplevel.attachEvent&&(d.toplevel.setCapture(),d.toplevel.attachEvent(\"onmousemove\",SocialCalc.ProcessEditorColsizeMouseMove),d.toplevel.attachEvent(\"onmouseup\",SocialCalc.ProcessEditorColsizeMouseUp),d.toplevel.attachEvent(\"onlosecapture\",SocialCalc.ProcessEditorColsizeMouseUp));a.stopPropagation?\na.stopPropagation():a.cancelBubble=!0;a.preventDefault?a.preventDefault():a.returnValue=!1};\nSocialCalc.ProcessEditorColsizeMouseMove=function(a){a=a||window.event;var c=SocialCalc.EditorMouseInfo,b=c.editor;if(b){if(!c.mousecoltounhide){var d=SocialCalc.GetElementPositionWithScroll(b.toplevel),b=b.context.colwidth[c.mouseresizecolnum]-0+(a.clientX-d.left-c.mousedownclientx);b<SocialCalc.Constants.defaultMinimumColWidth&&(b=SocialCalc.Constants.defaultMinimumColWidth);c=c.mouseresizedisplay;c.innerHTML='<table cellpadding=\"0\" cellspacing=\"0\"><tr><td style=\"height:100px;border:1px dashed black;background-color:white;width:'+\n(b-2)+'px;\"> </td><td><div style=\"font-size:small;color:white;background-color:gray;padding:4px;\">'+b+\"</div></td></tr></table>\";SocialCalc.setStyles(c.firstChild.lastChild.firstChild.childNodes[0],\"filter:alpha(opacity=85);opacity:.85;\")}a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;a.preventDefault?a.preventDefault():a.returnValue=!1}};\nSocialCalc.ProcessEditorColsizeMouseUp=function(a){var c=a||window.event;a=SocialCalc.EditorMouseInfo;var b=a.editor;if(b){element=a.element;var d=SocialCalc.GetElementPositionWithScroll(b.toplevel),d=c.clientX-d.left;c.stopPropagation?c.stopPropagation():c.cancelBubble=!0;c.preventDefault?c.preventDefault():c.returnValue=!1;document.removeEventListener?(document.removeEventListener(\"mousemove\",SocialCalc.ProcessEditorColsizeMouseMove,!0),document.removeEventListener(\"mouseup\",SocialCalc.ProcessEditorColsizeMouseUp,\n!0)):b.toplevel.detachEvent&&(b.toplevel.detachEvent(\"onlosecapture\",SocialCalc.ProcessEditorColsizeMouseUp),b.toplevel.detachEvent(\"onmouseup\",SocialCalc.ProcessEditorColsizeMouseUp),b.toplevel.detachEvent(\"onmousemove\",SocialCalc.ProcessEditorColsizeMouseMove),b.toplevel.releaseCapture());a.mousecoltounhide?b.EditorScheduleSheetCommands(\"set \"+SocialCalc.rcColname(a.mousecoltounhide)+\" hide\",!0,!1):(c=b.context.colwidth[a.mouseresizecolnum]-0+(d-a.mousedownclientx),c<SocialCalc.Constants.defaultMinimumColWidth&&\n(c=SocialCalc.Constants.defaultMinimumColWidth),b.EditorScheduleSheetCommands(\"set \"+a.mouseresizecol+\" width \"+c,!0,!1),b.timeout&&window.clearTimeout(b.timeout),b.timeout=window.setTimeout(SocialCalc.FinishColsize,1));return!1}};SocialCalc.FinishColsize=function(){var a=SocialCalc.EditorMouseInfo,c=a.editor;c&&(c.toplevel.removeChild(a.mouseresizedisplay),a.mouseresizedisplay=null,a.editor=null)};\nSocialCalc.ProcessEditorRowsizeMouseDown=function(a,c,b){a=a||window.event;c=SocialCalc.EditorMouseInfo;var d=c.editor;SocialCalc.GetElementPositionWithScroll(d.toplevel);c.mouserowtounhide=b.rowtounhide;document.addEventListener?(document.addEventListener(\"mousemove\",SocialCalc.ProcessEditorRowsizeMouseMove,!0),document.addEventListener(\"mouseup\",SocialCalc.ProcessEditorRowsizeMouseUp,!0)):d.toplevel.attachEvent&&(d.toplevel.setCapture(),d.toplevel.attachEvent(\"onmousemove\",SocialCalc.ProcessEditorRowsizeMouseMove),\nd.toplevel.attachEvent(\"onmouseup\",SocialCalc.ProcessEditorRowsizeMouseUp),d.toplevel.attachEvent(\"onlosecapture\",SocialCalc.ProcessEditorRowsizeMouseUp));a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;a.preventDefault?a.preventDefault():a.returnValue=!1};SocialCalc.ProcessEditorRowsizeMouseMove=function(a){a=a||window.event;SocialCalc.EditorMouseInfo.editor&&(a.stopPropagation?a.stopPropagation():a.cancelBubble=!0,a.preventDefault?a.preventDefault():a.returnValue=!1)};\nSocialCalc.ProcessEditorRowsizeMouseUp=function(a){a=a||window.event;var c=SocialCalc.EditorMouseInfo,b=c.editor;if(b)return element=c.element,SocialCalc.GetElementPositionWithScroll(b.toplevel),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0,a.preventDefault?a.preventDefault():a.returnValue=!1,document.removeEventListener?(document.removeEventListener(\"mousemove\",SocialCalc.ProcessEditorRowsizeMouseMove,!0),document.removeEventListener(\"mouseup\",SocialCalc.ProcessEditorRowsizeMouseUp,!0)):\nb.toplevel.detachEvent&&(b.toplevel.detachEvent(\"onlosecapture\",SocialCalc.ProcessEditorRowsizeMouseUp),b.toplevel.detachEvent(\"onmouseup\",SocialCalc.ProcessEditorRowsizeMouseUp),b.toplevel.detachEvent(\"onmousemove\",SocialCalc.ProcessEditorRowsizeMouseMove),b.toplevel.releaseCapture()),c.mouserowtounhide&&b.EditorScheduleSheetCommands(\"set \"+c.mouserowtounhide+\" hide\",!0,!1),!1};SocialCalc.AutoRepeatInfo={timer:null,mouseinfo:null,repeatinterval:1E3,editor:null,repeatcallback:null};\nSocialCalc.SetDragAutoRepeat=function(a,c,b){var d=SocialCalc.AutoRepeatInfo;d.repeatcallback=b;if(c){d.editor=a;d.mouseinfo&&(c.rowheader||c.rowfooter?c.row!=d.mouseinfo.row&&(b=SocialCalc.crToCoord(a.ecell.col,c.row),d.repeatcallback?(a=c.row<d.mouseinfo.row?\"left\":c.row>d.mouseinfo.row?\"right\":\"\",d.repeatcallback(b,a)):(a.MoveECell(b),a.MoveECell(b),a.RangeExtend(),a.EditorMouseRange(b))):(c.colheader||c.colfooter)&&c.col!=d.mouseinfo.col&&(b=SocialCalc.crToCoord(c.col,a.ecell.row),d.repeatcallback?\n(a=c.row<d.mouseinfo.row?\"left\":c.row>d.mouseinfo.row?\"right\":\"\",d.repeatcallback(b,a)):(a.MoveECell(b),a.RangeExtend(),a.EditorMouseRange(b))));d.mouseinfo=c;if(5>c.distance)d.repeatinterval=333;else if(10>c.distance)d.repeatinterval=250;else if(25>c.distance)d.repeatinterval=100;else if(35>c.distance)d.repeatinterval=75;else{d.timer&&(window.clearTimeout(d.timer),d.timer=null);return}d.timer||(d.timer=window.setTimeout(SocialCalc.DragAutoRepeat,d.repeatinterval))}else d.timer&&(window.clearTimeout(d.timer),\nd.timer=null),d.mouseinfo=null};\nSocialCalc.DragAutoRepeat=function(){var a=SocialCalc.AutoRepeatInfo,c=a.mouseinfo,b;c.rowheader?b=\"left\":c.rowfooter?b=\"right\":c.colheader?b=\"up\":c.colfooter&&(b=\"down\");a.repeatcallback?(c=SocialCalc.coordToCr(a.editor.ecell.coord),\"left\"==b&&1<c.col?c.col--:\"right\"==b?c.col++:\"up\"==b&&1<c.row?c.row--:\"down\"==b&&c.row++,c=SocialCalc.crToCoord(c.col,c.row),a.repeatcallback(c,b)):(c=a.editor.MoveECellWithKey(\"[a\"+b+\"]shifted\"))&&a.editor.EditorMouseRange(c);a.timer=window.setTimeout(SocialCalc.DragAutoRepeat,\na.repeatinterval)};\nSocialCalc.ProcessEditorDblClick=function(a){var c,b;a=a||window.event;var d=SocialCalc.EditorMouseInfo,e=a.target||a.srcElement;if(!d.ignore){for(c=null;!c&&e;e=e.parentNode)c=SocialCalc.LookupElement(e,d.registeredElements);if(c){if(c=c.editor,b=SocialCalc.GetElementPositionWithScroll(c.toplevel),(b=SocialCalc.GridMousePosition(c,a.clientX-b.left,a.clientY-b.top))&&b.coord){d.editor=c;d.element=e;sheetobj=c.context.sheetobj;switch(c.state){case \"start\":SocialCalc.EditorOpenCellEdit(c)}a.stopPropagation?a.stopPropagation():\na.cancelBubble=!0;a.preventDefault?a.preventDefault():a.returnValue=!1}}else d.editor=null}};SocialCalc.EditorOpenCellEdit=function(a){var c;if(!a.ecell||!a.inputBox||a.inputBox.element.disabled)return!0;a.inputBox.ShowInputBox(!0);a.inputBox.Focus();a.state=\"inputboxdirect\";a.inputBox.SetText(\"\");a.inputBox.DisplayCellContents();a.inputBox.Select(\"end\");c=a.workingvalues;c.partialexpr=\"\";c.ecoord=a.ecell.coord;c.erow=a.ecell.row;c.ecol=a.ecell.col};\nSocialCalc.EditorProcessKey=function(a,c,b){hack.log(\"editor.state = \"+a.state+\", ch = \"+c,hack.keyboard,\"SocialCalc.EditorProcessKey\");var d=SocialCalc.GetSpreadsheetControlObject();TiddlyWiki&&(d.tiddlyWiki.saveTodo.flagStart=!0);var e,f=a.workingvalues,g=a.range;\"string\"!=typeof c&&(c=\"\");switch(a.state){case \"start\":b.shiftKey&&\"[a\"==c.substr(0,2)&&(c+=\"shifted\");\"[enter]\"==c&&(c=\"[adown]\");\"[tab]\"==c&&(c=b.shiftKey?\"[aleft]\":\"[aright]\");if(\"[a\"==c.substr(0,2)||\"[pg\"==c.substr(0,3)||\"[home]\"==\nc)return a=a.MoveECellWithKey(c),!a;if(TiddlyWiki&&d.tiddlyWiki.flagView)break;if(\"[del]\"==c||\"[backspace]\"==c){a.noEdit||a.ECellReadonly()||a.EditorApplySetCommandsToRange(\"empty\",\"\");break}if(\"[esc]\"==c){if(g.hasrange)for(e in a.RangeRemove(),a.MoveECell(g.anchorcoord),a.StatusCallback)a.StatusCallback[e].func(a,\"specialkey\",c,a.StatusCallback[e].params);break}if(\"[f2]\"==c){if(a.noEdit||a.ECellReadonly())return!0;SocialCalc.EditorOpenCellEdit(a);break}if(1<c.length&&\"[\"==c.substr(0,1)||0==c.length)return a.ctrlkeyFunction&&\n0<c.length?a.ctrlkeyFunction(a,c):!0;if(!a.ecell||!a.inputBox||a.ECellReadonly())return!0;a.inputBox.element.disabled=!1;a.state=\"input\";a.inputBox.ShowInputBox(!0);a.inputBox.Focus();a.inputBox.SetText(c);a.inputBox.Select(\"end\");f.partialexpr=\"\";f.ecoord=a.ecell.coord;f.erow=a.ecell.row;f.ecol=a.ecell.col;a.RangeRemove();break;case \"input\":d=a.inputBox.GetText();if(a.inputBox.skipOne)break;if(\"[esc]\"==c||\"[enter]\"==c||\"[tab]\"==c||c&&\"[a\"==c.substr(0,2)){if(0<=\"(+-*/,:!&<>=^\".indexOf(d.slice(-1))&&\n\"=\"==d.slice(0,1)||\"=\"==d)f.partialexpr=d;if(f.partialexpr&&(b.shiftKey&&\"[a\"==c.substr(0,2)&&(c+=\"shifted\"),d=a.MoveECellWithKey(c))){g.hasrange?a.inputBox.SetText(f.partialexpr+SocialCalc.crToCoord(g.left,g.top)+\":\"+SocialCalc.crToCoord(g.right,g.bottom)):a.inputBox.SetText(f.partialexpr+d);break}a.inputBox.Blur();a.inputBox.ShowInputBox(!1);a.state=\"start\";a.cellhandles.ShowCellHandles(!0);\"[esc]\"!=c?(a.EditorSaveEdit(),a.ecell.coord!=f.ecoord&&a.MoveECell(f.ecoord),\"[enter]\"==c&&(c=\"[adown]\"),\n\"[tab]\"==c&&(c=b.shiftKey?\"[aleft]\":\"[aright]\"),\"[a\"==c.substr(0,2)&&a.MoveECellWithKey(c)):(a.inputBox.DisplayCellContents(),a.RangeRemove(),a.MoveECell(f.ecoord));break}if(f.partialexpr&&\"[backspace]\"==c){a.inputBox.SetText(f.partialexpr);f.partialexpr=\"\";a.RangeRemove();a.MoveECell(f.ecoord);a.inputBox.ShowInputBox(!0);break}if(\"[f2]\"==c)break;g.hasrange&&a.RangeRemove();a.MoveECell(f.ecoord);f.partialexpr&&(a.inputBox.ShowInputBox(!0),f.partialexpr=\"\");return!0;case \"inputboxdirect\":a.inputBox.GetText();\nif(\"[esc]\"==c||\"[enter]\"==c||\"[tab]\"==c){a.inputBox.Blur();a.inputBox.ShowInputBox(!1);a.state=\"start\";a.cellhandles.ShowCellHandles(!0);\"[esc]\"==c?a.inputBox.DisplayCellContents():(a.EditorSaveEdit(),a.ecell.coord!=f.ecoord&&a.MoveECell(f.ecoord),\"[enter]\"==c&&(c=\"[adown]\"),\"[tab]\"==c&&(c=b.shiftKey?\"[aleft]\":\"[aright]\"),\"[a\"==c.substr(0,2)&&a.MoveECellWithKey(c));break}if(\"[f2]\"==c)break;return!0;case \"skip-and-start\":a.state=\"start\";a.cellhandles.ShowCellHandles(!0);break;default:return!0}return!1};\nSocialCalc.EditorAddToInput=function(a,c,b){var d=a.workingvalues;if(!a.noEdit&&!a.ECellReadonly())switch(a.state){case \"start\":a.state=\"input\";a.inputBox.ShowInputBox(!0);a.inputBox.element.disabled=!1;a.inputBox.Focus();a.inputBox.SetText((b||\"\")+c);a.inputBox.Select(\"end\");d.partialexpr=\"\";d.ecoord=a.ecell.coord;d.erow=a.ecell.row;d.ecol=a.ecell.col;a.RangeRemove();break;case \"input\":case \"inputboxdirect\":a.inputBox.element.focus(),d.partialexpr&&(a.inputBox.SetText(d.partialexpr),d.partialexpr=\n\"\",a.RangeRemove(),a.MoveECell(d.ecoord)),a.inputBox.SetText(a.inputBox.GetText()+c)}};SocialCalc.EditorDisplayCellContents=function(a){a.inputBox&&a.inputBox.DisplayCellContents()};\nSocialCalc.EditorSaveEdit=function(a,c){var b,d,e;b=a.context.sheetobj;var f=a.workingvalues;e=\"string\"==typeof c?c:a.inputBox.GetText();b=SocialCalc.GetCellContents(b,f.ecoord)+\"\";e!=b&&(b=e.charAt(0),\"=\"==b&&-1==e.indexOf(\"\\n\")?(d=\"formula\",e=e.substring(1)):\"'\"==b?(d=\"text t\",e=e.substring(1),b=SocialCalc.DetermineValueType(e),\"t\"==b.type.charAt(0)&&(d=\"text \"+b.type)):0==e.length?d=\"empty\":(b=SocialCalc.DetermineValueType(e),d=\"n\"==b.type&&e==b.value+\"\"?\"value n\":\"t\"==b.type.charAt(0)?\"text \"+\nb.type:\"\"==b.type?\"text t\":\"constant \"+b.type+\" \"+b.value),\"t\"==d.charAt(0)&&(e=SocialCalc.encodeForSave(e)),e=\"set \"+f.ecoord+\" \"+d+\" \"+e,a.EditorScheduleSheetCommands(e,!0,!1))};SocialCalc.EditorApplySetCommandsToRange=function(a,c){var b;b=a.ecell;var d=a.range;d.hasrange?(coord=SocialCalc.crToCoord(d.left,d.top)+\":\"+SocialCalc.crToCoord(d.right,d.bottom),b=\"set \"+coord+\" \"+c):b=\"set \"+b.coord+\" \"+c;a.EditorScheduleSheetCommands(b,!0,!1);a.DisplayCellContents()};\nSocialCalc.EditorProcessMouseWheel=function(a,c,b,d){d.functionobj.editor.busy||(0<c&&d.functionobj.editor.ScrollRelative(!0,Math.floor(1.5*-c)),0>c&&d.functionobj.editor.ScrollRelative(!0,Math.ceil(1.5*-c)))};\nSocialCalc.GridMousePosition=function(a,c,b){var d,e,f={};for(d=1;d<a.rowpositions.length&&!(a.rowheight[d]&&a.rowpositions[d]+a.rowheight[d]>b);d++);for(e=1;e<a.colpositions.length&&!(a.colwidth[e]&&a.colpositions[e]+a.colwidth[e]>c);e++);f.row=d;f.col=e;if(a.headposition){if(c<a.headposition.left&&c>=a.gridposition.left){f.rowheader=!0;f.distance=a.headposition.left-c;f.rowtounhide=\"\";if(unhide=a.context.rowunhidetop[d])pos=SocialCalc.GetElementPosition(unhide),c>=pos.left&&c<pos.left+unhide.offsetWidth&&\nb>=pos.top&&b<pos.top+unhide.offsetHeight&&(f.rowtounhide=d+1);if(unhide=a.context.rowunhidebottom[d])pos=SocialCalc.GetElementPosition(unhide),c>=pos.left&&c<pos.left+unhide.offsetWidth&&b>=pos.top&&b<pos.top+unhide.offsetHeight&&(f.rowtounhide=d-1)}else if(b<a.headposition.top&&b>a.gridposition.top){f.colheader=!0;f.distance=a.headposition.top-b;f.coltoresize=e-(a.colpositions[e]+a.colwidth[e]/2>c?1:0)||1;if(unhide=a.context.colunhideleft[e])pos=SocialCalc.GetElementPosition(unhide),c>=pos.left&&\nc<pos.left+unhide.offsetWidth&&b>=pos.top&&b<pos.top+unhide.offsetHeight&&(f.coltounhide=e+1);if(unhide=a.context.colunhideright[e])pos=SocialCalc.GetElementPosition(unhide),c>=pos.left&&c<pos.left+unhide.offsetWidth&&b>=pos.top&&b<pos.top+unhide.offsetHeight&&(f.coltounhide=e-1);for(c=0;c<a.context.colpanes.length;c++)if(f.coltoresize>=a.context.colpanes[c].first&&f.coltoresize<=a.context.colpanes[c].last)return f;delete f.coltoresize}else c>=a.verticaltablecontrol.controlborder?(f.rowfooter=!0,\nf.distance=c-a.verticaltablecontrol.controlborder):b>=a.horizontaltablecontrol.controlborder?(f.colfooter=!0,f.distance=b-a.horizontaltablecontrol.controlborder):c<a.gridposition.left?(f.rowheader=!0,f.distance=a.headposition.left-c):b<=a.gridposition.top?(f.colheader=!0,f.distance=a.headposition.top-b):(f.coord=SocialCalc.crToCoord(f.col,f.row),a.context.cellskip[f.coord]&&(f.coord=a.context.cellskip[f.coord]));return f}return null};\nSocialCalc.GetEditorCellElement=function(a,c,b){var d,e,f,g,l=0,h=0;for(d=0;d<a.context.rowpanes.length;d++){if(c>=a.context.rowpanes[d].first&&c<=a.context.rowpanes[d].last)for(e=0;e<a.context.colpanes.length;e++){if(b>=a.context.colpanes[e].first&&b<=a.context.colpanes[e].last){l+=c-a.context.rowpanes[d].first+2;for(f=a.context.colpanes[e].first;f<=b;f++)(g=a.context.cellskip[SocialCalc.crToCoord(f,c)])&&a.context.CoordInPane(g,d,e)||h++;return{element:a.griddiv.firstChild.lastChild.childNodes[l].childNodes[h],\nrowpane:d,colpane:e}}for(f=a.context.colpanes[e].first;f<=a.context.colpanes[e].last;f++)(g=a.context.cellskip[SocialCalc.crToCoord(f,c)])&&a.context.CoordInPane(g,d,e)||h++;h+=1}l+=a.context.rowpanes[d].last-a.context.rowpanes[d].first+2}return null};\nSocialCalc.MoveECellWithKey=function(a,c){var b,d,e,f=!1,g=1;if(!a.ecell)return null;\"shifted\"==c.slice(-7)&&(c=c.slice(0,-7),f=!0);b=a.ecell.row;d=a.ecell.col;e=a.context.sheetobj.cells[a.ecell.coord];switch(c){case \"[adown]\":b+=e&&e.rowspan||1;break;case \"[aup]\":b--;g=-1;break;case \"[pgdn]\":b+=a.pageUpDnAmount-1+(e&&e.rowspan||1);break;case \"[pgup]\":b-=a.pageUpDnAmount;g=-1;break;case \"[aright]\":d+=e&&e.colspan||1;break;case \"[aleft]\":d--;g=-1;break;case \"[home]\":d=b=1;break;default:return null}a.context.sheetobj.attribs.usermaxcol&&\n(d=Math.min(a.context.sheetobj.attribs.usermaxcol,d));for(a.context.sheetobj.attribs.usermaxrow&&(b=Math.min(a.context.sheetobj.attribs.usermaxrow,b));\"yes\"==a.context.sheetobj.colattribs.hide[SocialCalc.rcColname(d)];)d+=g,1>d&&(g=-g,d=1);for(;\"yes\"==a.context.sheetobj.rowattribs.hide[b];)b+=g,1>b&&(g=-g,b=1);a.range.hasrange||f&&a.RangeAnchor();b=a.MoveECell(SocialCalc.crToCoord(d,b));a.range.hasrange&&(f?a.RangeExtend():a.RangeRemove());return b};\nSocialCalc.MoveECell=function(a,c){var b,d,e=a.context.highlights;b=SocialCalc.coordToCr(c);a.context.sheetobj.attribs.usermaxcol&&b.col>a.context.sheetobj.attribs.usermaxcol&&(b.col=a.context.sheetobj.attribs.usermaxcol);a.context.sheetobj.attribs.usermaxrow&&b.row>a.context.sheetobj.attribs.usermaxrow&&(b.row=a.context.sheetobj.attribs.usermaxrow);c=SocialCalc.crToCoord(b.col,b.row);if(a.ecell){if(a.ecell.coord==c)return c;b=SocialCalc.GetEditorCellElement(a,a.ecell.row,a.ecell.col);delete e[a.ecell.coord];\na.range2.hasrange&&a.ecell.row>=a.range2.top&&a.ecell.row<=a.range2.bottom&&a.ecell.col>=a.range2.left&&a.ecell.col<=a.range2.right&&(e[a.ecell.coord]=\"range2\");a.UpdateCellCSS(b,a.ecell.row,a.ecell.col);a.SetECellHeaders(\"\");a.cellhandles.ShowCellHandles(!1)}c=a.context.cellskip[c]||c;a.ecell=SocialCalc.coordToCr(c);a.ecell.coord=c;b=SocialCalc.GetEditorCellElement(a,a.ecell.row,a.ecell.col);e[c]=\"cursor\";for(d in a.MoveECellCallback)a.MoveECellCallback[d](a);a.UpdateCellCSS(b,a.ecell.row,a.ecell.col);\na.SetECellHeaders(\"selected\");for(d in a.StatusCallback)a.StatusCallback[d].func(a,\"moveecell\",c,a.StatusCallback[d].params);a.busy?a.ensureecell=!0:(a.ensureecell=!1,a.EnsureECellVisible());return c};\nSocialCalc.EnsureECellVisible=function(a){var c=0,b=0;a.ecell.row>a.lastnonscrollingrow&&(a.ecell.row<a.firstscrollingrow?c=a.ecell.row-a.firstscrollingrow:a.ecell.row>a.lastvisiblerow&&(c=a.ecell.row-a.lastvisiblerow));a.ecell.col>a.lastnonscrollingcol&&(a.ecell.col<a.firstscrollingcol?b=a.ecell.col-a.firstscrollingcol:a.ecell.col>a.lastvisiblecol&&(b=a.ecell.col-a.lastvisiblecol));0!=c||0!=b?a.ScrollRelativeBoth(c,b):a.cellhandles.ShowCellHandles(!0)};\nSocialCalc.ReplaceCell=function(a,c,b,d){var e;if(c&&(a=a.context.RenderCell(b,d,c.rowpane,c.colpane,!0,null)))for(e in c.element.innerHTML=a.innerHTML,c.element.style.cssText=\"\",c.element.className=a.className,a.style)\"cssText\"!=a.style[e]&&(c.element.style[e]=a.style[e])};\nSocialCalc.UpdateCellCSS=function(a,c,b,d){var e;if(c&&(a=a.context.RenderCell(b,d,c.rowpane,c.colpane,!0,null)))for(e in c.element.style.cssText=\"\",c.element.className=a.className,a.style)\"cssText\"!=a.style[e]&&(c.element.style[e]=a.style[e])};\nSocialCalc.SetECellHeaders=function(a,c){var b=a.ecell,d=a.context,e,f,g,l=0,h=0,m;if(b){for(;\"yes\"==d.sheetobj.colattribs.hide[SocialCalc.rcColname(b.col)];)b.col++;for(;\"yes\"==d.sheetobj.rowattribs.hide[b.row];)b.row++;b.coord=SocialCalc.crToCoord(b.col,b.row);for(e=0;e<d.rowpanes.length;e++)f=d.rowpanes[e].first,g=d.rowpanes[e].last,b.row>=f&&b.row<=g&&(m=a.fullgrid.childNodes[1].childNodes[2+l+b.row-f].childNodes[0])&&(d.classnames&&(m.className=d.classnames[c+\"rowname\"]),d.explicitStyles&&(m.style.cssText=\nd.explicitStyles[c+\"rowname\"]),m.style.verticalAlign=\"top\"),l+=g-f+2;for(e=0;e<d.colpanes.length;e++)f=d.colpanes[e].first,g=d.colpanes[e].last,b.col>=f&&b.col<=g&&(m=a.fullgrid.childNodes[1].childNodes[1].childNodes[1+h+b.col-f])&&(d.classnames&&(m.className=d.classnames[c+\"colname\"]),d.explicitStyles&&(m.style.cssText=d.explicitStyles[c+\"colname\"])),h+=g-f+2}};SocialCalc.ECellReadonly=function(a,c){!c&&a.ecell&&(c=a.ecell.coord);if(!c)return!1;var b=a.context.sheetobj.cells[c];return b&&b.readonly};\nSocialCalc.RangeAnchor=function(a,c){a.range.hasrange&&a.RangeRemove();a.RangeExtend(c)};\nSocialCalc.RangeExtend=function(a,c){var b,d,e,f,g,l,h=a.context.highlights;b=a.range;d=a.range2;c?(f=SocialCalc.coordToCr(c),f.coord=c):f=a.ecell;if(f){b.hasrange||(b.anchorcoord=f.coord,b.anchorrow=f.row,b.top=f.row,b.bottom=f.row,b.anchorcol=f.col,b.left=f.col,b.right=f.col,b.hasrange=!0);b.anchorrow<f.row?(b.top=b.anchorrow,b.bottom=f.row):(b.top=f.row,b.bottom=b.anchorrow);b.anchorcol<f.col?(b.left=b.anchorcol,b.right=f.col):(b.left=f.col,b.right=b.anchorcol);for(e in h)switch(h[e]){case \"range\":h[e]=\n\"unrange\";break;case \"range2\":h[e]=\"unrange2\"}for(f=b.top;f<=b.bottom;f++)for(g=b.left;g<=b.right;g++)switch(e=SocialCalc.crToCoord(g,f),h[e]){case \"unrange\":h[e]=\"range\";break;case \"cursor\":break;default:h[e]=\"newrange\"}for(f=d.top;d.hasrange&&f<=d.bottom;f++)for(g=d.left;g<=d.right;g++)switch(e=SocialCalc.crToCoord(g,f),h[e]){case \"unrange2\":h[e]=\"range2\";break;case \"range\":case \"newrange\":case \"cursor\":break;default:h[e]=\"newrange2\"}for(e in h){switch(h[e]){case \"unrange\":delete h[e];break;case \"newrange\":h[e]=\n\"range\";break;case \"newrange2\":h[e]=\"range2\";break;case \"range\":case \"range2\":case \"cursor\":continue}d=SocialCalc.coordToCr(e);b=SocialCalc.GetEditorCellElement(a,d.row,d.col);a.UpdateCellCSS(b,d.row,d.col)}for(l in a.RangeChangeCallback)a.RangeChangeCallback[l](a);e=SocialCalc.crToCoord(a.range.left,a.range.top);if(a.range.left!=a.range.right||a.range.top!=a.range.bottom)e+=\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom);for(l in a.StatusCallback)a.StatusCallback[l].func(a,\"rangechange\",e,\na.StatusCallback[l].params)}};\nSocialCalc.RangeRemove=function(a){var c,b,d,e,f=a.context.highlights,g=a.range,l=a.range2;if(g.hasrange||l.hasrange){for(c=l.top;l.hasrange&&c<=l.bottom;c++)for(b=l.left;b<=l.right;b++)switch(d=SocialCalc.crToCoord(b,c),f[d]){case \"range\":f[d]=\"newrange2\";break;case \"range2\":case \"cursor\":break;default:f[d]=\"newrange2\"}for(d in f){switch(f[d]){case \"range\":delete f[d];break;case \"newrange2\":f[d]=\"range2\";break;case \"cursor\":continue}b=SocialCalc.coordToCr(d);c=SocialCalc.GetEditorCellElement(a,b.row,\nb.col);a.UpdateCellCSS(c,b.row,b.col)}g.hasrange=!1;for(e in a.RangeChangeCallback)a.RangeChangeCallback[e](a);for(e in a.StatusCallback)a.StatusCallback[e].func(a,\"rangechange\",\"\",a.StatusCallback[e].params)}};\nSocialCalc.Range2Remove=function(a){var c,b,d,e=a.context.highlights,f=a.range2;if(f.hasrange){for(d in e){switch(e[d]){case \"range2\":delete e[d];break;case \"range\":case \"cursor\":continue}b=SocialCalc.coordToCr(d);c=SocialCalc.GetEditorCellElement(a,b.row,b.col);a.UpdateCellCSS(c,b.row,b.col)}f.hasrange=!1}};\nSocialCalc.FitToEditTable=function(a){var c,b,d,e=a.context,f=e.sheetobj;d=e.showRCHeaders?e.rownamewidth-0:0;for(colpane=0;colpane<e.colpanes.length-1;colpane++)for(c=e.colpanes[colpane].first;c<=e.colpanes[colpane].last;c++)if(b=SocialCalc.rcColname(c),\"yes\"!=f.colattribs.hide[b]){b=f.colattribs.width[b]||f.attribs.defaultcolwidth||SocialCalc.Constants.defaultColWidth;if(\"blank\"==b||\"auto\"==b)b=\"\";d+=b&&0<b-0?b-0:10}for(c=e.colpanes[colpane].first;1E4>=c;c++){b=SocialCalc.rcColname(c);if(\"yes\"!=\nf.colattribs.hide[b]){b=f.colattribs.width[b]||f.attribs.defaultcolwidth||SocialCalc.Constants.defaultColWidth;if(\"blank\"==b||\"auto\"==b)b=\"\";d+=b&&0<b-0?b-0:10}if(d>a.tablewidth)break}e.colpanes[colpane].last=e.sheetobj.attribs.usermaxcol||c;d=e.showRCHeaders?1:0;for(c=0;c<e.rowpanes.length-1;c++)for(d+=e.rowpanes[c].last-e.rowpanes[c].first+1,b=e.rowpanes[c].first;b<=e.rowpanes[c].last;b++)\"yes\"==f.rowattribs.hide[b]&&d--;a=a.tableheight-d*e.pixelsPerRow;e.rowpanes[c].last=e.sheetobj.attribs.usermaxrow||\ne.rowpanes[c].first+Math.floor(a/e.pixelsPerRow)+1};\nSocialCalc.CalculateEditorPositions=function(a){var c;a.gridposition=SocialCalc.GetElementPosition(a.griddiv);c=a.griddiv.firstChild.lastChild.childNodes[1].childNodes[0];a.headposition=SocialCalc.GetElementPosition(c);a.headposition.left+=c.offsetWidth;a.headposition.top+=c.offsetHeight;a.rowpositions=[];for(c=0;c<a.context.rowpanes.length;c++)a.CalculateRowPositions(c,a.rowpositions,a.rowheight);for(c=0;c<a.rowpositions.length&&!(a.rowpositions[c]>a.gridposition.top+a.tableheight);c++);a.lastvisiblerow=\nc-1;a.colpositions=[];for(c=0;c<a.context.colpanes.length;c++)a.CalculateColPositions(c,a.colpositions,a.colwidth);for(c=0;c<a.colpositions.length&&!(a.colpositions[c]>a.gridposition.left+a.tablewidth);c++);a.lastvisiblecol=c-1;for(a.firstscrollingrow=a.context.rowpanes[a.context.rowpanes.length-1].first;\"yes\"==a.context.sheetobj.rowattribs.hide[a.firstscrollingrow];)a.firstscrollingrow++;a.firstscrollingrowtop=a.rowpositions[a.firstscrollingrow]||a.headposition.top;a.lastnonscrollingrow=0<a.context.rowpanes.length-\n1?a.context.rowpanes[a.context.rowpanes.length-2].last:0;for(a.firstscrollingcol=a.context.colpanes[a.context.colpanes.length-1].first;\"yes\"==a.context.sheetobj.colattribs.hide[SocialCalc.rcColname(a.firstscrollingcol)];)a.firstscrollingcol++;a.firstscrollingcolleft=a.colpositions[a.firstscrollingcol]||a.headposition.left;a.lastnonscrollingcol=0<a.context.colpanes.length-1?a.context.colpanes[a.context.colpanes.length-2].last:0;a.verticaltablecontrol.ComputeTableControlPositions();a.horizontaltablecontrol.ComputeTableControlPositions()};\nSocialCalc.ScheduleRender=function(a){a.timeout&&window.clearTimeout(a.timeout);SocialCalc.EditorSheetStatusCallback(null,\"schedrender\",null,a);a.timeout=window.setTimeout(function(){SocialCalc.DoRenderStep(a)},1)};SocialCalc.DoRenderStep=function(a){a.timeout=null;a.EditorRenderSheet();SocialCalc.EditorSheetStatusCallback(null,\"renderdone\",null,a);SocialCalc.EditorSheetStatusCallback(null,\"schedposcalc\",null,a);a.timeout=window.setTimeout(function(){SocialCalc.DoPositionCalculations(a)},1)};\nSocialCalc.SchedulePositionCalculations=function(a){SocialCalc.EditorSheetStatusCallback(null,\"schedposcalc\",null,a);a.timeout=window.setTimeout(function(){SocialCalc.DoPositionCalculations(a)},1)};\nSocialCalc.DoPositionCalculations=function(a){a.timeout=null;a.CalculateEditorPositions();a.verticaltablecontrol.PositionTableControlElements();a.horizontaltablecontrol.PositionTableControlElements();SocialCalc.EditorSheetStatusCallback(null,\"doneposcalc\",null,a);a.ensureecell&&a.ecell&&!a.deferredCommands.length&&(a.ensureecell=!1,a.EnsureECellVisible());a.cellhandles.ShowCellHandles(!0)};\nSocialCalc.CalculateRowPositions=function(a,c,b,d){var e,f,g,l,h=a.context,m;if(!h.showRCHeaders)throw\"Needs showRCHeaders=true\";m=a.fullgrid.lastChild;a=2;for(e=0;e<c;e++)a+=h.rowpanes[e].last-h.rowpanes[e].first+2;f=0;for(c=h.rowpanes[e].first;c<=h.rowpanes[e].last;c++)g=m.childNodes[a+f],f++,l=SocialCalc.GetElementPosition(g.firstChild),b[c]||(b[c]=l.top,d[c]=g.firstChild.offsetHeight)};\nSocialCalc.CalculateColPositions=function(a,c,b,d){var e,f,g,l,h=a.context;if(!h.showRCHeaders)throw\"Needs showRCHeaders=true\";f=a.fullgrid.lastChild;a=1;for(e=0;e<c;e++)a+=h.colpanes[e].last-h.colpanes[e].first+2;g=f.childNodes[1];f=0;for(c=h.colpanes[e].first;c<=h.colpanes[e].last;c++)l=SocialCalc.GetElementPosition(g.childNodes[a+f]),b[c]||(b[c]=l.left,g.childNodes[a+f]&&(d[c]=g.childNodes[a+f].offsetWidth)),f++};\nSocialCalc.ScrollRelative=function(a,c,b){c?a.ScrollRelativeBoth(b,0):a.ScrollRelativeBoth(0,b)};\nSocialCalc.ScrollRelativeBoth=function(a,c,b){var d=a.context,e=0<c?1:-1,f=0<b?1:-1,g=d.rowpanes.length,l=1<g?d.rowpanes[g-2].last+1:1;d.rowpanes[g-1].first+c<l&&(c=-d.rowpanes[g-1].first+l);var l=d.colpanes.length,h=1<l?d.colpanes[l-2].last+1:1;for(d.colpanes[l-1].first+b<h&&(b=-d.colpanes[l-1].first+h);\"yes\"==d.sheetobj.colattribs.hide[SocialCalc.rcColname(d.colpanes[l-1].first+b)];)if(b+=f,1>b){b=0;break}for(;\"yes\"==d.sheetobj.rowattribs.hide[d.rowpanes[g-1].first+c];)if(c+=e,1>c){c=0;break}if((1==\nc||-1==c)&&0==b)1==c?a.ScrollTableUpOneRow():a.ScrollTableDownOneRow(),a.ecell&&a.SetECellHeaders(\"selected\"),a.SchedulePositionCalculations();else if(0!=c||0!=b)d.rowpanes[g-1].first+=c,d.rowpanes[g-1].last+=c,d.colpanes[l-1].first+=b,d.colpanes[l-1].last+=b,a.LimitLastPanes(),a.FitToEditTable(),a.ScheduleRender()};\nSocialCalc.PageRelative=function(a,c,b){var d=a.context,e=c?\"rowpanes\":\"colpanes\",d=d[e][d[e].length-1],f=c?\"lastvisiblerow\":\"lastvisiblecol\",e=c?a.rowheight:a.colwidth,g=c?SocialCalc.Constants.defaultAssumedRowHeight:SocialCalc.Constants.defaultColWidth;if(0<b)c=a[f],c==d.first&&(c+=1);else{b=c?a.tableheight-(a.firstscrollingrowtop-a.gridposition.top):a.tablewidth-(a.firstscrollingcolleft-a.gridposition.left);b-=0<e[a[f]]?e[a[f]]:g;for(c=d.first-1;0<c;c--){f=0<e[c]?e[c]:g;if(b<f)break;b-=f}e=d.first;\nc>=e&&(c=e-1);1>c&&(c=1)}d.first=c;d.last=c+1;a.LimitLastPanes();a.FitToEditTable();a.ScheduleRender()};\nSocialCalc.LimitLastPanes=function(a){a=a.context;var c;c=a.rowpanes.length;1<c&&a.rowpanes[c-1].first<=a.rowpanes[c-2].last&&(a.rowpanes[c-1].first=a.rowpanes[c-2].last+1);a.sheetobj.attribs.usermaxrow&&a.rowpanes[c-1].first>a.sheetobj.attribs.usermaxrow&&(a.rowpanes[c-1].first=a.sheetobj.attribs.usermaxrow);c=a.colpanes.length;1<c&&a.colpanes[c-1].first<=a.colpanes[c-2].last&&(a.colpanes[c-1].first=a.colpanes[c-2].last+1);a.sheetobj.attribs.usermaxcol&&a.colpanes[c-1].first>a.sheetobj.attribs.usermaxcol&&\n(a.colpanes[c-1].first=a.sheetobj.attribs.usermaxcol)};\nSocialCalc.ScrollTableUpOneRow=function(a){var c,b,d,e,f,g,l={},h=a.context,m=h.sheetobj,p=a.fullgrid,r;r=p.lastChild;c=h.showRCHeaders?2:1;for(b=0;b<h.rowpanes.length-1;b++)c+=h.rowpanes[b].last-h.rowpanes[b].first+2;if(h.sheetobj.attribs.usermaxrow&&1>h.sheetobj.attribs.usermaxrow-h.rowpanes[b].first)return p;r.removeChild(r.childNodes[c]);h.rowpanes[b].first++;h.rowpanes[b].last++;a.FitToEditTable();h.CalculateColWidthData();h.sheetobj.attribs.usermaxrow&&h.rowpanes[b].last==h.sheetobj.attribs.usermaxrow||\n(a=h.RenderRow(h.rowpanes[b].last,b),r.appendChild(a));maxrowspan=1;a=h.rowpanes[b].first-1;for(f=0;f<h.colpanes.length;f++)for(e=h.colpanes[f].first;e<=h.colpanes[f].last;e++)coord=SocialCalc.crToCoord(e,a),h.cellskip[coord]||(g=m.cells[coord])&&g.rowspan>maxrowspan&&(maxrowspan=g.rowspan);if(1<maxrowspan)for(d=1;d<maxrowspan&&!(d+a>=h.rowpanes[b].last);d++)e=h.RenderRow(d+a,b),f=r.childNodes[c+d-1],r.replaceChild(e,f);a=h.rowpanes[b].last;for(f=0;f<h.colpanes.length;f++)for(e=h.colpanes[f].first;e<=\nh.colpanes[f].last;e++)if(coord=h.cellskip[SocialCalc.crToCoord(e,a)])d=h.coordToCR[coord].row-0,d==h.rowpanes[b].last||d<h.rowpanes[b].first||(g=m.cells[coord])&&1<g.rowspan&&(l[d]=!0);for(d in l)e=h.RenderRow(d,b),f=r.childNodes[c+(d-h.rowpanes[b].first)],r.replaceChild(e,f);return p};\nSocialCalc.ScrollTableDownOneRow=function(a){var c,b,d,e,f,g,l={},h=a.context,m=h.sheetobj,p=a.fullgrid,r;r=p.lastChild;c=h.showRCHeaders?2:1;for(b=0;b<h.rowpanes.length-1;b++)c+=h.rowpanes[b].last-h.rowpanes[b].first+2;h.sheetobj.attribs.usermaxrow||r.removeChild(r.childNodes[c+(h.rowpanes[b].last-h.rowpanes[b].first)]);h.rowpanes[b].first--;h.rowpanes[b].last--;a.FitToEditTable();h.CalculateColWidthData();e=h.RenderRow(h.rowpanes[b].first,b);r.insertBefore(e,r.childNodes[c]);maxrowspan=1;a=h.rowpanes[b].first;\nfor(f=0;f<h.colpanes.length;f++)for(e=h.colpanes[f].first;e<=h.colpanes[f].last;e++)coord=SocialCalc.crToCoord(e,a),h.cellskip[coord]||(g=m.cells[coord])&&g.rowspan>maxrowspan&&(maxrowspan=g.rowspan);if(1<maxrowspan)for(d=1;d<maxrowspan&&!(d+a>h.rowpanes[b].last);d++)e=h.RenderRow(d+a,b),f=r.childNodes[c+d],r.replaceChild(e,f);a=h.rowpanes[b].last;for(f=0;f<h.colpanes.length;f++)for(e=h.colpanes[f].first;e<=h.colpanes[f].last;e++)if(coord=SocialCalc.crToCoord(e,a),(g=m.cells[coord])&&1<g.rowspan)l[a]=\n!0;else if(coord=h.cellskip[SocialCalc.crToCoord(e,a)])d=h.coordToCR[coord].row-0,d==a||d<h.rowpanes[b].first||(g=m.cells[coord])&&1<g.rowspan&&(l[d]=!0);for(d in l)e=h.RenderRow(d,b),f=r.childNodes[c+(d-h.rowpanes[b].first)],r.replaceChild(e,f);return p};SocialCalc.InputBox=function(a,c){a&&(this.element=a,this.editor=c,this.inputEcho=null,c.inputBox=this,a.onmousedown=SocialCalc.InputBoxOnMouseDown,c.MoveECellCallback.formulabar=function(a){\"start\"==a.state&&c.inputBox.DisplayCellContents(a.ecell.coord)})};\nSocialCalc.InputBox.prototype.DisplayCellContents=function(a){SocialCalc.InputBoxDisplayCellContents(this,a)};SocialCalc.InputBox.prototype.ShowInputBox=function(a){this.editor.inputEcho.ShowInputEcho(a)};SocialCalc.InputBox.prototype.GetText=function(){return this.element.value};SocialCalc.InputBox.prototype.SetText=function(a){this.element&&(this.element.value=a,this.editor.inputEcho.SetText(a+\"_\"))};SocialCalc.InputBox.prototype.Focus=function(){SocialCalc.InputBoxFocus(this)};\nSocialCalc.InputBox.prototype.Blur=function(){return this.element.blur()};\nSocialCalc.InputBox.prototype.Select=function(a){if(this.element)switch(a){case \"end\":if(document.selection&&document.selection.createRange)try{var c=document.selection.createRange().duplicate();c.moveToElementText(this.element);c.collapse(!1);c.select()}catch(b){void 0!=this.element.selectionStart&&(this.element.selectionStart=this.element.value.length,this.element.selectionEnd=this.element.value.length)}else void 0!=this.element.selectionStart&&(this.element.selectionStart=this.element.value.length,\nthis.element.selectionEnd=this.element.value.length)}};SocialCalc.InputBoxDisplayCellContents=function(a,c){var b=SocialCalc.Constants;if(a){c||(c=a.editor.ecell.coord);var d=SocialCalc.GetCellContents(a.editor.context.sheetobj,c);-1!=d.indexOf(\"\\n\")?(d=b.s_inputboxdisplaymultilinetext,a.element.disabled=!0):a.editor.ECellReadonly()?a.element.disabled=!0:a.element.disabled=!1;a.SetText(d)}};\nSocialCalc.InputBoxFocus=function(a){if(a){a.element.focus();a=a.editor;a.state=\"input\";var c=a.workingvalues;c.partialexpr=\"\";c.ecoord=a.ecell.coord;c.erow=a.ecell.row;c.ecol=a.ecell.col}};\nSocialCalc.InputBoxOnMouseDown=function(a){a=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!a)return!0;var c=a.workingvalues;switch(a.state){case \"start\":a.state=\"inputboxdirect\";c.partialexpr=\"\";c.ecoord=a.ecell.coord;c.erow=a.ecell.row;c.ecol=a.ecell.col;a.inputEcho.ShowInputEcho(!0);break;case \"input\":c.partialexpr=\"\",a.MoveECell(c.ecoord),a.state=\"inputboxdirect\",SocialCalc.KeyboardFocus()}};\nSocialCalc.InputEcho=function(a){var c=SocialCalc.Constants;this.editor=a;this.text=\"\";this.functionbox=this.prompt=this.main=this.container=this.interval=null;this.container=document.createElement(\"div\");SocialCalc.setStyles(this.container,\"display:none;position:absolute;zIndex:10;\");this.main=document.createElement(\"div\");c.defaultInputEchoClass&&(this.main.className=c.defaultInputEchoClass);c.defaultInputEchoStyle&&SocialCalc.setStyles(this.main,c.defaultInputEchoStyle);this.main.innerHTML=\" \";\nthis.container.appendChild(this.main);this.prompt=document.createElement(\"div\");c.defaultInputEchoPromptClass&&(this.prompt.className=c.defaultInputEchoPromptClass);c.defaultInputEchoPromptStyle&&SocialCalc.setStyles(this.prompt,c.defaultInputEchoPromptStyle);this.prompt.innerHTML=\"\";this.container.appendChild(this.prompt);SocialCalc.DragRegister(this.main,!0,!0,{MouseDown:SocialCalc.DragFunctionStart,MouseMove:SocialCalc.DragFunctionPosition,MouseUp:SocialCalc.DragFunctionPosition,Disabled:null,\npositionobj:this.container},this.editor.toplevel);a.toplevel.appendChild(this.container)};SocialCalc.InputEcho.prototype.ShowInputEcho=function(a){return SocialCalc.ShowInputEcho(this,a)};SocialCalc.InputEcho.prototype.SetText=function(a){return SocialCalc.SetInputEchoText(this,a)};\nSocialCalc.ShowInputEcho=function(a,c){var b;if(b=a.editor)if(c){b.cellhandles.ShowCellHandles(!1);if(b=SocialCalc.GetEditorCellElement(b,b.ecell.row,b.ecell.col))b=SocialCalc.GetElementPosition(b.element),a.container.style.left=b.left-1+\"px\",a.container.style.top=b.top-1+\"px\";a.container.style.display=\"block\";a.interval&&window.clearInterval(a.interval);a.interval=window.setInterval(SocialCalc.InputEchoHeartbeat,50)}else a.interval&&window.clearInterval(a.interval),a.container.style.display=\"none\"};\nSocialCalc.SetInputEchoText=function(a,c){var b=SocialCalc.Constants,d;d=SocialCalc.special_chars(c);d=d.replace(/\\n/g,\"<br>\");a.text!=d&&(a.main.innerHTML=d,a.text=d);d=c.match(/.*[\\+\\-\\*\\/\\&\\^\\<\\>\\=\\,\\(]([A-Za-z][A-Za-z][\\w\\.]*?)\\([^\\)]*$/);\"=\"==c.charAt(0)&&d?(d=d[1].toUpperCase(),SocialCalc.Formula.FunctionList[d]?(SocialCalc.Formula.FillFunctionInfo(),b=SocialCalc.special_chars(d+\"(\"+SocialCalc.Formula.FunctionArgString(d)+\")\")):b=b.ietUnknownFunction+d,a.prompt.innerHTML!=b&&(a.prompt.innerHTML=\nb,a.prompt.style.display=\"block\")):\"none\"!=a.prompt.style.display&&(a.prompt.innerHTML=\"\",a.prompt.style.display=\"none\")};SocialCalc.InputEchoHeartbeat=function(){var a=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!a)return!0;a.inputEcho.SetText(a.inputBox.GetText()+\"_\")};SocialCalc.InputEchoMouseDown=function(a){a=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!a)return!0;a.inputBox.element.focus()};\nSocialCalc.CellHandles=function(a){if(!a.noEdit){this.editor=a;this.movedmouse=this.noCursorSuffix=!1;this.draghandle=document.createElement(\"div\");SocialCalc.setStyles(this.draghandle,\"display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;\");TiddlyWiki&&(this.draghandle.style.width=\"6px\",this.draghandle.style.height=\"6px\");this.draghandle.innerHTML=\" \";a.toplevel.appendChild(this.draghandle);SocialCalc.AssignID(a,\nthis.draghandle,\"draghandle\");var c=\"png\";navigator.userAgent.match(/MSIE 6\\.0/)&&(c=\"gif\");this.dragpalette=document.createElement(\"div\");SocialCalc.setStyles(this.dragpalette,\"display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;backgroundImage:url(\"+SocialCalc.Constants.defaultImagePrefix+\"drag-handles.\"+c+\");\");this.dragpalette.innerHTML=\" \";a.toplevel.appendChild(this.dragpalette);SocialCalc.AssignID(a,this.dragpalette,\"dragpalette\");\nthis.dragtooltip=document.createElement(\"div\");SocialCalc.setStyles(this.dragtooltip,\"display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;\");this.dragtooltip.innerHTML=\" \";a.toplevel.appendChild(this.dragtooltip);SocialCalc.AssignID(a,this.dragtooltip,\"dragtooltip\");this.fillinghandle=document.createElement(\"div\");SocialCalc.setStyles(this.fillinghandle,\"display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;\");\nthis.fillinghandle.innerHTML=\" \";a.toplevel.appendChild(this.fillinghandle);SocialCalc.AssignID(a,this.fillinghandle,\"fillinghandle\");if(this.draghandle.addEventListener)this.draghandle.addEventListener(\"mousemove\",SocialCalc.CellHandlesMouseMoveOnHandle,!1),this.dragpalette.addEventListener(\"mousedown\",SocialCalc.CellHandlesMouseDown,!1),this.dragpalette.addEventListener(\"mousemove\",SocialCalc.CellHandlesMouseMoveOnHandle,!1);else if(this.draghandle.attachEvent)this.draghandle.attachEvent(\"onmousemove\",\nSocialCalc.CellHandlesMouseMoveOnHandle),this.dragpalette.attachEvent(\"onmousedown\",SocialCalc.CellHandlesMouseDown),this.dragpalette.attachEvent(\"onmousemove\",SocialCalc.CellHandlesMouseMoveOnHandle);else throw\"Browser not supported\";}};SocialCalc.CellHandles.prototype.ShowCellHandles=function(a,c){return SocialCalc.ShowCellHandles(this,a,c)};\nSocialCalc.ShowCellHandles=function(a,c,b){var d=a.editor,e=!1,f,g,l=1,h=1;if(d){if(c&&(f=d.ecell.row,g=d.ecell.col,\"start\"==d.state&&!(f>=d.lastvisiblerow||g>=d.lastvisiblecol||f<d.firstscrollingrow||g<d.firstscrollingcol))){for(;\"yes\"==d.context.sheetobj.colattribs.hide[SocialCalc.rcColname(g+l)];)l++;for(;\"yes\"==d.context.sheetobj.rowattribs.hide[f+h];)h++;c=d.context.sheetobj.cells[SocialCalc.crToCoord(g+l-1,f+h-1)];\"undefined\"!=typeof c&&(l+=(c.colspan||1)-1,h+=(c.rowspan||1)-1);d.rowpositions[f+\nh]+20>d.horizontaltablecontrol.controlborder||d.rowpositions[f+h]-10<d.headposition.top||d.colpositions[g+l]+20>d.verticaltablecontrol.controlborder||d.colpositions[g+l]-30<d.headposition.left||(a.draghandle.style.left=d.colpositions[g+l]-1+\"px\",a.draghandle.style.top=d.rowpositions[f+h]-1+\"px\",a.draghandle.style.display=\"block\",b&&(a.draghandle.style.display=\"none\",a.dragpalette.style.left=d.colpositions[g+l]-45+\"px\",a.dragpalette.style.top=d.rowpositions[f+h]-45+\"px\",a.dragpalette.style.display=\n\"block\",a.dragtooltip.style.left=d.colpositions[g+l]-45+\"px\",a.dragtooltip.style.top=d.rowpositions[f+h]+45+\"px\",a.dragtooltip.style.display=\"none\"),e=!0)}e||(a.draghandle.style.display=\"none\");b||(a.dragpalette.style.display=\"none\",a.dragtooltip.style.display=\"none\")}};\nSocialCalc.CellHandlesMouseMoveOnHandle=function(a){var c=SocialCalc.Constants,b=a||window.event,d=b.target||b.srcElement,e=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!e)return!0;a=e.cellhandles;if(!a.editor)return!0;var f=SocialCalc.GetElementPositionWithScroll(e.toplevel),g=b.clientX-f.left,b=b.clientY-f.top;if(!e.cellhandles.mouseDown){e.cellhandles.ShowCellHandles(!0,!0);if(d==a.dragpalette){c=SocialCalc.SegmentDivHit([c.CH_radius1,c.CH_radius2],e.cellhandles.dragpalette,\ng,b);if(0==c){SocialCalc.CellHandlesHoverTimeout();return}a.tooltipstimer&&(window.clearTimeout(a.tooltipstimer),a.tooltipstimer=null);a.tooltipswhichhandle=c;a.tooltipstimer=window.setTimeout(SocialCalc.CellHandlesTooltipsTimeout,700)}a.timer&&(window.clearTimeout(a.timer),a.timer=null);a.timer=window.setTimeout(SocialCalc.CellHandlesHoverTimeout,3E3)}};\nSocialCalc.SegmentDivHit=function(a,c,b,d){var e=c.offsetWidth,f=c.offsetHeight,g=c.offsetLeft;c=c.offsetTop;var l=0,h=a,m=Math.sqrt(Math.pow(b-g-(e/2-.5),2)+Math.pow(d-c-(f/2-.5),2));if(2==h.length)return b>=g&&b<g+e/2&&d>=c&&d<c+f/2&&(m<=a[0]?l=-1:m<=a[1]&&(l=1)),b>=g+e/2&&b<g+e&&d>=c&&d<c+f/2&&(m<=a[0]?l=-2:m<=a[1]&&(l=2)),b>=g+e/2&&b<g+e&&d>=c+f/2&&d<c+f&&(m<=a[0]?l=-3:m<=a[1]&&(l=3)),b>=g&&b<g+e/2&&d>=c+f/2&&d<c+f&&(m<=a[0]?l=-4:m<=a[1]&&(l=4)),l;for(;;)if(b>=g&&b<g+e/2&&d>=c&&d<c+f/2){quadrant+=\n\"1\";l=h[0];if(\"number\"==typeof l)break;h=l;e/=2;f/=2}else if(b>=g+e/2&&b<g+e&&d>=c&&d<c+f/2){quadrant+=\"2\";l=h[1];if(\"number\"==typeof l)break;h=l;e/=2;g+=e;f/=2}else if(b>=g+e/2&&b<g+e&&d>=c+f/2&&d<c+f){quadrant+=\"3\";l=h[2];if(\"number\"==typeof l)break;h=l;e/=2;g+=e;f/=2;c+=f}else if(b>=g&&b<g+e/2&&d>=c+f/2&&d<c+f){quadrant+=\"4\";l=h[3];if(\"number\"==typeof l)break;h=l;e/=2;f/=2;c+=f}else return 0;return l};\nSocialCalc.CellHandlesHoverTimeout=function(){editor=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!editor)return!0;var a=editor.cellhandles;a.timer&&(window.clearTimeout(a.timer),a.timer=null);a.tooltipstimer&&(window.clearTimeout(a.tooltipstimer),a.tooltipstimer=null);editor.cellhandles.ShowCellHandles(!0,!1)};\nSocialCalc.CellHandlesTooltipsTimeout=function(){editor=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!editor)return!0;var a=editor.cellhandles;a.tooltipstimer&&(window.clearTimeout(a.tooltipstimer),a.tooltipstimer=null);var c=a.tooltipswhichhandle;if(0==c)SocialCalc.CellHandlesHoverTimeout();else{if(-3==c)a.dragtooltip.innerHTML=scc.s_CHfillAllTooltip;else if(3==c)a.dragtooltip.innerHTML=scc.s_CHfillContentsTooltip;else if(-2==c)a.dragtooltip.innerHTML=scc.s_CHmovePasteAllTooltip;\nelse if(-4==c)a.dragtooltip.innerHTML=scc.s_CHmoveInsertAllTooltip;else if(2==c)a.dragtooltip.innerHTML=scc.s_CHmovePasteContentsTooltip;else if(4==c)a.dragtooltip.innerHTML=scc.s_CHmoveInsertContentsTooltip;else{a.dragtooltip.innerHTML=\" \";a.dragtooltip.style.display=\"none\";return}a.dragtooltip.style.display=\"block\"}};\nSocialCalc.CellHandlesMouseDown=function(a){var c=SocialCalc.Constants,b,d=a||window.event,e=SocialCalc.EditorMouseInfo;a=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;if(!a)return!0;if(!a.busy){var f=a.cellhandles;f.movedmouse=!1;var g=SocialCalc.GetElementPositionWithScroll(a.toplevel),l=d.clientX-g.left,g=d.clientY-g.top;f.timer&&(window.clearTimeout(f.timer),f.timer=null);f.tooltipstimer&&(window.clearTimeout(f.tooltipstimer),f.tooltipstimer=null);f.dragtooltip.innerHTML=\" \";\nf.dragtooltip.style.display=\"none\";b=a.range;var h=SocialCalc.SegmentDivHit([c.CH_radius1,c.CH_radius2],a.cellhandles.dragpalette,l,g);if(1==h||-1==h||0==h)f.ShowCellHandles(!0,!1);else{e.ignore=!0;-3==h?(f.dragtype=\"Fill\",f.noCursorSuffix=!1):3==h?(f.dragtype=\"FillC\",f.noCursorSuffix=!1):-2==h?(f.dragtype=\"Move\",f.noCursorSuffix=!0):-4==h?(f.dragtype=\"MoveI\",f.noCursorSuffix=!1):2==h?(f.dragtype=\"MoveC\",f.noCursorSuffix=!0):4==h&&(f.dragtype=\"MoveIC\",f.noCursorSuffix=!1);f.filltype=null;switch(f.dragtype){case \"Fill\":case \"FillC\":b.hasrange||\na.RangeAnchor();break;case \"Move\":case \"MoveI\":case \"MoveC\":case \"MoveIC\":b.hasrange||a.RangeAnchor();a.range2.top=a.range.top;a.range2.right=a.range.right;a.range2.bottom=a.range.bottom;a.range2.left=a.range.left;a.range2.hasrange=!0;a.RangeRemove();break;default:return}f.fillinghandle.style.left=l+\"px\";f.fillinghandle.style.top=g-17+\"px\";f.fillinghandle.innerHTML=c.s_CHindicatorOperationLookup[f.dragtype]+(c.s_CHindicatorDirectionLookup[a.cellhandles.filltype]||\"\");f.fillinghandle.style.display=\n\"block\";f.ShowCellHandles(!0,!1);f.mouseDown=!0;e.editor=a;c=a.ecell.coord;f.startingcoord=c;f.startingX=l;f.startingY=g;e.mouselastcoord=c;SocialCalc.KeyboardSetFocus(a);document.addEventListener?(document.addEventListener(\"mousemove\",SocialCalc.CellHandlesMouseMove,!0),document.addEventListener(\"mouseup\",SocialCalc.CellHandlesMouseUp,!0)):f.draghandle.attachEvent&&(f.draghandle.setCapture(),f.draghandle.attachEvent(\"onmousemove\",SocialCalc.CellHandlesMouseMove),f.draghandle.attachEvent(\"onmouseup\",\nSocialCalc.CellHandlesMouseUp),f.draghandle.attachEvent(\"onlosecapture\",SocialCalc.CellHandlesMouseUp));d.stopPropagation?d.stopPropagation():d.cancelBubble=!0;d.preventDefault?d.preventDefault():d.returnValue=!1}}};\nSocialCalc.CellHandlesMouseMove=function(a){var c=SocialCalc.Constants,b,d,e,f=a||window.event,g=SocialCalc.EditorMouseInfo;if(a=g.editor){var l=a.cellhandles;b=SocialCalc.GetElementPositionWithScroll(a.toplevel);var h=f.clientX-b.left,m=f.clientY-b.top;if(b=SocialCalc.GridMousePosition(a,h,m))if(b&&!b.coord)SocialCalc.SetDragAutoRepeat(a,b,SocialCalc.CellHandlesDragAutoRepeat);else if(SocialCalc.SetDragAutoRepeat(a,null),b.coord){d=SocialCalc.coordToCr(a.cellhandles.startingcoord);e=SocialCalc.coordToCr(b.coord);\nl.movedmouse=!0;switch(l.dragtype){case \"Fill\":case \"FillC\":b.coord==l.startingcoord?(l.filltype=null,l.startingX=h,l.startingY=m):l.filltype?\"Down\"==l.filltype?(e.col=d.col,e.row<d.row&&(e.row=d.row)):(e.row=d.row,e.col<d.col&&(e.col=d.col)):(10<Math.abs(m-l.startingY)?l.filltype=\"Down\":10<Math.abs(h-l.startingX)&&(l.filltype=\"Right\"),e.col=d.col,e.row=d.row);b.coord=SocialCalc.crToCoord(e.col,e.row);b.coord!=g.mouselastcoord&&(a.MoveECell(b.coord),a.RangeExtend());break;case \"Move\":case \"MoveC\":b.coord!=\ng.mouselastcoord&&(a.MoveECell(b.coord),d=a.range2.right-a.range2.left+b.col,e=a.range2.bottom-a.range2.top+b.row,a.RangeAnchor(SocialCalc.crToCoord(d,e)),a.RangeExtend());break;case \"MoveI\":case \"MoveIC\":b.coord==l.startingcoord?(l.filltype=null,l.startingX=h,l.startingY=m):l.filltype?\"Vertical\"==l.filltype?(e.col=a.range2.left,e.row>=a.range2.top&&e.row<=a.range2.bottom+1&&(e.row=a.range2.bottom+2)):(e.row=a.range2.top,e.col>=a.range2.left&&e.col<=a.range2.right+1&&(e.col=a.range2.right+2)):(10<\nMath.abs(m-l.startingY)?l.filltype=\"Vertical\":10<Math.abs(h-l.startingX)&&(l.filltype=\"Horizontal\"),e.col=d.col,e.row=d.row),b.coord=SocialCalc.crToCoord(e.col,e.row),b.coord!=g.mouselastcoord&&(a.MoveECell(b.coord),l.filltype?(d=a.range2.right-a.range2.left+e.col,e=a.range2.bottom-a.range2.top+e.row,a.RangeAnchor(SocialCalc.crToCoord(d,e)),a.RangeExtend()):a.RangeRemove())}l.fillinghandle.style.left=h+\"px\";l.fillinghandle.style.top=m-17+\"px\";l.fillinghandle.innerHTML=c.s_CHindicatorOperationLookup[l.dragtype]+\n(c.s_CHindicatorDirectionLookup[a.cellhandles.filltype]||\"\");l.fillinghandle.style.display=\"block\";g.mouselastcoord=b.coord;f.stopPropagation?f.stopPropagation():f.cancelBubble=!0;f.preventDefault?f.preventDefault():f.returnValue=!1}}};\nSocialCalc.CellHandlesDragAutoRepeat=function(a,c){var b=SocialCalc.EditorMouseInfo,d=b.editor;if(d){var e=d.cellhandles,f=SocialCalc.coordToCr(d.cellhandles.startingcoord),g=SocialCalc.coordToCr(a),l,h=0,m=0;\"left\"==c?m=-1:\"right\"==c?m=1:\"up\"==c?h=-1:\"down\"==c&&(h=1);d.ScrollRelativeBoth(h,m);switch(e.dragtype){case \"Fill\":case \"FillC\":e.filltype?\"Down\"==e.filltype?(g.col=f.col,g.row<f.row&&(g.row=f.row)):(g.row=f.row,g.col<f.col&&(g.col=f.col)):(g.col=f.col,g.row=f.row);l=SocialCalc.crToCoord(g.col,\ng.row);l!=b.mouselastcoord&&(d.MoveECell(a),d.RangeExtend());break;case \"Move\":case \"MoveC\":a!=b.mouselastcoord&&(d.MoveECell(a),e=d.range2.right-d.range2.left+d.ecell.col,g=d.range2.bottom-d.range2.top+d.ecell.row,d.RangeAnchor(SocialCalc.crToCoord(e,g)),d.RangeExtend());break;case \"MoveI\":case \"MoveIC\":e.filltype?\"Vertical\"==e.filltype?(g.col=d.range2.left,g.row>=d.range2.top&&g.row<=d.range2.bottom+1&&(g.row=d.range2.bottom+2)):(g.row=d.range2.top,g.col>=d.range2.left&&g.col<=d.range2.right+1&&\n(g.col=d.range2.right+2)):(g.col=f.col,g.row=f.row),l=SocialCalc.crToCoord(g.col,g.row),l!=b.mouselastcoord&&(d.MoveECell(l),e=d.range2.right-d.range2.left+g.col,g=d.range2.bottom-d.range2.top+g.row,d.RangeAnchor(SocialCalc.crToCoord(e,g)),d.RangeExtend())}b.mouselastcoord=l}};\nSocialCalc.CellHandlesMouseUp=function(a){var c,b,d,e,f,g=a||window.event,l=SocialCalc.EditorMouseInfo;if(a=l.editor){var h=a.cellhandles;l.ignore=!1;c=SocialCalc.GetElementPositionWithScroll(a.toplevel);c=SocialCalc.GridMousePosition(a,g.clientX-c.left,g.clientY-c.top);SocialCalc.SetDragAutoRepeat(a,null);h.mouseDown=!1;h.noCursorSuffix=!1;h.fillinghandle.style.display=\"none\";c||(c={});c.coord||(c.coord=a.ecell.coord);switch(h.dragtype){case \"Fill\":case \"Move\":case \"MoveI\":b=\" all\";break;case \"FillC\":case \"MoveC\":case \"MoveIC\":b=\n\" formulas\"}h.movedmouse||(h.dragtype=\"Nothing\");switch(h.dragtype){case \"Nothing\":a.Range2Remove();a.RangeRemove();break;case \"Fill\":case \"FillC\":d=SocialCalc.coordToCr(h.startingcoord);e=SocialCalc.coordToCr(c.coord);h.filltype&&(\"Down\"==h.filltype?e.col=d.col:e.row=d.row);c.coord=SocialCalc.crToCoord(e.col,e.row);a.MoveECell(c.coord);a.RangeExtend();c=\"Right\"==a.cellhandles.filltype?\"right\":\"down\";b=\"fill\"+c+\" \"+SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,\na.range.bottom)+b;a.EditorScheduleSheetCommands(b,!0,!1);break;case \"Move\":case \"MoveC\":a.context.cursorsuffix=\"\";b=\"movepaste \"+SocialCalc.crToCoord(a.range2.left,a.range2.top)+\":\"+SocialCalc.crToCoord(a.range2.right,a.range2.bottom)+\" \"+a.ecell.coord+b;a.EditorScheduleSheetCommands(b,!0,!1);a.Range2Remove();break;case \"MoveI\":case \"MoveIC\":a.context.cursorsuffix=\"\",c=a.range2.right-a.range2.left,d=a.range2.bottom-a.range2.top,e=a.ecell.col-a.range2.left,f=a.ecell.row-a.range2.top,b=\"moveinsert \"+\nSocialCalc.crToCoord(a.range2.left,a.range2.top)+\":\"+SocialCalc.crToCoord(a.range2.right,a.range2.bottom)+\" \"+a.ecell.coord+b,a.EditorScheduleSheetCommands(b,!0,!1),a.Range2Remove(),a.RangeRemove(),\" Horizontal\"==a.cellhandles.filltype&&0<e?a.MoveECell(SocialCalc.crToCoord(a.ecell.col-c-1,a.ecell.row)):\" Vertical\"==a.cellhandles.filltype&&0<f&&a.MoveECell(SocialCalc.crToCoord(a.ecell.col,a.ecell.row-d-1)),a.RangeAnchor(SocialCalc.crToCoord(a.ecell.col+c,a.ecell.row+d)),a.RangeExtend()}g.stopPropagation?\ng.stopPropagation():g.cancelBubble=!0;g.preventDefault?g.preventDefault():g.returnValue=!1;document.removeEventListener?(document.removeEventListener(\"mousemove\",SocialCalc.CellHandlesMouseMove,!0),document.removeEventListener(\"mouseup\",SocialCalc.CellHandlesMouseUp,!0)):h.draghandle.detachEvent&&(h.draghandle.detachEvent(\"onlosecapture\",SocialCalc.CellHandlesMouseUp),h.draghandle.detachEvent(\"onmouseup\",SocialCalc.CellHandlesMouseUp),h.draghandle.detachEvent(\"onmousemove\",SocialCalc.CellHandlesMouseMove),\nh.draghandle.releaseCapture());l.editor=null;return!1}};\nSocialCalc.TableControl=function(a,c,b){var d=SocialCalc.Constants;this.editor=a;this.vertical=c;this.size=b;this.thumbpos=this.scrollareasize=this.scrollareaend=this.scrollareastart=this.morebuttonstart=this.lessbuttonstart=this.panesliderstart=this.endcapstart=this.controlborder=this.thumb=this.scrollarea=this.morebutton=this.lessbutton=this.paneslider=this.endcap=this.main=null;this.controlthickness=d.defaultTableControlThickness;this.sliderthickness=d.defaultTCSliderThickness;this.buttonthickness=\nd.defaultTCButtonThickness;this.thumbthickness=d.defaultTCThumbThickness;this.minscrollingpanesize=this.buttonthickness+this.buttonthickness+this.thumbthickness+20};SocialCalc.TableControl.prototype.CreateTableControl=function(){return SocialCalc.CreateTableControl(this)};SocialCalc.TableControl.prototype.PositionTableControlElements=function(){SocialCalc.PositionTableControlElements(this)};SocialCalc.TableControl.prototype.ComputeTableControlPositions=function(){SocialCalc.ComputeTableControlPositions(this)};\nSocialCalc.CreateTableControl=function(a){var c,b,d=SocialCalc.AssignID,e=SocialCalc.setStyles,f=SocialCalc.Constants,g=a.editor.imageprefix,l=a.vertical?\"v\":\"h\";a.main=document.createElement(\"div\");c=a.main.style;c.height=(a.vertical?a.size:a.controlthickness)+\"px\";c.width=(a.vertical?a.controlthickness:a.size)+\"px\";c.zIndex=0;e(a.main,f.TCmainStyle);c.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"main-\"+l+\".gif)\");f.TCmainClass&&(a.main.className=f.TCmainClass);a.main.style.display=\n\"none\";a.endcap=document.createElement(\"div\");c=a.endcap.style;c.height=a.controlthickness+\"px\";c.width=a.controlthickness+\"px\";c.zIndex=1;c.overflow=\"hidden\";c.position=\"absolute\";e(a.endcap,f.TCendcapStyle);c.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"endcap-\"+l+\".gif)\");f.TCendcapClass&&(a.endcap.className=f.TCendcapClass);d(a.editor,a.endcap,\"endcap\"+l);a.main.appendChild(a.endcap);a.paneslider=document.createElement(\"div\");c=a.paneslider.style;c.height=(a.vertical?a.sliderthickness:\na.controlthickness)+\"px\";c.overflow=\"hidden\";c.width=(a.vertical?a.controlthickness:a.sliderthickness)+\"px\";c.position=\"absolute\";c[a.vertical?\"top\":\"left\"]=\"4px\";c.zIndex=3;e(a.paneslider,f.TCpanesliderStyle);c.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"paneslider-\"+l+\".gif)\");f.TCpanesliderClass&&(a.paneslider.className=f.TCpanesliderClass);d(a.editor,a.paneslider,\"paneslider\"+l);(function(c,b,d){f[\"s_\"+b+\"Tooltip\"+d]&&SocialCalc.TooltipRegister(c,f[\"s_\"+b+\"Tooltip\"+d],null,a.editor.toplevel)})(a.paneslider,\n\"paneslider\",l);c={MouseDown:SocialCalc.TCPSDragFunctionStart,MouseMove:SocialCalc.TCPSDragFunctionMove,MouseUp:SocialCalc.TCPSDragFunctionStop,Disabled:function(){return a.editor.busy}};c.control=a;SocialCalc.DragRegister(a.paneslider,a.vertical,!a.vertical,c,a.editor.toplevel);a.main.appendChild(a.paneslider);a.lessbutton=document.createElement(\"div\");c=a.lessbutton.style;c.height=(a.vertical?a.buttonthickness:a.controlthickness)+\"px\";c.width=(a.vertical?a.controlthickness:a.buttonthickness)+\"px\";\nc.zIndex=2;c.overflow=\"hidden\";c.position=\"absolute\";e(a.lessbutton,f.TClessbuttonStyle);c.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"less-\"+l+\"n.gif)\");f.TClessbuttonClass&&(a.lessbutton.className=f.TClessbuttonClass);d(a.editor,a.lessbutton,\"lessbutton\"+l);b={repeatwait:f.TClessbuttonRepeatWait,repeatinterval:f.TClessbuttonRepeatInterval,normalstyle:\"backgroundImage:url(\"+g+\"less-\"+l+\"n.gif);\",downstyle:\"backgroundImage:url(\"+g+\"less-\"+l+\"d.gif);\",hoverstyle:\"backgroundImage:url(\"+\ng+\"less-\"+l+\"h.gif);\"};c={MouseDown:function(){a.editor.busy||a.editor.ScrollRelative(a.vertical,-1)},Repeat:function(){a.editor.busy||a.editor.ScrollRelative(a.vertical,-1)},Disabled:function(){return a.editor.busy}};SocialCalc.ButtonRegister(a.editor,a.lessbutton,b,c);a.main.appendChild(a.lessbutton);a.morebutton=document.createElement(\"div\");c=a.morebutton.style;c.height=(a.vertical?a.buttonthickness:a.controlthickness)+\"px\";c.width=(a.vertical?a.controlthickness:a.buttonthickness)+\"px\";c.zIndex=\n2;c.overflow=\"hidden\";c.position=\"absolute\";e(a.morebutton,f.TCmorebuttonStyle);c.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"more-\"+l+\"n.gif)\");f.TCmorebuttonClass&&(a.morebutton.className=f.TCmorebuttonClass);d(a.editor,a.morebutton,\"morebutton\"+l);b={repeatwait:f.TCmorebuttonRepeatWait,repeatinterval:f.TCmorebuttonRepeatInterval,normalstyle:\"backgroundImage:url(\"+g+\"more-\"+l+\"n.gif);\",downstyle:\"backgroundImage:url(\"+g+\"more-\"+l+\"d.gif);\",hoverstyle:\"backgroundImage:url(\"+g+\"more-\"+\nl+\"h.gif);\"};c={MouseDown:function(){a.editor.busy||a.editor.ScrollRelative(a.vertical,1)},Repeat:function(){a.editor.busy||a.editor.ScrollRelative(a.vertical,1)},Disabled:function(){return a.editor.busy}};SocialCalc.ButtonRegister(a.editor,a.morebutton,b,c);a.main.appendChild(a.morebutton);a.scrollarea=document.createElement(\"div\");c=a.scrollarea.style;c.height=a.controlthickness+\"px\";c.width=a.controlthickness+\"px\";c.zIndex=1;c.overflow=\"hidden\";c.position=\"absolute\";e(a.scrollarea,f.TCscrollareaStyle);\nc.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"scrollarea-\"+l+\".gif)\");f.TCscrollareaClass&&(a.scrollarea.className=f.TCscrollareaClass);d(a.editor,a.scrollarea,\"scrollarea\"+l);b={repeatwait:f.TCscrollareaRepeatWait,repeatinterval:f.TCscrollareaRepeatWait};c={MouseDown:SocialCalc.ScrollAreaClick,Repeat:SocialCalc.ScrollAreaClick,Disabled:function(){return a.editor.busy}};c.control=a;SocialCalc.ButtonRegister(a.editor,a.scrollarea,b,c);a.main.appendChild(a.scrollarea);a.thumb=document.createElement(\"div\");\nc=a.thumb.style;c.height=(a.vertical?a.thumbthickness:a.controlthickness)+\"px\";c.width=(a.vertical?a.controlthickness:a.thumbthickness)+\"px\";c.zIndex=2;c.overflow=\"hidden\";c.position=\"absolute\";e(a.thumb,f.TCthumbStyle);a.thumb.style.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+g+\"thumb-\"+l+\"n.gif)\");f.TCthumbClass&&(a.thumb.className=f.TCthumbClass);d(a.editor,a.thumb,\"thumb\"+l);c={MouseDown:SocialCalc.TCTDragFunctionStart,MouseMove:SocialCalc.TCTDragFunctionMove,MouseUp:SocialCalc.TCTDragFunctionStop,\nDisabled:function(){return a.editor.busy}};c.control=a;SocialCalc.DragRegister(a.thumb,a.vertical,!a.vertical,c,a.editor.toplevel);b={normalstyle:\"backgroundImage:url(\"+g+\"thumb-\"+l+\"n.gif)\",name:\"Thumb\",downstyle:\"backgroundImage:url(\"+g+\"thumb-\"+l+\"d.gif)\",hoverstyle:\"backgroundImage:url(\"+g+\"thumb-\"+l+\"h.gif)\"};SocialCalc.ButtonRegister(a.editor,a.thumb,b,null);a.main.appendChild(a.thumb);return a.main};\nSocialCalc.ScrollAreaClick=function(a,c,b){a=b.functionobj.control;b=SocialCalc.GetElementPositionWithScroll(a.editor.toplevel);c=a.vertical?c.clientY-b.top:c.clientX-b.left;a.editor.busy||a.editor.PageRelative(a.vertical,c>a.thumbpos?1:-1)};\nSocialCalc.PositionTableControlElements=function(a){var c,b,d=a.editor;a.vertical?(c=a.controlborder+\"px\",a.endcap.style.top=a.endcapstart+\"px\",a.endcap.style.left=c,a.paneslider.style.top=a.panesliderstart+\"px\",a.paneslider.style.left=c,a.lessbutton.style.top=a.lessbuttonstart+\"px\",a.lessbutton.style.left=c,a.morebutton.style.top=a.morebuttonstart+\"px\",a.morebutton.style.left=c,a.scrollarea.style.top=a.scrollareastart+\"px\",a.scrollarea.style.left=c,a.scrollarea.style.height=a.scrollareasize+\"px\",\nb=Math.max(d.context.sheetobj.attribs.lastrow,d.firstscrollingrow+1),b=(d.firstscrollingrow-(d.lastnonscrollingrow+1))*(a.scrollareasize-3*a.thumbthickness)/(b-(d.lastnonscrollingrow+1))+a.scrollareastart-1,b=Math.floor(b),a.thumb.style.top=b+\"px\",a.thumb.style.left=c):(c=a.controlborder+\"px\",a.endcap.style.left=a.endcapstart+\"px\",a.endcap.style.top=c,a.paneslider.style.left=a.panesliderstart+\"px\",a.paneslider.style.top=c,a.lessbutton.style.left=a.lessbuttonstart+\"px\",a.lessbutton.style.top=c,a.morebutton.style.left=\na.morebuttonstart+\"px\",a.morebutton.style.top=c,a.scrollarea.style.left=a.scrollareastart+\"px\",a.scrollarea.style.top=c,a.scrollarea.style.width=a.scrollareasize+\"px\",b=Math.max(d.context.sheetobj.attribs.lastcol,d.firstscrollingcol+1),b=(d.firstscrollingcol-(d.lastnonscrollingcol+1))*(a.scrollareasize-a.thumbthickness)/(b-d.lastnonscrollingcol)+a.scrollareastart-1,b=Math.floor(b),a.thumb.style.left=b+\"px\",a.thumb.style.top=c);a.thumbpos=b;a.main.style.display=\"block\"};\nSocialCalc.ComputeTableControlPositions=function(a){var c=a.editor;if(!c.gridposition||!c.headposition)throw\"Can't compute table control positions before editor positions\";a.vertical?(a.controlborder=c.gridposition.left+c.tablewidth,a.endcapstart=c.gridposition.top,a.panesliderstart=c.firstscrollingrowtop-a.sliderthickness,a.lessbuttonstart=c.firstscrollingrowtop-1,a.morebuttonstart=c.gridposition.top+c.tableheight-a.buttonthickness,a.scrollareastart=c.firstscrollingrowtop-1+a.buttonthickness):(a.controlborder=\nc.gridposition.top+c.tableheight,a.endcapstart=c.gridposition.left,a.panesliderstart=c.firstscrollingcolleft-a.sliderthickness,a.lessbuttonstart=c.firstscrollingcolleft-1,a.morebuttonstart=c.gridposition.left+c.tablewidth-a.buttonthickness,a.scrollareastart=c.firstscrollingcolleft-1+a.buttonthickness);a.scrollareaend=a.morebuttonstart-1;a.scrollareasize=a.scrollareaend-a.scrollareastart+1};\nSocialCalc.TCPSDragFunctionStart=function(a,c,b){var d=b.functionobj.control.editor,e=SocialCalc.Constants;SocialCalc.DragFunctionStart(a,c,b);c.trackingline=document.createElement(\"div\");c.trackingline.style.height=b.vertical?e.TCPStrackinglineThickness:d.tableheight-(d.headposition.top-d.gridposition.top)+\"px\";c.trackingline.style.width=b.vertical?d.tablewidth-(d.headposition.left-d.gridposition.left)+\"px\":e.TCPStrackinglineThickness;c.trackingline.style.backgroundImage=TiddlyWiki.getModifiedCssImageStyle(\"url(\"+\nd.imageprefix+\"trackingline-\"+(b.vertical?\"v\":\"h\")+\".gif)\");e.TCPStrackinglineClass&&(c.trackingline.className=e.TCPStrackinglineClass);SocialCalc.setStyles(c.trackingline,e.TCPStrackinglineStyle);b.vertical?(row=SocialCalc.Lookup(c.clientY+b.functionobj.control.sliderthickness,d.rowpositions),c.trackingline.style.top=(d.rowpositions[row]||d.headposition.top)+\"px\",c.trackingline.style.left=d.headposition.left+\"px\",d.context.rowpanes.length-1&&(d.context.SetRowPaneFirstLast(1,d.context.rowpanes[0].last+\n1,d.context.rowpanes[0].last+1),d.FitToEditTable(),d.ScheduleRender())):(col=SocialCalc.Lookup(c.clientX+b.functionobj.control.sliderthickness,d.colpositions),c.trackingline.style.top=d.headposition.top+\"px\",c.trackingline.style.left=(d.colpositions[col]||d.headposition.left)+\"px\",d.context.colpanes.length-1&&(d.context.SetColPaneFirstLast(1,d.context.colpanes[0].last+1,d.context.colpanes[0].last+1),d.FitToEditTable(),d.ScheduleRender()));d.griddiv.appendChild(c.trackingline)};\nSocialCalc.TCPSDragFunctionMove=function(a,c,b){var d,e;e=b.functionobj.control;d=e.sliderthickness;var f=e.editor;if(b.vertical){e=e.morebuttonstart-e.minscrollingpanesize-c.offsetY;c.clientY>e&&(c.clientY=e);e=f.headposition.top-d-c.offsetY;c.clientY<e&&(c.clientY=e);for(d=SocialCalc.Lookup(c.clientY+d,f.rowpositions);\"yes\"==f.context.sheetobj.rowattribs.hide[d];)d++;c.trackingline.style.top=(f.rowpositions[d]||f.headposition.top)+\"px\"}else{e=e.morebuttonstart-e.minscrollingpanesize-c.offsetX;c.clientX>\ne&&(c.clientX=e);e=f.headposition.left-d-c.offsetX;c.clientX<e&&(c.clientX=e);for(d=SocialCalc.Lookup(c.clientX+d,f.colpositions);\"yes\"==f.context.sheetobj.colattribs.hide[SocialCalc.rcColname(d)];)d++;c.trackingline.style.left=(f.colpositions[d]||f.headposition.left)+\"px\"}SocialCalc.DragFunctionPosition(a,c,b)};\nSocialCalc.TCPSDragFunctionStop=function(a,c,b){var d,e=b.functionobj.control;d=e.sliderthickness;a=e.editor;if(b.vertical){b=e.morebuttonstart-e.minscrollingpanesize-c.offsetY;c.clientY>b&&(c.clientY=b);b=a.headposition.top-d-c.offsetY;c.clientY<b&&(c.clientY=b);d=SocialCalc.Lookup(c.clientY+d,a.rowpositions);d>a.context.sheetobj.attribs.lastrow&&(d=a.context.sheetobj.attribs.lastrow);for(;\"yes\"==a.context.sheetobj.rowattribs.hide[d];)d++;!d||d<=a.context.rowpanes[0].first?1<a.context.rowpanes.length&&\n(a.context.rowpanes.length=1):a.context.rowpanes.length-1?a.timeout||(a.context.SetRowPaneFirstLast(0,a.context.rowpanes[0].first,d-1),a.context.SetRowPaneFirstLast(1,d,d)):(a.context.SetRowPaneFirstLast(0,a.context.rowpanes[0].first,d-1),a.context.SetRowPaneFirstLast(1,d,d))}else{b=e.morebuttonstart-e.minscrollingpanesize-c.offsetX;c.clientX>b&&(c.clientX=b);b=a.headposition.left-d-c.offsetX;c.clientX<b&&(c.clientX=b);d=SocialCalc.Lookup(c.clientX+d,a.colpositions);d>a.context.sheetobj.attribs.lastcol&&\n(d=a.context.sheetobj.attribs.lastcol);for(;\"yes\"==a.context.sheetobj.colattribs.hide[SocialCalc.rcColname(d)];)d++;!d||d<=a.context.colpanes[0].first?1<a.context.colpanes.length&&(a.context.colpanes.length=1):a.context.colpanes.length-1?a.timeout||(a.context.SetColPaneFirstLast(0,a.context.colpanes[0].first,d-1),a.context.SetColPaneFirstLast(1,d,d)):(a.context.SetColPaneFirstLast(0,a.context.colpanes[0].first,d-1),a.context.SetColPaneFirstLast(1,d,d))}a.FitToEditTable();a.griddiv.removeChild(c.trackingline);\na.ScheduleRender()};\nSocialCalc.TCTDragFunctionStart=function(a,c,b){var d=b.functionobj.control,e=d.editor,f=SocialCalc.Constants;SocialCalc.DragFunctionStart(a,c,b);c.thumbstatus&&(c.thumbstatus.rowmsgele&&(c.thumbstatus.rowmsgele=null),c.thumbstatus.rowpreviewele&&(c.thumbstatus.rowpreviewele=null),e.toplevel.removeChild(c.thumbstatus),c.thumbstatus=null);c.thumbstatus=document.createElement(\"div\");b.vertical?(f.TCTDFSthumbstatusvClass&&(c.thumbstatus.className=f.TCTDFSthumbstatusvClass),SocialCalc.setStyles(c.thumbstatus,f.TCTDFSthumbstatusvStyle),\nc.thumbstatus.style.top=c.clientY+f.TCTDFStopOffsetv+\"px\",c.thumbstatus.style.left=d.controlborder-10-e.tablewidth/2+\"px\",c.thumbstatus.style.width=e.tablewidth/2+\"px\",c.thumbcontext=new SocialCalc.RenderContext(e.context.sheetobj),c.thumbcontext.showGrid=!0,c.thumbcontext.rowpanes=[{first:1,last:1}],a=e.context.colpanes[e.context.colpanes.length-1],c.thumbcontext.colpanes=[{first:a.first,last:a.last}],c.thumbstatus.innerHTML='<table cellspacing=\"0\" cellpadding=\"0\"><tr><td valign=\"top\" style=\"'+f.TCTDFSthumbstatusrownumStyle+\n'\" class=\"'+f.TCTDFSthumbstatusrownumClass+'\"><div>msg</div></td><td valign=\"top\"><div style=\"overflow:hidden;\">preview</div></td></tr></table>',c.thumbstatus.rowmsgele=c.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild,c.thumbstatus.rowpreviewele=c.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild,e.toplevel.appendChild(c.thumbstatus),SocialCalc.TCTDragFunctionRowSetStatus(c,e,e.firstscrollingrow||1)):(f.TCTDFSthumbstatushClass&&(c.thumbstatus.className=f.TCTDFSthumbstatushClass),\nSocialCalc.setStyles(c.thumbstatus,f.TCTDFSthumbstatushStyle),c.thumbstatus.style.top=d.controlborder+f.TCTDFStopOffseth+\"px\",c.thumbstatus.style.left=c.clientX+f.TCTDFSleftOffseth+\"px\",e.toplevel.appendChild(c.thumbstatus),c.thumbstatus.innerHTML=f.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(e.firstscrollingcol))};\nSocialCalc.TCTDragFunctionRowSetStatus=function(a,c,b){a.thumbstatus.rowmsgele.innerHTML=SocialCalc.Constants.s_TCTDFthumbstatusPrefixv+b+\" \";a.thumbcontext.rowpanes=[{first:b,last:b}];a.thumbrowshown=b;a.thumbcontext.RenderSheet(a.thumbstatus.rowpreviewele.firstChild,{type:\"html\"})};\nSocialCalc.TCTDragFunctionMove=function(a,c,b){var d,e;d=b.functionobj.control;e=d.editor;var f=SocialCalc.Constants;b.vertical?(c.clientY>d.scrollareaend-c.offsetY-d.thumbthickness+2&&(c.clientY=d.scrollareaend-c.offsetY-d.thumbthickness+2),c.clientY<d.scrollareastart-c.offsetY-1&&(c.clientY=d.scrollareastart-c.offsetY-1),c.thumbstatus.style.top=c.clientY+\"px\",d=(c.clientY+c.offsetY-d.scrollareastart+1)/(d.scrollareasize-d.thumbthickness)*(e.context.sheetobj.attribs.lastrow-e.lastnonscrollingrow)+\ne.lastnonscrollingrow+1,d=Math.floor(d),d<=e.lastnonscrollingrow&&(d=e.lastnonscrollingrow+1),d>e.context.sheetobj.attribs.lastrow&&(d=e.context.sheetobj.attribs.lastrow),d!=c.thumbrowshown&&SocialCalc.TCTDragFunctionRowSetStatus(c,e,d)):(c.clientX>d.scrollareaend-c.offsetX-d.thumbthickness+2&&(c.clientX=d.scrollareaend-c.offsetX-d.thumbthickness+2),c.clientX<d.scrollareastart-c.offsetX-1&&(c.clientX=d.scrollareastart-c.offsetX-1),c.thumbstatus.style.left=c.clientX+\"px\",d=(c.clientX+c.offsetX-d.scrollareastart+\n1)/(d.scrollareasize-d.thumbthickness)*(e.context.sheetobj.attribs.lastcol-e.lastnonscrollingcol)+e.lastnonscrollingcol+1,d=Math.floor(d),d<=e.lastnonscrollingcol&&(d=e.lastnonscrollingcol+1),d>e.context.sheetobj.attribs.lastcol&&(d=e.context.sheetobj.attribs.lastcol),e=f.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(d),c.thumbstatus.innerHTML=e);SocialCalc.DragFunctionPosition(a,c,b)};\nSocialCalc.TCTDragFunctionStop=function(a,c,b){var d=b.functionobj.control;a=d.editor;b.vertical?(b=(c.clientY+c.offsetY-d.scrollareastart+1)/(d.scrollareasize-d.thumbthickness)*(a.context.sheetobj.attribs.lastrow-a.lastnonscrollingrow)+a.lastnonscrollingrow+1,b=Math.floor(b),b<=a.lastnonscrollingrow&&(b=a.lastnonscrollingrow+1),b>a.context.sheetobj.attribs.lastrow&&(b=a.context.sheetobj.attribs.lastrow),a.context.SetRowPaneFirstLast(a.context.rowpanes.length-1,b,b+1)):(b=(c.clientX+c.offsetX-d.scrollareastart+\n1)/(d.scrollareasize-d.thumbthickness)*(a.context.sheetobj.attribs.lastcol-a.lastnonscrollingcol)+a.lastnonscrollingcol+1,b=Math.floor(b),b<=a.lastnonscrollingcol&&(b=a.lastnonscrollingcol+1),b>a.context.sheetobj.attribs.lastcol&&(b=a.context.sheetobj.attribs.lastcol),a.context.SetColPaneFirstLast(a.context.colpanes.length-1,b,b+1));a.FitToEditTable();c.thumbstatus.rowmsgele&&(c.thumbstatus.rowmsgele=null);c.thumbstatus.rowpreviewele&&(c.thumbstatus.rowpreviewele=null);a.toplevel.removeChild(c.thumbstatus);\nc.thumbstatus=null;a.ScheduleRender()};SocialCalc.DragInfo={registeredElements:[],draggingElement:null,startX:0,startY:0,startZ:0,clientX:0,clientY:0,offsetX:0,offsetY:0,relativeOffset:{left:0,top:0}};\nSocialCalc.DragRegister=function(a,c,b,d,e){var f=SocialCalc.DragInfo;d||(d={MouseDown:SocialCalc.DragFunctionStart,MouseMove:SocialCalc.DragFunctionPosition,MouseUp:SocialCalc.DragFunctionPosition,Disabled:null});f.registeredElements.push({element:a,vertical:c,horizontal:b,functionobj:d,parent:e});if(a.addEventListener)a.addEventListener(\"mousedown\",SocialCalc.DragMouseDown,!1);else if(a.attachEvent)a.attachEvent(\"onmousedown\",SocialCalc.DragMouseDown);else throw SocialCalc.Constants.s_BrowserNotSupported;\n};SocialCalc.DragUnregister=function(a){var c=SocialCalc.DragInfo,b;if(a)for(b=0;b<c.registeredElements.length;b++)if(c.registeredElements[b].element==a){c.registeredElements.splice(b,1);a.removeEventListener?a.removeEventListener(\"mousedown\",SocialCalc.DragMouseDown,!1):a.detachEvent(\"onmousedown\",SocialCalc.DragMouseDown);break}};\nSocialCalc.DragMouseDown=function(a){a=a||window.event;var c=SocialCalc.DragInfo,b=SocialCalc.LookupElement(a.target||a.srcElement,c.registeredElements);if(b&&!(b&&b.functionobj&&b.functionobj.Disabled&&b.functionobj.Disabled(a,c,b)))return c.draggingElement=b,b.parent&&(c.relativeOffset=SocialCalc.GetElementPositionWithScroll(b.parent)),c.clientX=a.clientX-c.relativeOffset.left,c.clientY=a.clientY-c.relativeOffset.top,c.startX=c.clientX,c.startY=c.clientY,c.startZ=b.element.style.zIndex,c.offsetX=\n0,c.offsetY=0,b.element.style.zIndex=\"100\",document.addEventListener?(document.addEventListener(\"mousemove\",SocialCalc.DragMouseMove,!0),document.addEventListener(\"mouseup\",SocialCalc.DragMouseUp,!0)):b.element.attachEvent&&(b.element.setCapture(),b.element.attachEvent(\"onmousemove\",SocialCalc.DragMouseMove),b.element.attachEvent(\"onmouseup\",SocialCalc.DragMouseUp),b.element.attachEvent(\"onlosecapture\",SocialCalc.DragMouseUp)),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0,a.preventDefault?\na.preventDefault():a.returnValue=!1,b&&b.functionobj&&b.functionobj.MouseDown&&b.functionobj.MouseDown(a,c,b),!1};SocialCalc.DragMouseMove=function(a){a=a||window.event;var c=SocialCalc.DragInfo,b=c.draggingElement;c.clientX=a.clientX-c.relativeOffset.left;c.clientY=a.clientY-c.relativeOffset.top;a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;b&&b.functionobj&&b.functionobj.MouseMove&&b.functionobj.MouseMove(a,c,b);return!1};\nSocialCalc.DragMouseUp=function(a){a=a||window.event;var c=SocialCalc.DragInfo,b=c.draggingElement;c.clientX=a.clientX-c.relativeOffset.left;c.clientY=a.clientY-c.relativeOffset.top;b.element.style.zIndex=c.startZ;b&&b.functionobj&&b.functionobj.MouseUp&&b.functionobj.MouseUp(a,c,b);a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;document.removeEventListener?(document.removeEventListener(\"mousemove\",SocialCalc.DragMouseMove,!0),document.removeEventListener(\"mouseup\",SocialCalc.DragMouseUp,\n!0)):b.element.detachEvent&&(b.element.detachEvent(\"onlosecapture\",SocialCalc.DragMouseUp),b.element.detachEvent(\"onmouseup\",SocialCalc.DragMouseUp),b.element.detachEvent(\"onmousemove\",SocialCalc.DragMouseMove),b.element.releaseCapture());c.draggingElement=null;return!1};SocialCalc.DragFunctionStart=function(a,c,b){a=b.functionobj.positionobj||b.element;c.offsetY=parseInt(a.style.top)-c.clientY;c.offsetX=parseInt(a.style.left)-c.clientX};\nSocialCalc.DragFunctionPosition=function(a,c,b){a=b.functionobj.positionobj||b.element;b.vertical&&(a.style.top=c.clientY+c.offsetY+\"px\");b.horizontal&&(a.style.left=c.clientX+c.offsetX+\"px\")};SocialCalc.TooltipInfo={registeredElements:[],registered:!1,tooltipElement:null,timer:null,popupElement:null,clientX:0,clientY:0,offsetX:SocialCalc.Constants.TooltipOffsetX,offsetY:SocialCalc.Constants.TooltipOffsetY};\nSocialCalc.TooltipRegister=function(a,c,b,d){var e=SocialCalc.TooltipInfo;e.registeredElements.push({element:a,tiptext:c,functionobj:b,parent:d});if(!e.registered){if(document.addEventListener)document.addEventListener(\"mousemove\",SocialCalc.TooltipMouseMove,!1);else if(document.attachEvent)document.attachEvent(\"onmousemove\",SocialCalc.TooltipMouseMove);else throw SocialCalc.Constants.s_BrowserNotSupported;e.registered=!0}};\nSocialCalc.TooltipMouseMove=function(a){var c=a||window.event;a=SocialCalc.TooltipInfo;a.clientX=c.clientX;a.clientY=c.clientY;c=SocialCalc.LookupElement(c.target||c.srcElement,a.registeredElements);a.timer&&(window.clearTimeout(a.timer),a.timer=null);a.popupElement&&SocialCalc.TooltipHide();a.tooltipElement=c||null;c&&!SocialCalc.ButtonInfo.buttonDown&&(a.timer=window.setTimeout(SocialCalc.TooltipWaitDone,700),a.tooltipElement.element.addEventListener?a.tooltipElement.element.addEventListener(\"mousedown\",\nSocialCalc.TooltipMouseDown,!1):a.tooltipElement.element.attachEvent&&a.tooltipElement.element.attachEvent(\"onmousedown\",SocialCalc.TooltipMouseDown))};\nSocialCalc.TooltipMouseDown=function(a){a=SocialCalc.TooltipInfo;a.timer&&(window.clearTimeout(a.timer),a.timer=null);a.popupElement&&SocialCalc.TooltipHide();a.tooltipElement&&(a.tooltipElement.element.removeEventListener?a.tooltipElement.element.removeEventListener(\"mousedown\",SocialCalc.TooltipMouseDown,!1):a.tooltipElement.element.attachEvent&&a.tooltipElement.element.detachEvent(\"onmousedown\",SocialCalc.TooltipMouseDown),a.tooltipElement=null)};\nSocialCalc.TooltipDisplay=function(a){var c=SocialCalc.TooltipInfo,b=SocialCalc.Constants,d=a.functionobj&&\"number\"==typeof a.functionobj.offsetx?a.functionobj.offsetx:c.offsetX,e=a.functionobj&&\"number\"==typeof a.functionobj.offsety?a.functionobj.offsety:c.offsetY,f=SocialCalc.GetViewportInfo(),g=SocialCalc.GetElementPositionWithScroll(a.parent);c.popupElement=document.createElement(\"div\");b.TDpopupElementClass&&(c.popupElement.className=b.TDpopupElementClass);SocialCalc.setStyles(c.popupElement,\nb.TDpopupElementStyle);c.popupElement.innerHTML=a.tiptext;c.clientX>f.width/2?(c.popupElement.style.bottom=g.height-c.clientY+e+g.top+\"px\",c.popupElement.style.right=g.width-c.clientX+d+g.left+\"px\"):(c.popupElement.style.bottom=g.height-c.clientY+e+g.top+\"px\",c.popupElement.style.left=c.clientX+d-g.left+\"px\");50>c.clientY&&(c.popupElement.style.bottom=g.height-c.clientY+e-50+g.top+\"px\");a.parent.appendChild(c.popupElement)};\nSocialCalc.TooltipHide=function(){var a=SocialCalc.TooltipInfo;a.popupElement&&(a.popupElement.parentNode.removeChild(a.popupElement),a.popupElement=null)};SocialCalc.TooltipWaitDone=function(){var a=SocialCalc.TooltipInfo;a.timer=null;SocialCalc.TooltipDisplay(a.tooltipElement)};SocialCalc.ButtonInfo={registeredElements:[],buttonElement:null,doingHover:!1,buttonDown:!1,timer:null,relativeOffset:null,clientX:0,clientY:0};\nSocialCalc.ButtonRegister=function(a,c,b,d){var e=SocialCalc.ButtonInfo;b||(b={});e.registeredElements.push({name:b.name,element:c,editor:a,normalstyle:b.normalstyle,hoverstyle:b.hoverstyle,downstyle:b.downstyle,repeatwait:b.repeatwait,repeatinterval:b.repeatinterval,functionobj:d});if(c.addEventListener)c.addEventListener(\"mousedown\",SocialCalc.ButtonMouseDown,!1),c.addEventListener(\"mouseover\",SocialCalc.ButtonMouseOver,!1),c.addEventListener(\"mouseout\",SocialCalc.ButtonMouseOut,!1);else if(c.attachEvent)c.attachEvent(\"onmousedown\",\nSocialCalc.ButtonMouseDown),c.attachEvent(\"onmouseover\",SocialCalc.ButtonMouseOver),c.attachEvent(\"onmouseout\",SocialCalc.ButtonMouseOut);else throw SocialCalc.Constants.s_BrowserNotSupported;};\nSocialCalc.ButtonMouseOver=function(a){a=a||window.event;var c=SocialCalc.ButtonInfo,b=SocialCalc.LookupElement(a.target||a.srcElement,c.registeredElements);b&&(c.buttonDown?c.buttonElement==b&&(c.doingHover=!0):(c.buttonElement&&c.buttonElement!=b&&c.doingHover&&SocialCalc.setStyles(c.buttonElement.element,c.buttonElement.normalstyle),c.buttonElement=b,c.doingHover=!0,SocialCalc.setStyles(b.element,b.hoverstyle),b&&b.functionobj&&b.functionobj.MouseOver&&b.functionobj.MouseOver(a,c,b)))};\nSocialCalc.ButtonMouseOut=function(a){a=a||window.event;var c=SocialCalc.ButtonInfo;if(c.buttonDown)c.doingHover=!1;else{var b=SocialCalc.LookupElement(a.target||a.srcElement,c.registeredElements);c.doingHover&&(c.buttonElement&&SocialCalc.setStyles(c.buttonElement.element,c.buttonElement.normalstyle),c.buttonElement=null,c.doingHover=!1);b&&b.functionobj&&b.functionobj.MouseOut&&b.functionobj.MouseOut(a,c,b)}};\nSocialCalc.ButtonMouseDown=function(a){a=a||window.event;var c=SocialCalc.ButtonInfo;SocialCalc.GetViewportInfo();var b=SocialCalc.LookupElement(a.target||a.srcElement,c.registeredElements);!b||b&&b.functionobj&&b.functionobj.Disabled&&b.functionobj.Disabled(a,c,b)||(c.buttonElement=b,c.buttonDown=!0,SocialCalc.setStyles(b.element,c.buttonElement.downstyle),document.addEventListener?document.addEventListener(\"mouseup\",SocialCalc.ButtonMouseUp,!0):b.element.attachEvent&&(b.element.setCapture(),b.element.attachEvent(\"onmouseup\",\nSocialCalc.ButtonMouseUp),b.element.attachEvent(\"onlosecapture\",SocialCalc.ButtonMouseUp)),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0,a.preventDefault?a.preventDefault():a.returnValue=!1,c.relativeOffset=SocialCalc.GetElementPositionWithScroll(b.editor.toplevel),c.clientX=a.clientX-c.relativeOffset.left,c.clientY=a.clientY-c.relativeOffset.top,b&&b.functionobj&&b.functionobj.MouseDown&&b.functionobj.MouseDown(a,c,b),b.repeatwait&&(c.timer=window.setTimeout(SocialCalc.ButtonRepeat,b.repeatwait)))};\nSocialCalc.ButtonMouseUp=function(a){a=a||window.event;var c=SocialCalc.ButtonInfo,b=c.buttonElement;c.timer&&(window.clearTimeout(c.timer),c.timer=null);c.buttonDown&&(a.stopPropagation?a.stopPropagation():a.cancelBubble=!0,a.preventDefault?a.preventDefault():a.returnValue=!1,document.removeEventListener?document.removeEventListener(\"mouseup\",SocialCalc.ButtonMouseUp,!0):document.detachEvent&&(b.element.detachEvent(\"onlosecapture\",SocialCalc.ButtonMouseUp),b.element.detachEvent(\"onmouseup\",SocialCalc.ButtonMouseUp),\nb.element.releaseCapture()),c.buttonElement.downstyle&&(c.doingHover?SocialCalc.setStyles(b.element,c.buttonElement.hoverstyle):SocialCalc.setStyles(b.element,c.buttonElement.normalstyle)),c.buttonDown=!1,b&&b.functionobj&&b.functionobj.MouseUp&&b.functionobj.MouseUp(a,c,b))};\nSocialCalc.ButtonRepeat=function(){var a=SocialCalc.ButtonInfo,c=a.buttonElement;c&&(c&&c.functionobj&&c.functionobj.Repeat&&c.functionobj.Repeat(null,a,c),a.timer=window.setTimeout(SocialCalc.ButtonRepeat,c.repeatinterval||100))};SocialCalc.MouseWheelInfo={registeredElements:[]};\nSocialCalc.MouseWheelRegister=function(a,c){SocialCalc.MouseWheelInfo.registeredElements.push({element:a,functionobj:c});if(a.addEventListener)a.addEventListener(\"DOMMouseScroll\",SocialCalc.ProcessMouseWheel,!1),a.addEventListener(\"mousewheel\",SocialCalc.ProcessMouseWheel,!1);else if(a.attachEvent)a.attachEvent(\"onmousewheel\",SocialCalc.ProcessMouseWheel);else throw SocialCalc.Constants.s_BrowserNotSupported;};\nSocialCalc.ProcessMouseWheel=function(a){a=a||window.event;var c;if(!SocialCalc.GetSpreadsheetControlObject().keyboard.passThru){var b=SocialCalc.MouseWheelInfo;c=a.target||a.srcElement;var d;for(d=null;!d&&c;c=c.parentNode)d=SocialCalc.LookupElement(c,b.registeredElements);d&&((c=a.wheelDelta?a.wheelDelta/120:-a.detail/3)||(c=0),d.functionobj&&d.functionobj.WheelMove&&d.functionobj.WheelMove(a,c,b,d),a.preventDefault&&a.preventDefault(),a.returnValue=!1)}};\nSocialCalc.keyboardTables={specialKeysCommon:{8:\"[backspace]\",9:\"[tab]\",13:\"[enter]\",25:\"[tab]\",27:\"[esc]\",33:\"[pgup]\",34:\"[pgdn]\",35:\"[end]\",36:\"[home]\",37:\"[aleft]\",38:\"[aup]\",39:\"[aright]\",40:\"[adown]\",45:\"[ins]\",46:\"[del]\",113:\"[f2]\"},specialKeysIE:{8:\"[backspace]\",9:\"[tab]\",13:\"[enter]\",25:\"[tab]\",27:\"[esc]\",33:\"[pgup]\",34:\"[pgdn]\",35:\"[end]\",36:\"[home]\",37:\"[aleft]\",38:\"[aup]\",39:\"[aright]\",40:\"[adown]\",45:\"[ins]\",46:\"[del]\",113:\"[f2]\"},controlKeysIE:{67:\"[ctrl-c]\",83:\"[ctrl-s]\",86:\"[ctrl-v]\",\n88:\"[ctrl-x]\",90:\"[ctrl-z]\"},specialKeysOpera:{8:\"[backspace]\",9:\"[tab]\",13:\"[enter]\",25:\"[tab]\",27:\"[esc]\",33:\"[pgup]\",34:\"[pgdn]\",35:\"[end]\",36:\"[home]\",37:\"[aleft]\",38:\"[aup]\",39:\"[aright]\",40:\"[adown]\",45:\"[ins]\",46:\"[del]\",113:\"[f2]\"},controlKeysOpera:{67:\"[ctrl-c]\",83:\"[ctrl-s]\",86:\"[ctrl-v]\",88:\"[ctrl-x]\",90:\"[ctrl-z]\"},specialKeysSafari:{8:\"[backspace]\",9:\"[tab]\",13:\"[enter]\",25:\"[tab]\",27:\"[esc]\",63232:\"[aup]\",63233:\"[adown]\",63234:\"[aleft]\",63235:\"[aright]\",63272:\"[del]\",63273:\"[home]\",\n63275:\"[end]\",63276:\"[pgup]\",63277:\"[pgdn]\",63237:\"[f2]\"},controlKeysSafari:{99:\"[ctrl-c]\",115:\"[ctrl-s]\",118:\"[ctrl-v]\",120:\"[ctrl-x]\",122:\"[ctrl-z]\"},ignoreKeysSafari:{63236:\"[f1]\",63238:\"[f3]\",63239:\"[f4]\",63240:\"[f5]\",63241:\"[f6]\",63242:\"[f7]\",63243:\"[f8]\",63244:\"[f9]\",63245:\"[f10]\",63246:\"[f11]\",63247:\"[f12]\",63289:\"[numlock]\"},specialKeysFirefox:{8:\"[backspace]\",9:\"[tab]\",13:\"[enter]\",25:\"[tab]\",27:\"[esc]\",33:\"[pgup]\",34:\"[pgdn]\",35:\"[end]\",36:\"[home]\",37:\"[aleft]\",38:\"[aup]\",39:\"[aright]\",\n40:\"[adown]\",45:\"[ins]\",46:\"[del]\",113:\"[f2]\"},controlKeysFirefox:{99:\"[ctrl-c]\",115:\"[ctrl-s]\",118:\"[ctrl-v]\",120:\"[ctrl-x]\",122:\"[ctrl-z]\"},ignoreKeysFirefox:{16:\"[shift]\",17:\"[ctrl]\",18:\"[alt]\",20:\"[capslock]\",19:\"[pause]\",44:\"[printscreen]\",91:\"[windows]\",92:\"[windows]\",112:\"[f1]\",114:\"[f3]\",115:\"[f4]\",116:\"[f5]\",117:\"[f6]\",118:\"[f7]\",119:\"[f8]\",120:\"[f9]\",121:\"[f10]\",122:\"[f11]\",123:\"[f12]\",144:\"[numlock]\",145:\"[scrolllock]\",224:\"[cmd]\"}};SocialCalc.Constants.AllowCtrlS=!0;\nSocialCalc.Constants.AllowCtrlJ=!0;SocialCalc.keyboardTables.controlKeysIE[74]=\"[ctrl-j]\";SocialCalc.keyboardTables.controlKeysOpera[74]=\"[ctrl-j]\";SocialCalc.keyboardTables.controlKeysSafari[106]=\"[ctrl-j]\";SocialCalc.keyboardTables.controlKeysFirefox[106]=\"[ctrl-j]\";\nSocialCalc.KeyboardSetFocus=function(a){hack.log(\"\",hack.keyboard,\"SocialCalc.KeyboardSetFocus\");var c=SocialCalc.GetSpreadsheetControlObject();c.keyboard.focusTable=a;c.keyboard.areListener||(TiddlyWiki?(hack.log(\"add event listener: keydown, keypress, focus\",hack.keyboard,\"SocialCalc.KeyboardSetFocus\"),c.spreadsheetDiv.addEventListener(\"keydown\",SocialCalc.ProcessKeyDown,!1),c.spreadsheetDiv.addEventListener(\"keypress\",SocialCalc.ProcessKeyPress,!1),c.spreadsheetDiv.addEventListener(\"focus\",function(a){c.tiddlyWiki.inputboxHasKeyboard=\n!1},!1),c.tiddlyWiki.flagView||(c.editor.inputBox.element.addEventListener(\"focus\",function(a){c.tiddlyWiki.inputboxHasKeyboard=!0},!1),c.editor.inputBox.element.addEventListener(\"blur\",function(a){c.spreadsheetDiv.focus()},!1))):(document.onkeydown=SocialCalc.ProcessKeyDown,document.onkeypress=SocialCalc.ProcessKeyPress),c.keyboard.areListener=!0);c.keyboard.passThru&&(c.keyboard.passThru.blur&&c.keyboard.passThru.blur(),c.keyboard.passThru=null);TiddlyWiki?(hack.log(\"spreadsheet.spreadsheetDiv: take focus\",\nhack.keyboard,\"SocialCalc.KeyboardSetFocus\"),c.spreadsheetDiv.focus()):window.focus()};SocialCalc.KeyboardFocus=function(){hack.log(\"\",hack.keyboard,\"SocialCalc.KeyboardFocus\");var a=SocialCalc.GetSpreadsheetControlObject();a.keyboard.passThru=null;TiddlyWiki?a.spreadsheetDiv.focus():window.focus()};\nSocialCalc.ProcessKeyDown=function(a){hack.log(\"\",hack.keyboard,\"SocialCalc.ProcessKeyDown\");var c=SocialCalc.GetSpreadsheetControlObject(),b=SocialCalc.keyboardTables;b.didProcessKey=!1;b.statusFromProcessKey=!1;b.repeatingKeyPress=!1;var d=\"\",e=!0;if(!c.keyboard.passThru){a=a||window.event;if(void 0==a.which){d=b.specialKeysCommon[a.keyCode];if(!d&&(a.ctrlKey&&(d=b.controlKeysIE[a.keyCode]),!d))return!0;e=SocialCalc.ProcessKey(d,a);e||(a.preventDefault?a.preventDefault():a.returnValue=!1)}else{d=\nb.specialKeysCommon[a.keyCode];if(!d){if(a.ctrlKey||a.metaKey)d=b.controlKeysIE[a.keyCode];if(!d)return!0}e=SocialCalc.ProcessKey(d,a);b.didProcessKey=!0;b.statusFromProcessKey=e;b.chForProcessKey=d}TiddlyWiki&&!c.tiddlyWiki.inputboxHasKeyboard&&(a.preventDefault?a.preventDefault():a.returnValue=!1);return e}};\nSocialCalc.ProcessKeyPress=function(a){var c=SocialCalc.GetSpreadsheetControlObject(),b=SocialCalc.keyboardTables,d=\"\";a=a||window.event;if(!c.keyboard.passThru){if(b.didProcessKey){if(b.repeatingKeyPress)return SocialCalc.ProcessKey(b.chForProcessKey,a);b.repeatingKeyPress=!0;return b.statusFromProcessKey}if(void 0==a.which)d=String.fromCharCode(a.keyCode);else{if(!a.which)return!1;if(void 0==a.charCode)if(0!=a.which)if(32>a.which||144==a.which){if(d=b.specialKeysOpera[a.which])return!0}else d=a.ctrlKey?\nb.controlKeysOpera[a.keyCode]:String.fromCharCode(a.which);else return!0;else{if(0==a.keyCode&&0==a.charCode)return;if(a.keyCode==a.charCode){if(d=b.specialKeysSafari[a.keyCode],!d){if(b.ignoreKeysSafari[a.keyCode])return!0;d=a.metaKey?b.controlKeysSafari[a.keyCode]:String.fromCharCode(a.which)}}else{if(b.specialKeysFirefox[a.keyCode])return!0;d=String.fromCharCode(a.which);if(a.ctrlKey||a.metaKey)d=b.controlKeysFirefox[a.which]}}}c=SocialCalc.ProcessKey(d,a);c||(a.preventDefault?a.preventDefault():\na.returnValue=!1);return c}};SocialCalc.ProcessKey=function(a,c){var b=SocialCalc.GetSpreadsheetControlObject().keyboard.focusTable;return b?b.EditorProcessKey(a,c):!0};SocialCalc||(SocialCalc={});SocialCalc.FormatNumber={};SocialCalc.FormatNumber.format_definitions={};SocialCalc.FormatNumber.separatorchar=\",\";SocialCalc.FormatNumber.decimalchar=\".\";SocialCalc.FormatNumber.daynames=\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \");SocialCalc.FormatNumber.daynames3=\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \");SocialCalc.FormatNumber.monthnames3=\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \");SocialCalc.FormatNumber.monthnames=\"January February March April May June July August September October November December\".split(\" \");\nSocialCalc.FormatNumber.allowedcolors={BLACK:\"#000000\",BLUE:\"#0000FF\",CYAN:\"#00FFFF\",GREEN:\"#00FF00\",MAGENTA:\"#FF00FF\",RED:\"#FF0000\",WHITE:\"#FFFFFF\",YELLOW:\"#FFFF00\"};SocialCalc.FormatNumber.alloweddates={H:\"h]\",M:\"m]\",MM:\"mm]\",S:\"s]\",SS:\"ss]\"};SocialCalc.FormatNumber.commands={copy:1,color:2,integer_placeholder:3,fraction_placeholder:4,decimal:5,currency:6,general:7,separator:8,date:9,comparison:10,section:11,style:12};\nSocialCalc.FormatNumber.datevalues={julian_offset:2415019,seconds_in_a_day:86400,seconds_in_an_hour:3600};\nSocialCalc.FormatNumber.formatNumberWithFormat=function(a,c,b){b=SocialCalc.Constants;var d=SocialCalc.FormatNumber,e,f,g,l,h,m,p,r,q,n,s,t=\"\",u,w,v,x,y,z,C,D,G,I,E;if(\"string\"==typeof a&&!a.length)return\"\";E=a-0;if(!isFinite(E))return\"string\"==typeof a?d.formatTextWithFormat(a,c):\"NaN\";a=E;var H=0>E?1:0;H&&(E=-E);v=0==E?1:0;d.parse_format_string(d.format_definitions,c);c=d.format_definitions[c];if(!c)throw\"Format not parsed error!\";u=c.sectioninfo.length-1;if(c.hascomparison)for(v=s=u=0;;v++){e=\nc.operators[v];f=c.operands[v];if(!e){s&&(c=\"General\",d.parse_format_string(d.format_definitions,c),c=d.format_definitions[c],u=0);break}if(e==d.commands.section){if(!s)break;s=0;u++}else if(e==d.commands.comparison){s=f.indexOf(\":\");w=f.substring(0,s);f=f.substring(s+1)-0;if(\"<\"==w&&a<f||\"<=\"==w&&a<=f||\"=\"==w&&a==f||\"<>\"==w&&a!=f||\">=\"==w&&a>=f||\">\"==w&&a>f)break;s=1}}else if(0<u)if(1==u)H?(H=0,u=1):u=0;else if(2==u||3==u)H?(H=0,u=1):u=v?2:0;u=c.sectioninfo[u];if(0<u.commas)for(s=0;s<u.commas;s++)E/=\n1E3;if(0<u.percent)for(s=0;s<u.percent;s++)E*=100;f=1;for(s=0;s<u.fractiondigits;s++)f*=10;v=Math.floor(E*f+.5);v/=f;if(\"number\"!=typeof v||!isFinite(v))return\"NaN\";f=v+\"\";0==v&&(u.fractiondigits||u.integerdigits)&&(H=0);if(0<=f.indexOf(\"e\"))return a+\"\";f=f.match(/^\\+{0,1}(\\d*)(?:\\.(\\d*)){0,1}$/);if(!f)return\"NaN\";(v=f[1])&&\"0\"!=v||(v=\"\");(w=f[2])||(w=\"\");if(u.hasdate){if(0>a)return\"??-???-?? ??:??:??\";g=(a-Math.floor(a))*d.datevalues.seconds_in_a_day;l=a*d.datevalues.seconds_in_a_day;h=Math.floor(g/\nd.datevalues.seconds_in_an_hour);p=Math.floor(l/d.datevalues.seconds_in_an_hour);g-=h*d.datevalues.seconds_in_an_hour;m=Math.floor(g/60);r=Math.floor(l/60);f=1;for(s=0;s<u.fractiondigits;s++)f*=10;g=Math.floor((g-60*m)*f+.5);g/=f;l=Math.floor(l*f+.5);l/=f;60<=g&&(g=0,m++,r++,60<=m&&(m=0,h++,p++,24<=h&&(h=0,a++)));w=g-Math.floor(g)+\"\";w=w.substring(2);n=SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(a+d.datevalues.julian_offset));s=0;for(mspos=u.sectionstart;;mspos++){e=c.operators[mspos];\nf=c.operands[mspos];if(!e)break;if(e==d.commands.section)break;e==d.commands.date?(\"am/pm\"!=f.toLowerCase()&&\"a/p\"!=f.toLowerCase()||q||(12<=h?(h-=12,q=\"a/p\"==f.toLowerCase()?b.s_FormatNumber_pm1:b.s_FormatNumber_pm):q=\"a/p\"==f.toLowerCase()?b.s_FormatNumber_am1:b.s_FormatNumber_am,0>f.indexOf(q)&&(q=q.toLowerCase())),!s||\"m\"!=f&&\"mm\"!=f||(c.operands[mspos]+=\"in\"),s=\"h\"==f.charAt(0)?1:0):e!=d.commands.copy&&(s=0)}s=0;for(--mspos;;mspos--){e=c.operators[mspos];f=c.operands[mspos];if(!e)break;if(e==\nd.commands.section)break;e==d.commands.date?(!s||\"m\"!=f&&\"mm\"!=f||(c.operands[mspos]+=\"in\"),s=\"ss\"==f?1:0):e!=d.commands.copy&&(s=0)}}z=y=x=0;D=C=\"\";G=b.FormatNumber_separatorchar;0<=G.indexOf(\" \")&&(G=G.replace(/ /g,\" \"));I=b.FormatNumber_decimalchar;0<=I.indexOf(\" \")&&(I=I.replace(/ /g,\" \"));for(s=u.sectionstart;e=c.operators[s];)if(f=c.operands[s++],e==d.commands.copy)t+=f;else if(e==d.commands.color)C=f;else if(e==d.commands.style)D=f;else if(e==d.commands.integer_placeholder){H&&(t+=\n\"-\",H=0);x++;if(1==x&&v.length>u.integerdigits)for(;y<v.length-u.integerdigits;y++)t+=v.charAt(y),u.thousandssep&&(e=v.length-y-1,2<e&&0==e%3&&(t+=G));if(v.length<u.integerdigits&&x<=u.integerdigits-v.length){if(\"0\"==f||\"?\"==f)t+=\"0\"==f?\"0\":\" \",u.thousandssep&&(e=u.integerdigits-x,2<e&&0==e%3&&(t+=G))}else t+=v.charAt(y),u.thousandssep&&(e=v.length-y-1,2<e&&0==e%3&&(t+=G)),y++}else if(e==d.commands.fraction_placeholder){if(z>=w.length){if(\"0\"==f||\"?\"==f)t+=\"0\"==f?\"0\":\" \"}else t+=w.charAt(z);\nz++}else if(e==d.commands.decimal)H&&(t+=\"-\",H=0),t+=I;else if(e==d.commands.currency)H&&(t+=\"-\",H=0),t+=f;else if(e==d.commands.general){if(0!=E&&(f=Math.floor(Math.LOG10E*Math.log(E)),f=Math.pow(10,13-f),E=Math.floor(f*E+.5)/f,!isFinite(E)))return\"NaN\";H&&(t+=\"-\");f=E+\"\";if(0<=f.indexOf(\"e\"))t+=f;else{f=f.match(/^\\+{0,1}(\\d*)(?:\\.(\\d*)){0,1}$/);(v=f[1])&&\"0\"!=v||(v=\"\");(w=f[2])||(w=\"\");z=y=0;if(v.length)for(;y<v.length;y++)t+=v.charAt(y),u.thousandssep&&(e=v.length-y-1,2<e&&0==e%3&&(t+=G));else t+=\n\"0\";if(w.length)for(t+=I;z<w.length;z++)t+=w.charAt(z)}}else if(e==d.commands.date)f=f.toLowerCase(),\"y\"==f||\"yy\"==f?t+=(n.year+\"\").substring(2):\"yyyy\"==f?t+=n.year+\"\":\"d\"==f?t+=n.day+\"\":\"dd\"==f?(f=1E3+n.day,t+=(f+\"\").substr(2)):\"ddd\"==f?(f=Math.floor(a+6)%7,t+=b.s_FormatNumber_daynames3[f]):\"dddd\"==f?(f=Math.floor(a+6)%7,t+=b.s_FormatNumber_daynames[f]):\"m\"==f?t+=n.month+\"\":\"mm\"==f?(f=1E3+n.month,t+=(f+\"\").substr(2)):\"mmm\"==f?t+=b.s_FormatNumber_monthnames3[n.month-1]:\"mmmm\"==f?t+=b.s_FormatNumber_monthnames[n.month-\n1]:\"mmmmm\"==f?t+=b.s_FormatNumber_monthnames[n.month-1].charAt(0):\"h\"==f?t+=h+\"\":\"h]\"==f?t+=p+\"\":\"mmin\"==f?(f=1E3+m+\"\",t+=f.substr(2)):\"mm]\"==f?100>r?(f=1E3+r+\"\",t+=f.substr(2)):t+=r+\"\":\"min\"==f?t+=m+\"\":\"m]\"==f?t+=r+\"\":\"hh\"==f?(f=1E3+h+\"\",t+=f.substr(2)):\"s\"==f?(f=Math.floor(g),t+=f+\"\"):\"ss\"==f?(f=1E3+Math.floor(g)+\"\",t+=f.substr(2)):\"am/pm\"==f||\"a/p\"==f?t+=q:\"ss]\"==f&&(100>l?(f=1E3+Math.floor(l)+\"\",t+=f.substr(2)):(f=Math.floor(l),t+=f+\"\"));else if(e==d.commands.section)break;else e!=d.commands.comparison&&\n(t+=\"!! Parse error !!\");C&&(t='<span style=\"color:'+C+';\">'+t+\"</span>\");D&&(t='<span style=\"'+D+';\">'+t+\"</span>\");return t};\nSocialCalc.FormatNumber.formatTextWithFormat=function(a,c){var b=SocialCalc.FormatNumber,d=a+\"\",e=\"\",f,g,l=\"\",h=\"\";b.parse_format_string(b.format_definitions,c);thisformat=b.format_definitions[c];if(!thisformat)throw\"Format not parsed error!\";f=thisformat.sectioninfo.length-1;if(0==f)f=0;else if(3==f)f=3;else return d;for(f=thisformat.sectioninfo[f].sectionstart;op=thisformat.operators[f];)g=thisformat.operands[f++],op==b.commands.copy?e=\"@\"==g?e+d:e+g.replace(/ /g,\" \"):op==b.commands.color?\nl=g:op==b.commands.style&&(h=g);l&&(e='<span style=\"color:'+l+';\">'+e+\"</span>\");h&&(e='<span style=\"'+h+';\">'+e+\"</span>\");return e};\nSocialCalc.FormatNumber.parse_format_string=function(a,c){var b=SocialCalc.FormatNumber,d,e,f=1,g,l,h,m,p,r,q,n,s,t,u,w,v;if(!a[c]){d={operators:[],operands:[],sectioninfo:[{}]};a[c]=d;e=0;sectioninfo=d.sectioninfo[e];sectioninfo.sectionstart=0;sectioninfo.integerdigits=0;sectioninfo.fractiondigits=0;sectioninfo.commas=0;for(v=sectioninfo.percent=0;v<c.length;v++)if(s=c.charAt(v),p)'\"'==s?(p=0,d.operators.push(b.commands.copy),d.operands.push(r)):r+=s;else if(q)\"]\"==s?(q=0,s=SocialCalc.FormatNumber.parse_format_bracket(n),\ns.operator==b.commands.separator?sectioninfo.thousandssep=1:(s.operator==b.commands.date&&(sectioninfo.hasdate=1),s.operator==b.commands.comparison&&(d.hascomparison=1),d.operators.push(s.operator),d.operands.push(s.operand))):n+=s;else if(l)d.operators.push(b.commands.copy),d.operands.push(s),l=!1;else if(h)d.operators.push(b.commands.copy),d.operands.push(s+s+s+s+s),h=!1;else if(m)d.operators.push(b.commands.copy),d.operands.push(\" \"),m=!1;else{if(t){if(\"general\".charAt(t)==s.toLowerCase()){t++;\n7==t&&(d.operators.push(b.commands.general),d.operands.push(s),t=0);continue}t=0}if(w){if(w.charAt(0)==s){w+=s;continue}d.operators.push(b.commands.date);d.operands.push(w);sectioninfo.hasdate=1;w=\"\"}if(u)if(u+=s,s=u.toLowerCase(),s!=\"am/pm\".substring(0,s.length)&&s!=\"a/p\".substring(0,s.length))ampstr=\"\";else{if(\"am/pm\"==s||\"a/p\"==s)d.operators.push(b.commands.date),d.operands.push(u),u=\"\"}else\"#\"==s||\"0\"==s||\"?\"==s?(f?(sectioninfo.integerdigits++,sectioninfo.commas&&(sectioninfo.thousandssep=1,sectioninfo.commas=\n0),g=1,d.operators.push(b.commands.integer_placeholder)):(sectioninfo.fractiondigits++,g=1,d.operators.push(b.commands.fraction_placeholder)),d.operands.push(s)):\".\"==s?(g=0,d.operators.push(b.commands.decimal),d.operands.push(s),f=0):\"$\"==s?(g=0,d.operators.push(b.commands.currency),d.operands.push(s)):\",\"==s?g?sectioninfo.commas++:(d.operators.push(b.commands.copy),d.operands.push(s)):\"%\"==s?(g=0,sectioninfo.percent++,d.operators.push(b.commands.copy),d.operands.push(s)):'\"'==s?(g=0,p=1,r=\"\"):\"[\"==\ns?(g=0,q=1,n=\"\"):\"\\\\\"==s?(l=1,g=0):\"*\"==s?(h=1,g=0):\"_\"==s?(m=1,g=0):\";\"==s?(e++,d.sectioninfo[e]={},sectioninfo=d.sectioninfo[e],sectioninfo.sectionstart=1+d.operators.length,sectioninfo.integerdigits=0,sectioninfo.fractiondigits=0,sectioninfo.commas=0,sectioninfo.percent=0,f=1,g=0,d.operators.push(b.commands.section),d.operands.push(s)):\"g\"==s.toLowerCase()?(t=1,g=0):\"a\"==s.toLowerCase()?(u=s,g=0):0<=\"dmyhHs\".indexOf(s)?w=s:(g=0,d.operators.push(b.commands.copy),d.operands.push(s))}w&&(d.operators.push(b.commands.date),\nd.operands.push(w),sectioninfo.hasdate=1)}};\nSocialCalc.FormatNumber.parse_format_bracket=function(a){var c=SocialCalc.FormatNumber,b=SocialCalc.Constants,d={},e;\"$\"==a.charAt(0)?(d.operator=c.commands.currency,e=a.match(/^\\$(.+?)(\\-.+?){0,1}$/),d.operand=e?e[1]||b.FormatNumber_defaultCurrency||\"$\":a.substring(1)||b.FormatNumber_defaultCurrency||\"$\"):\"?$\"==a?(d.operator=c.commands.currency,d.operand=\"[?$]\"):c.allowedcolors[a.toUpperCase()]?(d.operator=c.commands.color,d.operand=c.allowedcolors[a.toUpperCase()]):(e=a.match(/^style=([^\"]*)$/))?\n(d.operator=c.commands.style,d.operand=e[1]):\",\"==a?(d.operator=c.commands.separator,d.operand=a):c.alloweddates[a.toUpperCase()]?(d.operator=c.commands.date,d.operand=c.alloweddates[a.toUpperCase()]):a.match(/^[<>=]/)?(e=a.match(/^([<>=]+)(.+)$/),d.operator=c.commands.comparison,d.operand=e[1]+\":\"+e[2]):(d.operator=c.commands.copy,d.operand=\"[\"+a+\"]\");return d};\nSocialCalc.FormatNumber.convert_date_gregorian_to_julian=function(a,c,b){b=b-32075+SocialCalc.intFunc(1461*(a+4800+SocialCalc.intFunc((c-14)/12))/4);b+=SocialCalc.intFunc(367*(c-2-12*SocialCalc.intFunc((c-14)/12))/12);return b-=SocialCalc.intFunc(3*SocialCalc.intFunc((a+4900+SocialCalc.intFunc((c-14)/12))/100)/4)};\nSocialCalc.FormatNumber.convert_date_julian_to_gregorian=function(a){var c,b,d,e;a+=68569;c=Math.floor(4*a/146097);a-=Math.floor((146097*c+3)/4);b=Math.floor(4E3*(a+1)/1461001);a=a-Math.floor(1461*b/4)+31;d=Math.floor(80*a/2447);e=a-Math.floor(2447*d/80);a=Math.floor(d/11);return{year:100*(c-49)+b+a,month:d+2-12*a,day:e}};SocialCalc.intFunc=function(a){return 0>a?-Math.floor(-a):Math.floor(a)};SocialCalc||(SocialCalc={});SocialCalc.Formula={};SocialCalc.Formula.ParseState={num:1,alpha:2,coord:3,string:4,stringquote:5,numexp1:6,numexp2:7,alphanumeric:8,specialvalue:9};SocialCalc.Formula.TokenType={num:1,coord:2,op:3,name:4,error:5,string:6,space:7};SocialCalc.Formula.CharClass={num:1,numstart:2,op:3,eof:4,alpha:5,incoord:6,error:7,quote:8,space:9,specialstart:10};\nSocialCalc.Formula.CharClassTable={\" \":9,\"!\":3,'\"':8,\"'\":8,\"#\":10,$:6,\"%\":3,\"&\":3,\"(\":3,\")\":3,\"*\":3,\"+\":3,\",\":3,\"-\":3,\".\":2,\"/\":3,0:1,1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1,\":\":3,\"<\":3,\"=\":3,\">\":3,A:5,B:5,C:5,D:5,E:5,F:5,G:5,H:5,I:5,J:5,K:5,L:5,M:5,N:5,O:5,P:5,Q:5,R:5,S:5,T:5,U:5,V:5,W:5,X:5,Y:5,Z:5,\"^\":3,_:5,a:5,b:5,c:5,d:5,e:5,f:5,g:5,h:5,i:5,j:5,k:5,l:5,m:5,n:5,o:5,p:5,q:5,r:5,s:5,t:5,u:5,v:5,w:5,x:5,y:5,z:5};\nSocialCalc.Formula.UpperCaseTable={a:\"A\",b:\"B\",c:\"C\",d:\"D\",e:\"E\",f:\"F\",g:\"G\",h:\"H\",i:\"I\",j:\"J\",k:\"K\",l:\"L\",m:\"M\",n:\"N\",o:\"O\",p:\"P\",q:\"Q\",r:\"R\",s:\"S\",t:\"T\",u:\"U\",v:\"V\",w:\"W\",x:\"X\",y:\"Y\",z:\"Z\",A:\"A\",B:\"B\",C:\"C\",D:\"D\",E:\"E\",F:\"F\",G:\"G\",H:\"H\",I:\"I\",J:\"J\",K:\"K\",L:\"L\",M:\"M\",N:\"N\",O:\"O\",P:\"P\",Q:\"Q\",R:\"R\",S:\"S\",T:\"T\",U:\"U\",V:\"V\",W:\"W\",X:\"X\",Y:\"Y\",Z:\"Z\"};SocialCalc.Formula.SpecialConstants={\"#NULL!\":\"0,e#NULL!\",\"#NUM!\":\"0,e#NUM!\",\"#DIV/0!\":\"0,e#DIV/0!\",\"#VALUE!\":\"0,e#VALUE!\",\"#REF!\":\"0,e#REF!\",\"#NAME?\":\"0,e#NAME?\"};\nSocialCalc.Formula.TokenPrecedence={\"!\":1,\":\":2,\",\":2,M:-3,P:-3,\"%\":4,\"^\":5,\"*\":6,\"/\":6,\"+\":7,\"-\":7,\"&\":8,\"<\":9,\">\":9,G:9,L:9,N:9};SocialCalc.Formula.TokenOpExpansion={G:\">=\",L:\"<=\",M:\"-\",N:\"<>\",P:\"+\"};\nSocialCalc.Formula.TypeLookupTable={unaryminus:{\"n*\":\"|n*:1|\",\"e*\":\"|e*:1|\",\"t*\":\"|t*:e#VALUE!|\",b:\"|b:n|\"},unaryplus:{\"n*\":\"|n*:1|\",\"e*\":\"|e*:1|\",\"t*\":\"|t*:e#VALUE!|\",b:\"|b:n|\"},unarypercent:{\"n*\":\"|n:n%|n*:n|\",\"e*\":\"|e*:1|\",\"t*\":\"|t*:e#VALUE!|\",b:\"|b:n|\"},plus:{\"n%\":\"|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|\",nd:\"|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|\",nt:\"|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|\",ndt:\"|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|\",\nn$:\"|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|\",nl:\"|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|\",n:\"|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|\",b:\"|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|\",\"t*\":\"|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|\",\"e*\":\"|e*:1|n*:1|t*:1|b:1|\"},concat:{t:\"|t:t|th:th|tw:tw|tl:t|tr:tr|t*:2|e*:2|\",th:\"|t:th|th:th|tw:t|tl:th|tr:t|t*:t|e*:2|\",tw:\"|t:tw|th:t|tw:tw|tl:tw|tr:tw|t*:t|e*:2|\",tl:\"|t:tl|th:th|tw:tw|tl:tl|tr:tr|t*:t|e*:2|\",\n\"t*\":\"|t*:t|e*:2|\",\"e*\":\"|e*:1|n*:1|t*:1|\"},oneargnumeric:{\"n*\":\"|n*:n|\",\"e*\":\"|e*:1|\",\"t*\":\"|t*:e#VALUE!|\",b:\"|b:n|\"},twoargnumeric:{\"n*\":\"|n*:n|t*:e#VALUE!|e*:2|\",\"e*\":\"|e*:1|n*:1|t*:1|\",\"t*\":\"|t*:e#VALUE!|n*:e#VALUE!|e*:2|\"},propagateerror:{\"n*\":\"|n*:2|e*:2|\",\"e*\":\"|e*:2|\",\"t*\":\"|t*:2|e*:2|\",b:\"|b:2|e*:2|\"}};\nSocialCalc.Formula.ParseFormulaIntoTokens=function(a){var c,b,d,e,f,g;c=SocialCalc.Formula;var l=SocialCalc.Constants,h=c.ParseState,m=c.TokenType,p=c.CharClass,r=c.CharClassTable,q=c.UpperCaseTable,n=c.ParsePushToken,s=/^\\$?[A-Z]{1,2}\\$?[1-9]\\d*$/i,t=[],u=\"\";f=0;e=!1;for(c=0;c<=a.length;c++)c<a.length?(b=a.charAt(c),d=r[b]):(b=\"\",d=p.eof),f==h.num&&(d==p.num?u+=b:d!=p.numstart||e?\"E\"==b||\"e\"==b?(u+=b,e=!1,f=h.numexp1):(n(t,u,m.num,0),e=!1,f=0):(e=!0,u+=b)),f==h.numexp1&&(d==h.num?f=h.numexp2:\"+\"!=\nb&&\"-\"!=b||\"E\"!=q[u.charAt(u.length-1)]?\"E\"!=b&&\"e\"!=b&&(n(t,l.s_parseerrexponent,m.error,0),f=0):u+=b),f==h.numexp2&&(d==p.num?u+=b:(n(t,u,m.num,0),f=0)),f==h.alpha&&(d==p.num?f=h.coord:d==p.alpha||\".\"==b?u+=b:d==p.incoord?f=h.coord:(d==p.op||d==p.numstart||d==p.space||d==p.eof?n(t,u.toUpperCase(),m.name,0):n(t,l.s_parseerrchar,m.error,0),f=0)),f==h.coord&&(d==p.num?u+=b:d==p.incoord?u+=b:d==p.alpha?f=h.alphanumeric:(d==p.op||d==p.numstart||d==p.eof||d==p.space?(f=s.test(u)?m.coord:m.name,n(t,u.toUpperCase(),\nf,0)):n(t,l.s_parseerrchar,m.error,0),f=0)),f==h.alphanumeric&&(d==p.num||d==p.alpha?u+=b:(d==p.op||d==p.numstart||d==p.space||d==p.eof?n(t,u.toUpperCase(),m.name,0):n(t,l.s_parseerrchar,m.error,0),f=0)),f==h.string?d==p.quote?f=h.stringquote:d==p.eof?(n(t,l.s_parseerrstring,m.error,0),f=0):u+=b:f==h.stringquote?d==p.quote?(u+=b,f=h.string):(n(t,u,m.string,0),f=0):f==h.specialvalue&&(\"!\"==u.charAt(u.length-1)?(n(t,u,m.name,0),f=0):d==p.eof?(n(t,l.s_parseerrspecialvalue,m.error,0),f=0):u+=b),0==f&&\n(d==p.num?(u=b,f=h.num):d==p.numstart?(u=b,e=!0,f=h.num):d==p.alpha||d==p.incoord?(u=b,f=h.alpha):d==p.specialstart?(u=b,f=h.specialvalue):d==p.op?(u=b,0<t.length?(f=t[t.length-1],d=f.type,g=f.text,d!=p.op||\"<\"!=g&&\">\"!=g||(u=g+u,t.pop(),0<t.length?(f=t[t.length-1],d=f.type,g=f.text):(d=p.eof,g=\"EOF\"))):(d=p.eof,g=\"EOF\"),f=m.op,0==t.length||d==p.op&&\")\"!=g&&\"%\"!=g?\"-\"==u?b=u=\"M\":\"+\"==u?b=u=\"P\":\")\"==u&&\"(\"==g||\"(\"==u||(f=m.error,u=l.s_parseerrtwoops):1<u.length&&(\">=\"==u?b=u=\"G\":\"<=\"==u?b=u=\"L\":\"<>\"==\nu?b=u=\"N\":(f=m.error,u=l.s_parseerrtwoops)),n(t,u,f,b),f=0):d==p.quote?(u=\"\",f=h.string):d!=p.space&&d!=p.eof&&n(t,l.s_parseerrchar,m.error,0));return t};SocialCalc.Formula.ParsePushToken=function(a,c,b,d){a.push({text:c,type:b,opcode:d})};SocialCalc.Formula.evaluate_parsed_formula=function(a,c,b){var d=SocialCalc.Formula,e;e=d.ConvertInfixToPolish(a);return d.EvaluatePolish(a,e,c,b)};\nSocialCalc.Formula.ConvertInfixToPolish=function(a){var c=SocialCalc.Formula,b=SocialCalc.Constants,d=c.TokenType,c=c.TokenPrecedence,e=[],f=[],g=\"\",l,h,m,p;for(l=0;l<a.length;l++)if(h=a[l],m=h.type,p=h.text,m==d.num||m==d.coord||m==d.string)e.push(l);else if(m==d.name)f.push(l),e.push(-1);else if(m!=d.space)if(\",\"==p){for(;f.length&&\"(\"!=a[f[f.length-1]].text;)e.push(f.pop());if(0==f.length){g=b.s_parseerrmissingopenparen;break}}else if(\"(\"==p)f.push(l);else if(\")\"==p){for(;f.length&&\"(\"!=a[f[f.length-\n1]].text;)e.push(f.pop());if(0==f.length){g=b.s_parseerrcloseparennoopen;break}f.pop();f.length&&a[f[f.length-1]].type==d.name&&e.push(f.pop())}else if(m==d.op){for(f.length&&a[f[f.length-1]].type==d.name&&e.push(f.pop());f.length&&a[f[f.length-1]].type==d.op&&\"(\"!=a[f[f.length-1]].text;){m=c[h.opcode];p=c[a[f[f.length-1]].opcode];if(0<=m&&m<p)break;else if(0>m&&(m=-m,0>p&&(p=-p),m<=p))break;e.push(f.pop())}f.push(l)}else{g=m==d.error?p:\"Internal error while processing parsed formula. \";break}for(;0<\nf.length;){if(\"(\"==a[f[f.length-1]].text){g=b.s_parseerrmissingcloseparen;break}e.push(f.pop())}return g?g:e};\nSocialCalc.Formula.EvaluatePolish=function(a,c,b,d){var e=SocialCalc.Formula,f=SocialCalc.Constants,g=e.TokenType,l=e.LookupResultType,h=e.TypeLookupTable,m=e.OperandAsNumber,p=e.OperandAsText,r=e.OperandValueAndType,q=e.OperandsAsCoordOnSheet,n=SocialCalc.format_number_for_display||function(a,c,b){return a+\"\"},s=\"\",t={value:\"\",type:\"e#VALUE!\",error:f.s_parseerrmissingoperand},u=[],w=function(a,c){u.push({type:a,value:c})},v,x,y,z,C,D;if(!(a.length&&c instanceof Array))return{value:\"\",type:\"e#VALUE!\",\nerror:\"string\"==typeof c?c:\"\"};for(v=0;v<c.length;v++)if(x=c[v],-1==x)w(\"start\",0);else if(x=a[x],y=x.type,x=x.text,y==g.num)w(\"n\",x-0);else if(y==g.coord)w(\"coord\",x);else if(y==g.string)w(\"t\",x);else if(y==g.op){if(0>=u.length)return t;if(\"M\"==x)y=m(b,u),x=l(y.type,y.type,h.unaryminus),w(x,-y.value);else if(\"P\"==x)y=m(b,u),x=l(y.type,y.type,h.unaryplus),w(x,y.value);else if(\"%\"==x)y=m(b,u),x=l(y.type,y.type,h.unarypercent),w(x,.01*y.value);else if(\"&\"==x){if(1>=u.length)return t;z=p(b,u);y=p(b,\nu);x=l(y.type,y.type,h.concat);w(x,y.value+z.value)}else if(\":\"==x){if(1>=u.length)return t;y=e.OperandsAsRangeOnSheet(b,u);y.error&&(s=s||y.error);w(y.type,y.value)}else if(\"!\"==x){if(1>=u.length)return t;y=q(b,u);y.error&&(s=s||y.error);w(y.type,y.value)}else if(\"<\"==x||\"L\"==x||\"=\"==x||\"G\"==x||\">\"==x||\"N\"==x){if(1>=u.length){s=f.s_parseerrmissingoperand;break}z=r(b,u);y=r(b,u);\"n\"==y.type.charAt(0)&&\"n\"==z.type.charAt(0)?(C=0,\"<\"==x?C=y.value<z.value?1:0:\"L\"==x?C=y.value<=z.value?1:0:\"=\"==x?C=y.value==\nz.value?1:0:\"G\"==x?C=y.value>=z.value?1:0:\">\"==x?C=y.value>z.value?1:0:\"N\"==x&&(C=y.value!=z.value?1:0),w(\"nl\",C)):\"e\"==y.type.charAt(0)?w(y.type,0):\"e\"==z.type.charAt(0)?w(z.type,0):(C=y.type.charAt(0),D=z.type.charAt(0),\"n\"==C?y.value=n(y.value,\"n\",\"\"):\"b\"==C&&(y.value=\"\"),\"n\"==D?z.value=n(z.value,\"n\",\"\"):\"b\"==D&&(z.value=\"\"),C=0,y.value=y.value.toLowerCase(),z.value=z.value.toLowerCase(),\"<\"==x?C=y.value<z.value?1:0:\"L\"==x?C=y.value<=z.value?1:0:\"=\"==x?C=y.value==z.value?1:0:\"G\"==x?C=y.value>=\nz.value?1:0:\">\"==x?C=y.value>z.value?1:0:\"N\"==x&&(C=y.value!=z.value?1:0),w(\"nl\",C))}else{if(1>=u.length){s=f.s_parseerrmissingoperand;break}z=m(b,u);y=m(b,u);\"+\"==x?(x=l(y.type,z.type,h.plus),w(x,y.value+z.value)):\"-\"==x?(x=l(y.type,z.type,h.plus),w(x,y.value-z.value)):\"*\"==x?(x=l(y.type,z.type,h.plus),w(x,y.value*z.value)):\"/\"==x?0!=z.value?w(\"n\",y.value/z.value):w(\"e#DIV/0!\",0):\"^\"==x&&(y.value=Math.pow(y.value,z.value),y.type=\"n\",isNaN(y.value)&&(y.value=0,y.type=\"e#NUM!\"),w(y.type,y.value))}}else if(y==\ng.name){if(s=e.CalculateFunction(x,u,b))break}else{s=f.s_InternalError+\"Unknown token \"+y+\" (\"+x+\"). \";break}value=u[0]?u[0].value:\"\";C=u[0]?u[0].type:\"\";\"name\"==C&&(y=SocialCalc.Formula.LookupName(b,value),value=y.value,C=y.type,s=s||y.error);\"coord\"==C&&(y=r(b,u),value=y.value,C=y.type,\"b\"==C&&(C=\"n\",value=0));1<u.length&&!s&&(s+=f.s_parseerrerrorinformula);a=C;\"e\"==C.charAt(0)?s=s||C.substring(1)||f.s_calcerrerrorvalueinformula:\"range\"==C&&(c=value.match(/^(.*)\\|(.*)\\|/),b=c[1].indexOf(\"!\"),c[1]=\n0<=b?c[1].substring(b+1)+\"!\"+c[1].substring(0,b).toUpperCase():c[1].toUpperCase(),value=c[1]+\":\"+c[2].toUpperCase(),d||(s=f.s_formularangeresult+\" \"+value));s&&\"e\"!=a.charAt(0)&&(value=s,a=\"e\");\"n\"!=a.charAt(0)||!isNaN(value)&&isFinite(value)||(value=0,a=\"e#NUM!\",s=isNaN(value)?f.s_calcerrnumericnan:f.s_calcerrnumericoverflow);return{value:value,type:a,error:s}};\nSocialCalc.Formula.LookupResultType=function(a,c,b){var d,e;e=b[a];if(!e&&(e=b[a.charAt(0)+\"*\"],!e))return\"e#VALUE! (internal error, missing LookupResultType \"+a.charAt(0)+\"*)\";b=e.indexOf(\"|\"+c+\":\");if(0<=b){d=e.indexOf(\"|\",b+1);if(0>d)return\"e#VALUE! (internal error, incorrect LookupResultType \"+e+\")\";e=e.substring(b+c.length+2,d);return\"1\"==e?a:\"2\"==e?c:e}b=e.indexOf(\"|\"+c.charAt(0)+\"*:\");if(0<=b){d=e.indexOf(\"|\",b+1);if(0>d)return\"e#VALUE! (internal error, incorrect LookupResultType \"+e+\")\";e=\ne.substring(b+4,d);return\"1\"==e?a:\"2\"==e?c:e}return\"e#VALUE!\"};SocialCalc.Formula.TopOfStackValueAndType=function(a,c){var b=SocialCalc.Formula,d={type:\"\",value:\"\"},e=c.length;if(!e)return d.error=SocialCalc.Constants.s_InternalError+\"no operand on stack\",d;d.value=c[e-1].value;d.type=c[e-1].type;c.pop();\"name\"==d.type&&(d=b.LookupName(a,d.value));return d};\nSocialCalc.Formula.OperandAsNumber=function(a,c){var b,d=SocialCalc.Formula.OperandValueAndType(a,c);b=d.type.charAt(0);\"n\"==b?d.value-=0:\"b\"==b?(d.type=\"n\",d.value=0):\"e\"==b?d.value=0:(b=SocialCalc.DetermineValueType?SocialCalc.DetermineValueType(d.value):{value:d.value-0,type:\"n\"},\"n\"==b.type.charAt(0)?d.value=b.value-0:d.value=0,d.type=b.type);return d};\nSocialCalc.Formula.OperandAsText=function(a,c){var b,d=SocialCalc.Formula.OperandValueAndType(a,c);b=d.type.charAt(0);\"t\"!=b&&(\"n\"==b?(d.value=SocialCalc.format_number_for_display?SocialCalc.format_number_for_display(d.value,d.type,\"\"):d.value+=\"\",d.type=\"t\"):\"b\"==b?(d.value=\"\",d.type=\"t\"):\"e\"==b?d.value=\"\":(c.value=d.value+\"\",c.type=\"t\"));return d};\nSocialCalc.Formula.OperandValueAndType=function(a,c){var b,d,e;b=SocialCalc.Formula;var f={type:\"\",value:\"\"};d=c.length;if(!d)return f.error=SocialCalc.Constants.s_InternalError+\"no operand on stack\",f;f.value=c[d-1].value;f.type=c[d-1].type;c.pop();\"name\"==f.type&&(f=b.LookupName(a,f.value));\"range\"==f.type&&(f=b.StepThroughRangeDown(c,f.value));if(\"coord\"==f.type){e=a;d=f.value.indexOf(\"!\");if(-1!=d){e=b.FindInSheetCache(f.value.substring(d+1));if(null==e)return f.type=\"e#REF!\",f.error=SocialCalc.Constants.s_sheetunavailable+\n\" \"+f.value.substring(d+1),f.value=0,f;f.value=f.value.substring(0,d)}e?(d=e.cells[SocialCalc.Formula.PlainCoord(f.value)])?(b=d.valuetype,f.value=d.datavalue):b=\"b\":(b=\"e#N/A\",f.value=0);f.type=b||\"b\";\"b\"==f.type&&(f.value=0)}return f};\nSocialCalc.Formula.OperandAsCoord=function(a,c){var b={type:\"\",value:\"\"},d=c.length;b.value=c[d-1].value;b.type=c[d-1].type;c.pop();\"name\"==b.type&&(b=SocialCalc.Formula.LookupName(a,b.value));\"coord\"!=b.type&&(b.value=SocialCalc.Constants.s_calcerrcellrefmissing,b.type=\"e#REF!\");return b};\nSocialCalc.Formula.OperandsAsCoordOnSheet=function(a,c){var b,d,e,f={},g={};e=SocialCalc.Formula;b=c.length;f.value=c[b-1].value;f.type=c[b-1].type;c.pop();b=e.OperandAsSheetName(a,c);d=e.FindInSheetCache(b.value);if(null==d)return g.type=\"e#REF!\",g.value=0,g.error=SocialCalc.Constants.s_sheetunavailable+\" \"+b.value,g;\"name\"==f.type&&(f=e.LookupName(d,f.value));g.type=f.type;\"coord\"==f.type?g.value=f.value+\"!\"+b.value:\"range\"==f.type?(e=f.value.indexOf(\"|\"),d=f.value.indexOf(\"|\",e+1),g.value=f.value.substring(0,\ne)+\"!\"+b.value+\"|\"+f.value.substring(e+1,d)+\"|\"):\"e\"==f.type.charAt(0)?g.value=f.value:(g.error=SocialCalc.Constants.s_calcerrcellrefmissing,g.type=\"e#REF!\",g.value=0);return g};\nSocialCalc.Formula.OperandsAsRangeOnSheet=function(a,c){var b,d,e,f,g={},l=SocialCalc.Formula,h=SocialCalc.Constants;b=c.length;g.value=c[b-1].value;g.type=c[b-1].type;c.pop();b=l.OperandAsCoord(a,c);if(\"coord\"!=b.type)return{value:0,type:\"e#REF!\"};d=a;e=b.value.indexOf(\"!\");if(-1!=e&&(f=b.value.indexOf(\"|\",e+1),0>f&&(f=b.value.length),d=l.FindInSheetCache(b.value.substring(e+1,f)),null==d))return{value:0,type:\"e#REF!\",errortext:h.s_sheetunavailable+\" \"+b.value.substring(e+1,f)};\"name\"==g.type&&(g=\nl.LookupName(d,g.value,\"end\"));return\"coord\"==g.type?{value:b.value+\"|\"+g.value+\"|\",type:\"range\"}:{value:h.s_calcerrcellrefmissing,type:\"e#REF!\"}};\nSocialCalc.Formula.OperandAsSheetName=function(a,c){var b,d={type:\"\",value:\"\"};b=c.length;d.value=c[b-1].value;d.type=c[b-1].type;c.pop();if(\"name\"==d.type){b=SocialCalc.Formula.LookupName(a,d.value);if(!b.value)return d;d.value=b.value;d.type=b.type}\"coord\"==d.type&&((b=a.cells[SocialCalc.Formula.PlainCoord(d.value)])?(d.value=b.datavalue,d.type=b.valuetype):(d.value=\"\",d.type=\"b\"));\"t\"!=d.type.charAt(0)&&(d.value=\"\",d.error=SocialCalc.Constants.s_calcerrsheetnamemissing);return d};\nSocialCalc.Formula.LookupName=function(a,c,b){var d,e,f=a.names;e={};d=!1;if(f[c.toUpperCase()]){e.value=f[c.toUpperCase()].definition;if(\"=\"==e.value.charAt(0)){if(!a.checknamecirc)a.checknamecirc={},d=!0;else if(a.checknamecirc[c])return e.type=\"e#NAME?\",e.error=SocialCalc.Constants.s_circularnameref+' \"'+c+'\".',e;a.checknamecirc[c]=!0;e=SocialCalc.Formula.ParseFormulaIntoTokens(e.value.substring(1));e=SocialCalc.Formula.evaluate_parsed_formula(e,a,1);delete a.checknamecirc[c];d&&delete a.checknamecirc;\nif(\"range\"!=e.type)return e}a=e.value.indexOf(\":\");-1!=a?(e.type=\"range\",e.value=e.value.substring(0,a)+\"|\"+e.value.substring(a+1)+\"|\"):e.type=\"coord\";e.value=e.value.toUpperCase()}else(d=SocialCalc.Formula.SpecialConstants[c.toUpperCase()])?(a=d.indexOf(\",\"),e.value=d.substring(0,a)-0,e.type=d.substring(a+1)):/^[a-zA-Z][a-zA-Z]?$/.test(c)?(e.type=\"coord\",e.value=c.toUpperCase()+(b?a.attribs.lastrow:1)):(e.value=\"\",e.type=\"e#NAME?\",e.error=SocialCalc.Constants.s_calcerrunknownname+' \"'+c+'\"');return e};\nSocialCalc.Formula.StepThroughRangeDown=function(a,c){var b,d,e,f,g,l,h,m,p=SocialCalc.Formula;f=c.indexOf(\"|\");e=c.indexOf(\"|\",f+1);b=c.substring(0,f);d=c.substring(f+1,e);e=c.substring(e+1)-0;f=b.indexOf(\"!\");-1!=f?(g=b.substring(f),b=b.substring(0,f)):g=\"\";f=d.indexOf(\"!\");-1!=f&&(d=d.substring(0,f));f=p.OrderRangeParts(b,d);m=0;for(h=f.r1;h<=f.r2;h++)for(l=f.c1;l<=f.c2;l++)if(m++,m>e)return h==f.r2&&l==f.c2||p.PushOperand(a,\"range\",b+g+\"|\"+d+\"|\"+m),{value:SocialCalc.crToCoord(l,h)+g,type:\"coord\"}};\nSocialCalc.Formula.DecodeRangeParts=function(a,c){var b,d,e,f,g=SocialCalc.Formula;e=c.indexOf(\"|\");f=c.indexOf(\"|\",e+1);b=c.substring(0,e);d=c.substring(e+1,f);e=b.indexOf(\"!\");-1!=e?(f=b.substring(e+1),b=b.substring(0,e)):f=\"\";e=d.indexOf(\"!\");-1!=e&&(d=d.substring(0,e));e=a;if(f&&(e=g.FindInSheetCache(f),null==e))return null;b=g.OrderRangeParts(b,d);return{sheetdata:e,sheetname:f,col1num:b.c1,ncols:b.c2-b.c1+1,row1num:b.r1,nrows:b.r2-b.r1+1}};\nSocialCalc.Formula.FunctionList||(SocialCalc.Formula.FunctionList={});SocialCalc.Formula.FunctionClasses=null;SocialCalc.Formula.FunctionArgDefs={};\nSocialCalc.Formula.CalculateFunction=function(a,c,b){var d,e,f,g=SocialCalc.Formula;e=\"\";if(d=g.FunctionList[a]){e=[];f=d[0];d=d[1];g.CopyFunctionArgs(c,e);if(100!=d)if(0>d){if(e.length<-d)return e=g.FunctionArgsError(a,c)}else if(e.length!=d)return e=g.FunctionArgsError(a,c);e=f(a,c,e,b)}else c.length&&\"start\"==c[c.length-1].type?(c.pop(),g.PushOperand(c,\"name\",a)):e=SocialCalc.Constants.s_sheetfuncunknownfunction+\" \"+a+\". \";return e};\nSocialCalc.Formula.PushOperand=function(a,c,b){a.push({type:c,value:b})};SocialCalc.Formula.CopyFunctionArgs=function(a,c){for(;0<a.length&&\"start\"!=a[a.length-1].type;)c.push(a.pop());a.pop()};SocialCalc.Formula.FunctionArgsError=function(a,c){var b=SocialCalc.Constants.s_calcerrincorrectargstofunction+\" \"+a+\". \";SocialCalc.Formula.PushOperand(c,\"e#VALUE!\",b);return b};SocialCalc.Formula.FunctionSpecificError=function(a,c,b,d){SocialCalc.Formula.PushOperand(c,b,d);return d};\nSocialCalc.Formula.CheckForErrorValue=function(a,c){return\"e\"==c.type.charAt(0)?(a.push(c),!0):!1};\nSocialCalc.Formula.FillFunctionInfo=function(){var a=SocialCalc.Formula,c=SocialCalc.Constants,b,d,e;if(!a.FunctionClasses){for(b in a.FunctionList)d=a.FunctionList[b],d[2]&&(a.FunctionArgDefs[d[2]]=c[\"s_farg_\"+d[2]]||\"\"),d[3]||c[\"s_fdef_\"+b]&&(a.FunctionList[b][3]=c[\"s_fdef_\"+b]);a.FunctionClasses={};for(d=0;d<c.function_classlist.length;d++)e=c.function_classlist[d],a.FunctionClasses[e]={name:c[\"s_fclass_\"+e],items:[]};for(b in a.FunctionList)for(d=a.FunctionList[b],c=d[4]?d[4].split(\",\"):[],c.push(\"all\"),\nd=0;d<c.length;d++)e=c[d],a.FunctionClasses[e].items.push(b);for(e in a.FunctionClasses)a.FunctionClasses[e].items.sort()}};SocialCalc.Formula.FunctionArgString=function(a){var c=SocialCalc.Formula;a=c.FunctionList[a];var b;b=a[2];if(!b)if(a=a[1],0==a)b=\" \";else{if(0<a){b=\"v1\";for(c=2;c<=a;c++)b+=\", v\"+c;return b}if(0>a){b=\"v1\";for(c=2;c<-a;c++)b+=\", v\"+c;return b+\", ...\"}return\"nargs: \"+a}return b=c.FunctionArgDefs[b]||b};\nSocialCalc.Formula.SeriesFunctions=function(a,c,b,d){var e,f;e=SocialCalc.Formula;for(var g=e.OperandValueAndType,l=e.LookupResultType,h=e.TypeLookupTable.plus,m=function(a,b){c.push({type:a,value:b})},p=0,r=\"\",q=0,n=0,s=0,t=1,u,w,v,x,y,z;0<b.length;)e=g(d,b),f=e.type.charAt(0),\"n\"==f&&(q+=1),\"b\"!=f&&(n+=1),\"b\"==f&&(s+=1),\"n\"==f?(f=e.value-0,p+=f,t*=f,u=void 0!=u?f>u?f:u:f,w=void 0!=w?f<w?f:w:f,1==q?(y=f,z=0):(v=y+(f-y)/q,z=x=z+(f-y)*(f-v),y=v),r=l(e.type,r||e.type,h)):\"e\"==f&&\"e\"!=r.charAt(0)&&(r=\ne.type);r=r||\"n\";switch(a){case \"SUM\":m(r,p);break;case \"PRODUCT\":m(r,t);break;case \"MIN\":m(r,w||0);break;case \"MAX\":m(r,u||0);break;case \"COUNT\":m(\"n\",q);break;case \"COUNTA\":m(\"n\",n);break;case \"COUNTBLANK\":m(\"n\",s);break;case \"AVERAGE\":0<q?m(r,p/q):m(\"e#DIV/0!\",0);break;case \"STDEV\":1<q?m(r,Math.sqrt(x/(q-1))):m(\"e#DIV/0!\",0);break;case \"STDEVP\":1<q?m(r,Math.sqrt(x/q)):m(\"e#DIV/0!\",0);break;case \"VAR\":1<q?m(r,x/(q-1)):m(\"e#DIV/0!\",0);break;case \"VARP\":1<q?m(r,x/q):m(\"e#DIV/0!\",0)}return null};\nSocialCalc.Formula.FunctionList.AVERAGE=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.COUNT=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.COUNTA=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.COUNTBLANK=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.MAX=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];\nSocialCalc.Formula.FunctionList.MIN=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.PRODUCT=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.STDEV=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.STDEVP=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.SUM=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];\nSocialCalc.Formula.FunctionList.VAR=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];SocialCalc.Formula.FunctionList.VARP=[SocialCalc.Formula.SeriesFunctions,-1,\"vn\",null,\"stat\"];\nSocialCalc.Formula.SumProductFunction=function(a,c,b,d){for(var e=[],f=0,g=SocialCalc.Formula,l=0,h=0,m=function(a,b){c.push({type:a,value:b})};0<b.length;){a=g.TopOfStackValueAndType(d,b);if(\"range\"!=a.type){m(\"e#VALUE!\",0);return}rangeinfo=g.DecodeRangeParts(d,a.value);if(!l)l=rangeinfo.ncols;else if(l!=rangeinfo.ncols){m(\"e#VALUE!\",0);return}if(!h)h=rangeinfo.nrows;else if(h!=rangeinfo.nrows){m(\"e#VALUE!\",0);return}for(i=0;i<rangeinfo.ncols;i++)for(j=0;j<rangeinfo.nrows;j++)k=i*rangeinfo.nrows+\nj,cellcr=SocialCalc.crToCoord(rangeinfo.col1num+i,rangeinfo.row1num+j),cell=rangeinfo.sheetdata.GetAssuredCell(cellcr),value=\"n\"==cell.valuetype?cell.datavalue:0,e[k]=(e[k]||1)*value}for(i=0;i<e.length;i++)f+=e[i];m(\"n\",f)};SocialCalc.Formula.FunctionList.SUMPRODUCT=[SocialCalc.Formula.SumProductFunction,-1,\"rangen\",\"\",\"stat\"];\nSocialCalc.Formula.DSeriesFunctions=function(a,c,b,d){var e,f,g,l,h,m,p,r,q=SocialCalc.Formula,n=q.LookupResultType,s=q.TypeLookupTable.plus,t=function(a,b){c.push({type:a,value:b})};f=e=void 0;var u=0,w=\"\",v=0,x=0,y=1,z,C,D,G,I;g=q.TopOfStackValueAndType(d,b);l=q.OperandValueAndType(d,b);h=q.TopOfStackValueAndType(d,b);if(\"range\"!=g.type||\"range\"!=h.type)return q.FunctionArgsError(a,c);b=q.DecodeRangeParts(d,g.value);d=q.DecodeRangeParts(d,h.value);l=q.FieldToColnum(b.sheetdata,b.col1num,b.ncols,\nb.row1num,l.value,l.type);if(0>=l)t(\"e#VALUE!\",0);else{l=b.col1num+l-1;h=[];for(g=0;g<d.ncols;g++){m=d.sheetdata.GetAssuredCell(SocialCalc.crToCoord(d.col1num+g,d.row1num));criterianum=q.FieldToColnum(b.sheetdata,b.col1num,b.ncols,b.row1num,m.datavalue,m.valuetype);if(0>=criterianum){t(\"e#VALUE!\",0);return}h.push(b.col1num+criterianum-1)}for(g=1;g<b.nrows;g++){p=!1;e=1;a:for(;e<d.nrows;e++){for(f=0;f<d.ncols;f++)if(r=SocialCalc.crToCoord(d.col1num+f,d.row1num+e),m=d.sheetdata.GetAssuredCell(r),r=\nm.datavalue,\"string\"!=typeof r||0!=r.length)if(m=h[f],m=SocialCalc.crToCoord(m,b.row1num+g),m=d.sheetdata.GetAssuredCell(m),!q.TestCriteria(m.datavalue,m.valuetype||\"b\",r))continue a;p=!0;break a}p&&(e=SocialCalc.crToCoord(l,b.row1num+g),m=b.sheetdata.GetAssuredCell(e),e=m.datavalue,f=m.valuetype,p=f.charAt(0),\"n\"==p&&(v+=1),\"b\"!=p&&(x+=1),\"n\"==p?(v1=e-0,u+=v1,y*=v1,z=void 0!=z?v1>z?v1:z:v1,C=void 0!=C?v1<C?v1:C:v1,1==v?(G=v1,I=0):(e=G+(v1-G)/v,I=D=I+(v1-G)*(v1-e),G=e),w=n(f,w||f,s)):\"e\"==p&&\"e\"!=\nw.charAt(0)&&(w=f))}w=w||\"n\";switch(a){case \"DSUM\":t(w,u);break;case \"DPRODUCT\":t(w,y);break;case \"DMIN\":t(w,C||0);break;case \"DMAX\":t(w,z||0);break;case \"DCOUNT\":t(\"n\",v);break;case \"DCOUNTA\":t(\"n\",x);break;case \"DAVERAGE\":0<v?t(w,u/v):t(\"e#DIV/0!\",0);break;case \"DSTDEV\":1<v?t(w,Math.sqrt(D/(v-1))):t(\"e#DIV/0!\",0);break;case \"DSTDEVP\":1<v?t(w,Math.sqrt(D/v)):t(\"e#DIV/0!\",0);break;case \"DVAR\":1<v?t(w,D/(v-1)):t(\"e#DIV/0!\",0);break;case \"DVARP\":1<v?t(w,D/v):t(\"e#DIV/0!\",0);break;case \"DGET\":1==v?t(w,\nu):0==v?t(\"e#VALUE!\",0):t(\"e#NUM!\",0)}}};SocialCalc.Formula.FunctionList.DAVERAGE=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DCOUNT=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DCOUNTA=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DGET=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];\nSocialCalc.Formula.FunctionList.DMAX=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DMIN=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DPRODUCT=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DSTDEV=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DSTDEVP=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];\nSocialCalc.Formula.FunctionList.DSUM=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DVAR=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.DVARP=[SocialCalc.Formula.DSeriesFunctions,3,\"dfunc\",\"\",\"stat\"];\nSocialCalc.Formula.FieldToColnum=function(a,c,b,d,e,f){var g;if(\"n\"==f.charAt(0))return f=e-0,0>=f||f>b?0:Math.floor(f);if(\"t\"!=f.charAt(0))return 0;e=e?e.toLowerCase():\"\";for(f=0;f<b;f++)if(g=a.GetAssuredCell(SocialCalc.crToCoord(c+f,d)),g=g.datavalue,g=(g+\"\").toLowerCase(),g==e)return f+1;return 0};\nSocialCalc.Formula.LookupFunctions=function(a,c,b,d){var e,f,g,l,h,m,p,r,q,n,s;s=SocialCalc.Formula;e=s.OperandValueAndType;var t=function(a,b){c.push({type:a,value:b})};e=e(d,b);\"string\"==typeof e.value&&(e.value=e.value.toLowerCase());f=s.TopOfStackValueAndType(d,b);g=1;if(\"MATCH\"==a){if(b.length){g=s.OperandAsNumber(d,b);if(\"n\"!=g.type.charAt(0)){t(\"e#VALUE!\",0);return}if(b.length)return s.FunctionArgsError(a,c),0;g=g.value-0}}else{l=s.OperandAsNumber(d,b);if(\"n\"!=l.type.charAt(0)){t(\"e#VALUE!\",\n0);return}l=Math.floor(l.value);if(b.length){g=s.OperandAsNumber(d,b);if(\"n\"!=g.type.charAt(0)){t(\"e#VALUE!\",0);return}if(b.length)return s.FunctionArgsError(a,c),0;g=g.value?1:0}}e.type=e.type.charAt(0);\"n\"==e.type&&(e.value-=0);if(\"range\"!=f.type)return s.FunctionArgsError(a,c),0;if(b=s.DecodeRangeParts(d,f.value,f.type)){m=h=f=d=0;if(\"HLOOKUP\"==a){if(h=1,l>b.nrows){t(\"e#REF!\",0);return}}else if(\"VLOOKUP\"==a){if(m=1,l>b.ncols){t(\"e#REF!\",0);return}}else if(\"MATCH\"==a)if(1<b.ncols){if(1<b.nrows){t(\"e#N/A\",\n0);return}h=1}else m=1;else return s.FunctionArgsError(a,c),0;if(1>l&&\"MATCH\"!=a)return t(\"e#VALUE!\",0),0;for(;;){s=SocialCalc.crToCoord(b.col1num+d,b.row1num+f);n=b.sheetdata.GetAssuredCell(s);s=n.datavalue;n=n.valuetype?n.valuetype.charAt(0):\"b\";\"n\"==n&&(s-=0);if(g)if(\"n\"==e.type&&\"n\"==n){if(e.value==s)break;if(0<g&&e.value>s||0>g&&e.value<s)p=1,r=d,q=f;else if(p){p=2;break}}else{if(\"t\"==e.type&&\"t\"==n){s=\"string\"==typeof s?s.toLowerCase():\"\";if(e.value==s)break;if(0<g&&e.value>s||0>g&&e.value<\ns)p=1,r=d,q=f;else if(p){p=2;break}}}else if(\"n\"==e.type&&\"n\"==n){if(e.value==s)break}else if(\"t\"==e.type&&\"t\"==n&&(s=\"string\"==typeof s?s.toLowerCase():\"\",e.value==s))break;f+=m;d+=h;if(f>=b.nrows||d>=b.ncols){if(p){p=2;break}t(\"e#N/A\",0);return}}2==p&&(f=q,d=r);\"MATCH\"==a?(s=d+f+1,n=\"n\"):(s=SocialCalc.crToCoord(b.col1num+d+(\"VLOOKUP\"==a?l-1:0),b.row1num+f+(\"HLOOKUP\"==a?l-1:0)),n=b.sheetdata.GetAssuredCell(s),s=n.datavalue,n=n.valuetype);t(n,s)}else t(\"e#REF!\",0)};\nSocialCalc.Formula.FunctionList.HLOOKUP=[SocialCalc.Formula.LookupFunctions,-3,\"hlookup\",\"\",\"lookup\"];SocialCalc.Formula.FunctionList.MATCH=[SocialCalc.Formula.LookupFunctions,-2,\"match\",\"\",\"lookup\"];SocialCalc.Formula.FunctionList.VLOOKUP=[SocialCalc.Formula.LookupFunctions,-3,\"vlookup\",\"\",\"lookup\"];\nSocialCalc.Formula.IndexFunction=function(a,c,b,d){var e,f,g,l,h=SocialCalc.Formula,m=function(a,b){c.push({type:a,value:b})};e=h.TopOfStackValueAndType(d,b);if(\"range\"!=e.type)return h.FunctionArgsError(a,c),0;f=h.DecodeRangeParts(d,e.value,e.type);e=f.sheetname?\"!\"+f.sheetname:\"\";g={value:0};l={value:0};if(b.length){g=h.OperandAsNumber(d,b);if(\"n\"!=g.type.charAt(0)||0>g.value){m(\"e#VALUE!\",0);return}if(b.length){l=h.OperandAsNumber(d,b);if(\"n\"!=l.type.charAt(0)||0>l.value){m(\"e#VALUE!\",0);return}if(b.length)return h.FunctionArgsError(a,\nc),0}else 1==f.nrows&&(l.value=g.value,g.value=0)}g.value>f.nrows||l.value>f.ncols?m(\"e#REF!\",0):(0==g.value?0==l.value?1==f.nrows&&1==f.ncols?(a=SocialCalc.crToCoord(f.col1num,f.row1num)+e,b=\"coord\"):(a=SocialCalc.crToCoord(f.col1num,f.row1num)+e+\"|\"+SocialCalc.crToCoord(f.col1num+f.ncols-1,f.row1num+f.nrows-1)+\"|\",b=\"range\"):1==f.nrows?(a=SocialCalc.crToCoord(f.col1num+l.value-1,f.row1num)+e,b=\"coord\"):(a=SocialCalc.crToCoord(f.col1num+l.value-1,f.row1num)+e+\"|\"+SocialCalc.crToCoord(f.col1num+l.value-\n1,f.row1num+f.nrows-1)+\"|\",b=\"range\"):0==l.value?1==f.ncols?(a=SocialCalc.crToCoord(f.col1num,f.row1num+g.value-1)+e,b=\"coord\"):(a=SocialCalc.crToCoord(f.col1num,f.row1num+g.value-1)+e+\"|\"+SocialCalc.crToCoord(f.col1num+f.ncols-1,f.row1num+g.value-1)+\"|\",b=\"range\"):(a=SocialCalc.crToCoord(f.col1num+l.value-1,f.row1num+g.value-1)+e,b=\"coord\"),m(b,a))};SocialCalc.Formula.FunctionList.INDEX=[SocialCalc.Formula.IndexFunction,-1,\"index\",\"\",\"lookup\"];\nSocialCalc.Formula.CountifSumifFunctions=function(a,c,b,d){var e,f,g,l,h=0,m=\"\",p=0,r=SocialCalc.Formula,q=r.OperandValueAndType,n=r.LookupResultType,s=r.TypeLookupTable.plus;e=r.TopOfStackValueAndType(d,b);f=r.OperandAsText(d,b);if(\"SUMIF\"==a)if(1==b.length)g=r.TopOfStackValueAndType(d,b);else if(0==b.length)g={value:e.value,type:e.type};else return r.FunctionArgsError(a,c),0;else g={value:e.value,type:e.type};\"n\"==f.type.charAt(0)?f.value+=\"\":\"e\"==f.type.charAt(0)?f.value=null:\"b\"==f.type.charAt(0)&&\n(f.value=null);if(\"coord\"!=e.type&&\"range\"!=e.type||\"SUMIF\"==a&&\"coord\"!=g.type&&\"range\"!=g.type)return r.FunctionArgsError(a,c),0;b.push(e);e=[];for(e.push(g);b.length;)g=q(d,b),l=q(d,e),r.TestCriteria(g.value,g.type,f.value)&&(p+=1,\"n\"==l.type.charAt(0)?(h+=l.value-0,m=n(l.type,m||l.type,s)):\"e\"==l.type.charAt(0)&&\"e\"!=m.charAt(0)&&(m=l.type));\"SUMIF\"==a?c.push({type:m||\"n\",value:h}):\"COUNTIF\"==a&&c.push({type:\"n\",value:p})};\nSocialCalc.Formula.FunctionList.COUNTIF=[SocialCalc.Formula.CountifSumifFunctions,2,\"rangec\",\"\",\"stat\"];SocialCalc.Formula.FunctionList.SUMIF=[SocialCalc.Formula.CountifSumifFunctions,-2,\"sumif\",\"\",\"stat\"];\nSocialCalc.Formula.SumifsFunction=function(a,c,b,d){var e,f,g,l=0,h=\"\",m=SocialCalc.Formula,p=m.OperandValueAndType,r=m.LookupResultType,q=m.TypeLookupTable.plus;g=m.TopOfStackValueAndType(d,b);if(\"coord\"!=g.type&&\"range\"!=g.type)return m.FunctionArgsError(a,c),0;for(var n=[],s=[];b.length;){e=m.TopOfStackValueAndType(d,b);f=m.OperandAsText(d,b);\"n\"==f.type.charAt(0)?f.value+=\"\":\"e\"==f.type.charAt(0)?f.value=null:\"b\"==f.type.charAt(0)&&(f.value=null);if(\"coord\"!=e.type&&\"range\"!=e.type)return m.FunctionArgsError(a,\nc),0;n.push([e]);s.push(f)}a=[];for(a.push(g);a.length;){b=p(d,a);e=!0;for(f=0;f<n.length;f++)if(g=p(d,n[f]),!m.TestCriteria(g.value,g.type,s[f].value)){e=!1;break}e&&(\"n\"==b.type.charAt(0)?(l+=b.value-0,h=r(b.type,h||b.type,q)):\"e\"==b.type.charAt(0)&&\"e\"!=h.charAt(0)&&(h=b.type))}c.push({type:h||\"n\",value:l})};SocialCalc.Formula.FunctionList.SUMIFS=[SocialCalc.Formula.SumifsFunction,-3,\"sumifs\",\"\",\"stat\"];\nSocialCalc.Formula.IfFunction=function(a,c,b,d){var e;d=SocialCalc.Formula.OperandValueAndType(d,b);e=d.type.charAt(0);if(\"n\"!=e&&\"b\"!=e)c.push({type:\"e#VALUE!\",value:0});else{e=b.pop();if(1==b.length)a=b.pop();else if(0==b.length)a={type:\"n\",value:0};else{scf.FunctionArgsError(a,c);return}c.push(d.value?e:a)}};SocialCalc.Formula.FunctionList.IF=[SocialCalc.Formula.IfFunction,-2,\"iffunc\",\"\",\"test\"];\nSocialCalc.Formula.DateFunction=function(a,c,b,d){a=SocialCalc.Formula;var e=0,f=a.OperandAsNumber(d,b),g=a.OperandAsNumber(d,b);b=a.OperandAsNumber(d,b);d=a.LookupResultType(f.type,g.type,a.TypeLookupTable.twoargnumeric);d=a.LookupResultType(d,b.type,a.TypeLookupTable.twoargnumeric);\"n\"==d.charAt(0)&&(e=SocialCalc.FormatNumber.convert_date_gregorian_to_julian(Math.floor(f.value),Math.floor(g.value),Math.floor(b.value))-SocialCalc.FormatNumber.datevalues.julian_offset,d=\"nd\");a.PushOperand(c,d,e)};\nSocialCalc.Formula.FunctionList.DATE=[SocialCalc.Formula.DateFunction,3,\"date\",\"\",\"datetime\"];SocialCalc.Formula.TimeFunction=function(a,c,b,d){a=SocialCalc.Formula;var e=0,f=a.OperandAsNumber(d,b),g=a.OperandAsNumber(d,b);b=a.OperandAsNumber(d,b);d=a.LookupResultType(f.type,g.type,a.TypeLookupTable.twoargnumeric);d=a.LookupResultType(d,b.type,a.TypeLookupTable.twoargnumeric);\"n\"==d.charAt(0)&&(e=(3600*f.value+60*g.value+b.value)/86400,d=\"nt\");a.PushOperand(c,d,e)};\nSocialCalc.Formula.FunctionList.TIME=[SocialCalc.Formula.TimeFunction,3,\"hms\",\"\",\"datetime\"];\nSocialCalc.Formula.DMYFunctions=function(a,c,b,d){var e,f=SocialCalc.Formula,g=0,l=f.OperandAsNumber(d,b),h=f.LookupResultType(l.type,l.type,f.TypeLookupTable.oneargnumeric);if(\"n\"==h.charAt(0))switch(e=SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(l.value+SocialCalc.FormatNumber.datevalues.julian_offset)),a){case \"DAY\":g=e.day;break;case \"MONTH\":g=e.month;break;case \"YEAR\":g=e.year;break;case \"WEEKDAY\":e={value:1};if(b.length){e=f.OperandAsNumber(d,b);if(\"n\"!=e.type.charAt(0)||\n1>e.value||3<e.value){f.PushOperand(c,\"e#VALUE!\",0);return}if(b.length){f.FunctionArgsError(a,c);return}}a=6;1<e.value&&--a;g=Math.floor(l.value+a)%7+(3>e.value?1:0)}f.PushOperand(c,h,g)};SocialCalc.Formula.FunctionList.DAY=[SocialCalc.Formula.DMYFunctions,1,\"v\",\"\",\"datetime\"];SocialCalc.Formula.FunctionList.MONTH=[SocialCalc.Formula.DMYFunctions,1,\"v\",\"\",\"datetime\"];SocialCalc.Formula.FunctionList.YEAR=[SocialCalc.Formula.DMYFunctions,1,\"v\",\"\",\"datetime\"];\nSocialCalc.Formula.FunctionList.WEEKDAY=[SocialCalc.Formula.DMYFunctions,-1,\"weekday\",\"\",\"datetime\"];\nSocialCalc.Formula.HMSFunctions=function(a,c,b,d){var e,f=SocialCalc.Formula,g=0,l=f.OperandAsNumber(d,b),h=f.LookupResultType(l.type,l.type,f.TypeLookupTable.oneargnumeric);if(\"n\"==h.charAt(0)){if(0>l.value){f.PushOperand(c,\"e#NUM!\",0);return}e=l.value-Math.floor(l.value);e*=24;b=Math.floor(e);e-=Math.floor(e);e*=60;d=Math.floor(e);e-=Math.floor(e);e=Math.floor(60*e+(0<=l.value?.5:-.5));\"HOUR\"==a?g=b:\"MINUTE\"==a?g=d:\"SECOND\"==a&&(g=e)}f.PushOperand(c,h,g)};\nSocialCalc.Formula.FunctionList.HOUR=[SocialCalc.Formula.HMSFunctions,1,\"v\",\"\",\"datetime\"];SocialCalc.Formula.FunctionList.MINUTE=[SocialCalc.Formula.HMSFunctions,1,\"v\",\"\",\"datetime\"];SocialCalc.Formula.FunctionList.SECOND=[SocialCalc.Formula.HMSFunctions,1,\"v\",\"\",\"datetime\"];\nSocialCalc.Formula.ExactFunction=function(a,c,b,d){a=SocialCalc.Formula;var e=0,f=\"nl\",g=a.OperandValueAndType(d,b),l=g.type.charAt(0);b=a.OperandValueAndType(d,b);d=b.type.charAt(0);\"t\"==l?\"t\"==d?e=g.value==b.value?1:0:\"b\"==d?e=g.value.length?0:1:\"n\"==d?e=g.value==b.value+\"\"?1:0:\"e\"==d?(e=b.value,f=b.type):e=0:\"n\"==l?\"n\"==d?e=g.value-0==b.value-0?1:0:\"b\"==d?e=0:\"t\"==d?e=g.value+\"\"==b.value?1:0:\"e\"==d?(e=b.value,f=b.type):e=0:\"b\"==l?\"t\"==d?e=b.value.length?0:1:\"b\"==d?e=1:\"n\"==d?e=0:\"e\"==d?(e=b.value,\nf=b.type):e=0:\"e\"==l&&(e=g.value,f=g.type);a.PushOperand(c,f,e)};SocialCalc.Formula.FunctionList.EXACT=[SocialCalc.Formula.ExactFunction,2,\"\",\"\",\"text\"];SocialCalc.Formula.ArgList={FIND:[1,1,0],LEFT:[1,0],LEN:[1],LOWER:[1],MID:[1,0,0],PROPER:[1],REPLACE:[1,0,0,1],REPT:[1,0],RIGHT:[1,0],SUBSTITUTE:[1,1,1,0],TRIM:[1],HEXCODE:[1],UPPER:[1]};\nSocialCalc.Formula.StringFunctions=function(a,c,b,d){var e,f,g,l=SocialCalc.Formula;g=0;var h=\"e#VALUE!\",m=b.length,p=l.ArgList[a],r=[],q=[];for(e=1;e<=m;e++){if(e>p.length){l.FunctionArgsError(a,c);return}0==p[e-1]?f=l.OperandAsNumber(d,b):1==p[e-1]?f=l.OperandAsText(d,b):-1==p[e-1]&&(f=l.OperandValueAndType(d,b));r[e]=f.value;q[e]=f.type;if(\"e\"==f.type.charAt(0)){l.PushOperand(c,f.type,g);return}}switch(a){case \"FIND\":g=q[3]?r[3]-1:0;0>g?g=\"Start is before string\":(g=r[2].indexOf(r[1],g),0<=g?(g+=\n1,h=\"n\"):g=\"Not found\");break;case \"LEFT\":g=q[2]?r[2]-0:1;0>g?g=\"Negative length\":(g=r[1].substring(0,g),h=\"t\");break;case \"LEN\":g=r[1].length;h=\"n\";break;case \"LOWER\":g=r[1].toLowerCase();h=\"t\";break;case \"MID\":a=r[2]-0;g=r[3]-0;1>g||1>a?g=\"Bad arguments\":(g=r[1].substring(a-1,a+g-1),h=\"t\");break;case \"PROPER\":g=r[1].replace(/\\b\\w+\\b/g,function(a){return a.substring(0,1).toUpperCase()+a.substring(1)});h=\"t\";break;case \"REPLACE\":a=r[2]-0;g=r[3]-0;0>g||1>a?g=\"Bad arguments\":(g=r[1].substring(0,a-1)+\nr[4]+r[1].substring(a-1+g),h=\"t\");break;case \"REPT\":a=r[2]-0;if(0>a)g=\"Negative count\";else{for(g=\"\";0<a;a--)g+=r[1];h=\"t\"}break;case \"RIGHT\":g=q[2]?r[2]-0:1;0>g?g=\"Negative length\":(g=r[1].slice(-g),h=\"t\");break;case \"SUBSTITUTE\":fulltext=r[1];oldtext=r[2];newtext=r[3];if(null!=r[4]){if(which=r[4]-0,0>=which){g=\"Non-positive instance number\";break}}else which=0;oldpos=a=0;for(g=\"\";;)if(pos=fulltext.indexOf(oldtext,oldpos),0<=pos){a++;g+=fulltext.substring(oldpos,pos);if(0==which)g+=newtext;else if(which==\na){g+=newtext+fulltext.substring(pos+oldtext.length);break}else g+=oldtext;oldpos=pos+oldtext.length}else{g+=fulltext.substring(oldpos);break}h=\"t\";break;case \"TRIM\":g=r[1];g=g.replace(/^ */,\"\");g=g.replace(/ *$/,\"\");g=g.replace(/ +/g,\" \");h=\"t\";break;case \"HEXCODE\":g=String(r[1]);h=g.charCodeAt(0);55296<=h&&56319>=h&&(r=g.charCodeAt(1),56320<=r&&57343>=r&&(h=1024*(h-55296)+(r-56320)+65536));g=h.toString(16).toUpperCase();h=\"t\";break;case \"UPPER\":g=r[1].toUpperCase(),h=\"t\"}l.PushOperand(c,h,g)};\nSocialCalc.Formula.FunctionList.FIND=[SocialCalc.Formula.StringFunctions,-2,\"find\",\"\",\"text\"];SocialCalc.Formula.FunctionList.LEFT=[SocialCalc.Formula.StringFunctions,-2,\"tc\",\"\",\"text\"];SocialCalc.Formula.FunctionList.LEN=[SocialCalc.Formula.StringFunctions,1,\"txt\",\"\",\"text\"];SocialCalc.Formula.FunctionList.LOWER=[SocialCalc.Formula.StringFunctions,1,\"txt\",\"\",\"text\"];SocialCalc.Formula.FunctionList.MID=[SocialCalc.Formula.StringFunctions,3,\"mid\",\"\",\"text\"];\nSocialCalc.Formula.FunctionList.PROPER=[SocialCalc.Formula.StringFunctions,1,\"v\",\"\",\"text\"];SocialCalc.Formula.FunctionList.REPLACE=[SocialCalc.Formula.StringFunctions,4,\"replace\",\"\",\"text\"];SocialCalc.Formula.FunctionList.REPT=[SocialCalc.Formula.StringFunctions,2,\"tc\",\"\",\"text\"];SocialCalc.Formula.FunctionList.RIGHT=[SocialCalc.Formula.StringFunctions,-1,\"tc\",\"\",\"text\"];SocialCalc.Formula.FunctionList.SUBSTITUTE=[SocialCalc.Formula.StringFunctions,-3,\"subs\",\"\",\"text\"];\nSocialCalc.Formula.FunctionList.TRIM=[SocialCalc.Formula.StringFunctions,1,\"v\",\"\",\"text\"];SocialCalc.Formula.FunctionList.HEXCODE=[SocialCalc.Formula.StringFunctions,1,\"v\",\"\",\"text\"];SocialCalc.Formula.FunctionList.UPPER=[SocialCalc.Formula.StringFunctions,1,\"v\",\"\",\"text\"];\nSocialCalc.Formula.IsFunctions=function(a,c,b,d){var e=SocialCalc.Formula,f=0;b=e.OperandValueAndType(d,b);d=b.type.charAt(0);switch(a){case \"ISBLANK\":f=\"b\"==b.type?1:0;break;case \"ISERR\":f=\"e\"==d?\"e#N/A\"==b.type?0:1:0;break;case \"ISERROR\":f=\"e\"==d?1:0;break;case \"ISLOGICAL\":f=\"nl\"==b.type?1:0;break;case \"ISNA\":f=\"e#N/A\"==b.type?1:0;break;case \"ISNONTEXT\":f=\"t\"==d?0:1;break;case \"ISNUMBER\":f=\"n\"==d?1:0;break;case \"ISTEXT\":f=\"t\"==d?1:0}e.PushOperand(c,\"nl\",f)};\nSocialCalc.Formula.FunctionList.ISBLANK=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];SocialCalc.Formula.FunctionList.ISERR=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];SocialCalc.Formula.FunctionList.ISERROR=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];SocialCalc.Formula.FunctionList.ISLOGICAL=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];SocialCalc.Formula.FunctionList.ISNA=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];\nSocialCalc.Formula.FunctionList.ISNONTEXT=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];SocialCalc.Formula.FunctionList.ISNUMBER=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];SocialCalc.Formula.FunctionList.ISTEXT=[SocialCalc.Formula.IsFunctions,1,\"v\",\"\",\"test\"];\nSocialCalc.Formula.NTVFunctions=function(a,c,b,d){var e=SocialCalc.Formula,f=0,g=\"e#VALUE!\";b=e.OperandValueAndType(d,b);d=b.type.charAt(0);switch(a){case \"N\":f=\"n\"==d?b.value-0:0;g=\"n\";break;case \"T\":f=\"t\"==d?b.value+\"\":\"\";g=\"t\";break;case \"VALUE\":\"n\"==d||\"b\"==d?(f=b.value||0,g=\"n\"):\"t\"==d&&(b=SocialCalc.DetermineValueType(b.value),\"n\"!=b.type.charAt(0)?(f=0,g=\"e#VALUE!\"):(f=b.value-0,g=\"n\"))}\"e\"==d&&(g=b.type);e.PushOperand(c,g,f)};\nSocialCalc.Formula.FunctionList.N=[SocialCalc.Formula.NTVFunctions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.T=[SocialCalc.Formula.NTVFunctions,1,\"v\",\"\",\"text\"];SocialCalc.Formula.FunctionList.VALUE=[SocialCalc.Formula.NTVFunctions,1,\"v\",\"\",\"text\"];\nSocialCalc.Formula.Math1Functions=function(a,c,b,d){var e={},f=SocialCalc.Formula;d=f.OperandAsNumber(d,b);b=d.value;e.type=f.LookupResultType(d.type,d.type,f.TypeLookupTable.oneargnumeric);if(\"n\"==e.type)switch(a){case \"ABS\":b=Math.abs(b);break;case \"ACOS\":-1<=b&&1>=b?b=Math.acos(b):e.type=\"e#NUM!\";break;case \"ASIN\":-1<=b&&1>=b?b=Math.asin(b):e.type=\"e#NUM!\";break;case \"ATAN\":b=Math.atan(b);break;case \"COS\":b=Math.cos(b);break;case \"DEGREES\":b=180*b/Math.PI;break;case \"EVEN\":b=0>b?-b:b;b=b!=Math.floor(b)?\nMath.floor(b+1)+Math.floor(b+1)%2:b+b%2;0>d.value&&(b=-b);break;case \"EXP\":b=Math.exp(b);break;case \"FACT\":a=1;for(b=Math.floor(b);0<b;b--)a*=b;b=a;break;case \"INT\":b=Math.floor(b);break;case \"LN\":0>=b&&(e.type=\"e#NUM!\",e.error=SocialCalc.Constants.s_sheetfunclnarg);b=Math.log(b);break;case \"LOG10\":0>=b&&(e.type=\"e#NUM!\",e.error=SocialCalc.Constants.s_sheetfunclog10arg);b=Math.log(b)/Math.log(10);break;case \"ODD\":b=0>b?-b:b;b=b!=Math.floor(b)?Math.floor(b+1)+(1-Math.floor(b+1)%2):b+(1-b%2);0>d.value&&\n(b=-b);break;case \"RADIANS\":b=b*Math.PI/180;break;case \"SIN\":b=Math.sin(b);break;case \"SQRT\":0<=b?b=Math.sqrt(b):e.type=\"e#NUM!\";break;case \"TAN\":0!=Math.cos(b)?b=Math.tan(b):e.type=\"e#NUM!\"}e.value=b;c.push(e);return null};SocialCalc.Formula.FunctionList.ABS=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.ACOS=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.ASIN=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];\nSocialCalc.Formula.FunctionList.ATAN=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.COS=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.DEGREES=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.EVEN=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.EXP=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];\nSocialCalc.Formula.FunctionList.FACT=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.INT=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.LN=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.LOG10=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.ODD=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];\nSocialCalc.Formula.FunctionList.RADIANS=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.SIN=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.SQRT=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];SocialCalc.Formula.FunctionList.TAN=[SocialCalc.Formula.Math1Functions,1,\"v\",\"\",\"math\"];\nSocialCalc.Formula.Math2Functions=function(a,c,b,d){var e,f,g={};f=SocialCalc.Formula;e=f.OperandAsNumber(d,b);b=f.OperandAsNumber(d,b);g.type=f.LookupResultType(e.type,b.type,f.TypeLookupTable.twoargnumeric);if(\"n\"==g.type)switch(a){case \"ATAN2\":0==e.value&&0==b.value?g.type=\"e#DIV/0!\":g.value=Math.atan2(b.value,e.value);break;case \"POWER\":g.value=Math.pow(e.value,b.value);isNaN(g.value)&&(g.value=0,g.type=\"e#NUM!\");break;case \"MOD\":0==b.value?g.type=\"e#DIV/0!\":(a=e.value/b.value,a=Math.floor(a),\ng.value=e.value-a*b.value);break;case \"TRUNC\":a=1;if(0<=b.value){b.value=Math.floor(b.value);for(f=0;f<b.value;f++)a*=10;g.value=Math.floor(Math.abs(e.value)*a)/a}else if(0>b.value){b.value=Math.floor(-b.value);for(f=0;f<b.value;f++)a*=10;g.value=Math.floor(Math.abs(e.value)/a)*a}0>e.value&&(g.value=-g.value)}c.push(g);return null};SocialCalc.Formula.FunctionList.ATAN2=[SocialCalc.Formula.Math2Functions,2,\"xy\",\"\",\"math\"];\nSocialCalc.Formula.FunctionList.MOD=[SocialCalc.Formula.Math2Functions,2,\"\",\"\",\"math\"];SocialCalc.Formula.FunctionList.POWER=[SocialCalc.Formula.Math2Functions,2,\"\",\"\",\"math\"];SocialCalc.Formula.FunctionList.TRUNC=[SocialCalc.Formula.Math2Functions,2,\"valpre\",\"\",\"math\"];\nSocialCalc.Formula.LogFunction=function(a,c,b,d){var e,f={},g=SocialCalc.Formula;f.value=0;e=g.OperandAsNumber(d,b);f.type=g.LookupResultType(e.type,e.type,g.TypeLookupTable.oneargnumeric);if(1==b.length){if(b=g.OperandAsNumber(d,b),\"n\"!=b.type.charAt(0)||0>=b.value)return g.FunctionSpecificError(a,c,\"e#NUM!\",SocialCalc.Constants.s_sheetfunclogsecondarg),0}else{if(0!=b.length)return g.FunctionArgsError(a,c),0;b={value:Math.E,type:\"n\"}}if(\"n\"==f.type){if(0>=e.value)return g.FunctionSpecificError(a,\nc,\"e#NUM!\",SocialCalc.Constants.s_sheetfunclogfirstarg),0;f.value=Math.log(e.value)/Math.log(b.value)}c.push(f)};SocialCalc.Formula.FunctionList.LOG=[SocialCalc.Formula.LogFunction,-1,\"log\",\"\",\"math\"];\nSocialCalc.Formula.RoundFunction=function(a,c,b,d){var e,f,g=SocialCalc.Formula;f=0;var l=\"e#VALUE!\";e=g.OperandValueAndType(d,b);l=g.LookupResultType(e.type,e.type,g.TypeLookupTable.oneargnumeric);if(1==b.length){if(b=g.OperandValueAndType(d,b),\"n\"!=b.type.charAt(0))return g.FunctionSpecificError(a,c,\"e#NUM!\",SocialCalc.Constants.s_sheetfuncroundsecondarg),0}else{if(0!=b.length)return g.FunctionArgsError(a,c),0;b={value:0,type:\"n\"}}if(\"n\"==l)if(b.value-=0,0==b.value)f=Math.round(e.value);else if(0<\nb.value){a=1;b.value=Math.floor(b.value);for(f=0;f<b.value;f++)a*=10;e=Math.round(e.value*a);f=e/a}else if(0>b.value){a=1;b.value=Math.floor(-b.value);for(f=0;f<b.value;f++)a*=10;e=Math.round(e.value/a);f=e*a}g.PushOperand(c,l,f)};SocialCalc.Formula.FunctionList.ROUND=[SocialCalc.Formula.RoundFunction,-1,\"vp\",\"\",\"math\"];\nSocialCalc.Formula.CeilingFloorFunctions=function(a,c,b,d){var e=SocialCalc.Formula,f,g,l=function(a,b){c.push({type:a,value:b})};f=e.OperandValueAndType(d,b);g=f.type.charAt(0);if(\"n\"!=g)l(\"e#VALUE!\",0);else if(0==f.value)l(\"n\",0);else{if(1==b.length){if(b=e.OperandValueAndType(d,b),g=f.type.charAt(0),\"n\"!=g){l(\"e#VALUE!\",0);return}}else if(0==b.length)b={type:\"n\",value:0<f.value?1:-1};else{l(\"e#VALUE!\",0);return}if(0==b.value)l(\"n\",0);else if(0>b.value*f.value)l(\"e#NUM!\",0);else switch(a){case \"CEILING\":l(\"n\",\nMath.ceil(f.value/b.value)*b.value);break;case \"FLOOR\":l(\"n\",Math.floor(f.value/b.value)*b.value)}}};SocialCalc.Formula.FunctionList.CEILING=[SocialCalc.Formula.CeilingFloorFunctions,-1,\"vsig\",\"\",\"math\"];SocialCalc.Formula.FunctionList.FLOOR=[SocialCalc.Formula.CeilingFloorFunctions,-1,\"vsig\",\"\",\"math\"];\nSocialCalc.Formula.AndOrFunctions=function(a,c,b,d){var e,f,g=SocialCalc.Formula,l=\"\";for(\"AND\"==a?f=1:\"OR\"==a&&(f=0);b.length;)e=g.OperandValueAndType(d,b),\"n\"==e.type.charAt(0)?(e.value-=0,\"AND\"==a?f=0!=e.value?f:0:\"OR\"==a&&(f=0!=e.value?1:f),l=g.LookupResultType(e.type,l||\"nl\",g.TypeLookupTable.propagateerror)):\"e\"==e.type.charAt(0)&&\"e\"!=l.charAt(0)&&(l=e.type);1>l.length&&(l=\"e#VALUE!\",f=0);g.PushOperand(c,l,f)};\nSocialCalc.Formula.FunctionList.AND=[SocialCalc.Formula.AndOrFunctions,-1,\"vn\",\"\",\"test\"];SocialCalc.Formula.FunctionList.OR=[SocialCalc.Formula.AndOrFunctions,-1,\"vn\",\"\",\"test\"];SocialCalc.Formula.NotFunction=function(a,c,b,d){a=0;var e=SocialCalc.Formula;b=e.OperandValueAndType(d,b);d=e.LookupResultType(b.type,b.type,e.TypeLookupTable.propagateerror);\"n\"==b.type.charAt(0)||\"b\"==b.type?(a=0!=b.value-0?0:1,d=\"nl\"):\"t\"==b.type.charAt(0)&&(d=\"e#VALUE!\");e.PushOperand(c,d,a)};\nSocialCalc.Formula.FunctionList.NOT=[SocialCalc.Formula.NotFunction,1,\"v\",\"\",\"test\"];SocialCalc.Formula.ChooseFunction=function(a,c,b,d){var e,f,g=0,l=SocialCalc.Formula,h=l.OperandAsNumber(d,b);\"n\"!=h.type.charAt(0)&&(h.value=0);h.value=Math.floor(h.value);for(a=0;b.length;)if(f=l.TopOfStackValueAndType(d,b),a+=1,h.value==a){g=f.value;e=f.type;break}e?l.PushOperand(c,e,g):l.PushOperand(c,\"e#VALUE!\",0)};SocialCalc.Formula.FunctionList.CHOOSE=[SocialCalc.Formula.ChooseFunction,-2,\"choose\",\"\",\"lookup\"];\nSocialCalc.Formula.ColumnsRowsFunctions=function(a,c,b,d){var e=0,f=SocialCalc.Formula;b=f.TopOfStackValueAndType(d,b);\"coord\"==b.type?(e=1,a=\"n\"):\"range\"==b.type?(d=f.DecodeRangeParts(d,b.value),\"COLUMNS\"==a?e=d.ncols:\"ROWS\"==a&&(e=d.nrows),a=\"n\"):(e=0,a=\"e#VALUE!\");f.PushOperand(c,a,e)};SocialCalc.Formula.FunctionList.COLUMNS=[SocialCalc.Formula.ColumnsRowsFunctions,1,\"range\",\"\",\"lookup\"];SocialCalc.Formula.FunctionList.ROWS=[SocialCalc.Formula.ColumnsRowsFunctions,1,\"range\",\"\",\"lookup\"];\nSocialCalc.Formula.ZeroArgFunctions=function(a,c,b,d){b={value:0};switch(a){case \"FALSE\":b.type=\"nl\";b.value=0;break;case \"NA\":b.type=\"e#N/A\";break;case \"NOW\":a=new Date;d=a.getTimezoneOffset();a=a.getTime()/1E3;b.value=25569+a/86400-d/1440;b.type=\"ndt\";SocialCalc.Formula.FreshnessInfo.volatile.NOW=!0;break;case \"PI\":b.type=\"n\";b.value=Math.PI;break;case \"TODAY\":a=new Date;d=a.getTimezoneOffset();a=a.getTime()/1E3;b.value=Math.floor(25569+a/86400-d/1440);b.type=\"nd\";SocialCalc.Formula.FreshnessInfo.volatile.TODAY=\n!0;break;case \"TRUE\":b.type=\"nl\";b.value=1;break;case \"RAND\":b.type=\"n\",b.value=Math.random(),SocialCalc.Formula.FreshnessInfo.volatile.RAND=!0}c.push(b);return null};SocialCalc.Formula.FunctionList.FALSE=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"test\"];SocialCalc.Formula.FunctionList.NA=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"test\"];SocialCalc.Formula.FunctionList.NOW=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"datetime\"];\nSocialCalc.Formula.FunctionList.RAND=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"math\"];SocialCalc.Formula.FunctionList.PI=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"math\"];SocialCalc.Formula.FunctionList.TODAY=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"datetime\"];SocialCalc.Formula.FunctionList.TRUE=[SocialCalc.Formula.ZeroArgFunctions,0,\"\",\"\",\"test\"];\nSocialCalc.Formula.DDBFunction=function(a,c,b,d){var e,f=SocialCalc.Formula,g=f.OperandAsNumber(d,b),l=f.OperandAsNumber(d,b),h=f.OperandAsNumber(d,b),m=f.OperandAsNumber(d,b);if(!(f.CheckForErrorValue(c,g)||f.CheckForErrorValue(c,l)||f.CheckForErrorValue(c,h)||f.CheckForErrorValue(c,m))){if(1>h.value)return f.FunctionSpecificError(a,c,\"e#NUM!\",SocialCalc.Constants.s_sheetfuncddblife),0;e={value:2,type:\"n\"};0<b.length&&(e=f.OperandAsNumber(d,b));if(0!=b.length)return f.FunctionArgsError(a,c),0;if(!f.CheckForErrorValue(c,\ne)){b=a=0;for(d=1;d<=m.value-0&&d<=h.value;d++)a=e.value/h.value*(g.value-b),g.value-b-a<l.value&&(a=g.value-b-l.value),b+=a;f.PushOperand(c,\"n$\",a)}}};SocialCalc.Formula.FunctionList.DDB=[SocialCalc.Formula.DDBFunction,-4,\"ddb\",\"\",\"financial\"];\nSocialCalc.Formula.SLNFunction=function(a,c,b,d){var e=SocialCalc.Formula,f=e.OperandAsNumber(d,b),g=e.OperandAsNumber(d,b);b=e.OperandAsNumber(d,b);if(!e.CheckForErrorValue(c,f)&&!e.CheckForErrorValue(c,g)&&!e.CheckForErrorValue(c,b)){if(1>b.value)return e.FunctionSpecificError(a,c,\"e#NUM!\",SocialCalc.Constants.s_sheetfuncslnlife),0;a=(f.value-g.value)/b.value;e.PushOperand(c,\"n$\",a)}};SocialCalc.Formula.FunctionList.SLN=[SocialCalc.Formula.SLNFunction,3,\"csl\",\"\",\"financial\"];\nSocialCalc.Formula.SYDFunction=function(a,c,b,d){var e;a=SocialCalc.Formula;e=a.OperandAsNumber(d,b);var f=a.OperandAsNumber(d,b),g=a.OperandAsNumber(d,b);d=a.OperandAsNumber(d,b);if(!(a.CheckForErrorValue(c,e)||a.CheckForErrorValue(c,f)||a.CheckForErrorValue(c,g)||a.CheckForErrorValue(c,d))){if(1>g.value||0>=d.value)return a.PushOperand(c,\"e#NUM!\",0),0;b=(g.value+1)*g.value/2;e=(e.value-f.value)*(g.value-d.value+1)/b;a.PushOperand(c,\"n$\",e)}};\nSocialCalc.Formula.FunctionList.SYD=[SocialCalc.Formula.SYDFunction,4,\"cslp\",\"\",\"financial\"];\nSocialCalc.Formula.InterestFunctions=function(a,c,b,d){var e,f,g,l,h,m,p,r,q,n=SocialCalc.Formula,s=n.OperandAsNumber(d,b);p=n.OperandAsNumber(d,b);m=n.OperandAsNumber(d,b);e=n.LookupResultType(s.type,p.type,n.TypeLookupTable.twoargnumeric);e=n.LookupResultType(e,m.type,n.TypeLookupTable.twoargnumeric);if(b.length&&(g=n.OperandAsNumber(d,b),e=n.LookupResultType(e,g.type,n.TypeLookupTable.twoargnumeric),b.length&&(l=n.OperandAsNumber(d,b),e=n.LookupResultType(e,l.type,n.TypeLookupTable.twoargnumeric),\nb.length))){if(\"RATE\"!=a)return n.FunctionArgsError(a,c),0;h=n.OperandAsNumber(d,b);e=n.LookupResultType(e,h.type,n.TypeLookupTable.twoargnumeric)}if(\"n\"==e)switch(a){case \"FV\":h=s.value;a=p.value;p=m.value;m=null!=g?g.value:0;l=null!=l?l.value?1:0:0;f=g=0==h?-m-p*a:-(m*Math.pow(1+h,a)+p*(1+h*l)*(Math.pow(1+h,a)-1)/h);e=\"n$\";break;case \"NPER\":h=s.value;p=p.value;m=m.value;g=null!=g?g.value:0;l=null!=l?l.value?1:0:0;if(0==h){if(0==p){n.PushOperand(c,\"e#NUM!\",0);return}a=(m+g)/-p}else{r=p*(1+h*l)/h;\nq=m+r;if(0==q||-1>=h){n.PushOperand(c,\"e#NUM!\",0);return}r=(r-g)/q;if(0>=r){n.PushOperand(c,\"e#NUM!\",0);return}r=Math.log(r);q=Math.log(1+h);a=r/q}f=a;e=\"n\";break;case \"PMT\":h=s.value;a=p.value;m=m.value;g=null!=g?g.value:0;l=null!=l?l.value?1:0:0;if(0==a){n.PushOperand(c,\"e#NUM!\",0);return}f=p=0==h?(g-m)/a:(0-g-m*Math.pow(1+h,a))/((1+h*l)*(Math.pow(1+h,a)-1)/h);e=\"n$\";break;case \"PV\":h=s.value;a=p.value;p=m.value;g=null!=g?g.value:0;l=null!=l?l.value?1:0:0;if(-1==h){n.PushOperand(c,\"e#DIV/0!\",0);\nreturn}f=m=0==h?-g-p*a:(-g-p*(1+h*l)*(Math.pow(1+h,a)-1)/h)/Math.pow(1+h,a);e=\"n$\";break;case \"RATE\":a=s.value;p=p.value;m=m.value;g=null!=g?g.value:0;l=null!=l?l.value?1:0:0;h=null!=h?h.value:.1;b=0;delta=1;epsilon=1E-7;for(h=h||1E-8;(0<=delta?delta:-delta)>epsilon&&h!=r;)if(delta=g+m*Math.pow(1+h,a)+p*(1+h*l)*(Math.pow(1+h,a)-1)/h,null!=q?(q=(delta-q)/(h-r)||.001,r=h,h-=delta/q):(r=h,h*=1.1),q=delta,b++,100<=b){n.PushOperand(c,\"e#NUM!\",0);return}f=h;e=\"n%\"}n.PushOperand(c,e,f)};\nSocialCalc.Formula.FunctionList.FV=[SocialCalc.Formula.InterestFunctions,-3,\"fv\",\"\",\"financial\"];SocialCalc.Formula.FunctionList.NPER=[SocialCalc.Formula.InterestFunctions,-3,\"nper\",\"\",\"financial\"];SocialCalc.Formula.FunctionList.PMT=[SocialCalc.Formula.InterestFunctions,-3,\"pmt\",\"\",\"financial\"];SocialCalc.Formula.FunctionList.PV=[SocialCalc.Formula.InterestFunctions,-3,\"pv\",\"\",\"financial\"];SocialCalc.Formula.FunctionList.RATE=[SocialCalc.Formula.InterestFunctions,-3,\"rate\",\"\",\"financial\"];\nSocialCalc.Formula.NPVFunction=function(a,c,b,d){var e,f,g,l,h=SocialCalc.Formula;e=h.OperandAsNumber(d,b);if(!h.CheckForErrorValue(c,e)){f=0;a=\"n\";for(g=1;b.length;)if(l=h.OperandValueAndType(d,b),\"n\"==l.type.charAt(0)){g*=1+e.value;if(0==g){h.PushOperand(c,\"e#DIV/0!\",0);return}f+=l.value/g;a=h.LookupResultType(l.type,a||l.type,h.TypeLookupTable.plus)}else if(\"e\"==l.type.charAt(0)&&\"e\"!=a.charAt(0)){a=l.type;break}\"n\"==a.charAt(0)&&(a=\"n$\");h.PushOperand(c,a,f)}};\nSocialCalc.Formula.FunctionList.NPV=[SocialCalc.Formula.NPVFunction,-2,\"npv\",\"\",\"financial\"];\nSocialCalc.Formula.IRRFunction=function(a,c,b,d){var e,f,g,l;l=[];var h=[],m=SocialCalc.Formula;for(l.push(b.pop());l.length;)if(e=m.OperandValueAndType(d,l),\"n\"==e.type.charAt(0))h.push(e.value);else if(\"e\"==e.type.charAt(0)){m.PushOperand(c,\"e#VALUE!\",0);return}if(h.length){e={value:0};if(b.length){e=m.OperandAsNumber(d,b);if(\"n\"!=e.type.charAt(0)&&\"b\"!=e.type.charAt(0)){m.PushOperand(c,\"e#VALUE!\",0);return}if(b.length){m.FunctionArgsError(a,c);return}}e.value=e.value||.1;a=0;b=e.value;for(d=1;1E-7<\n(0<=d?d:-d)&&b!=g;){d=0;e=1;for(l=0;l<h.length;l++){e*=1+b;if(0==e){m.PushOperand(c,\"e#DIV/0!\",0);return}d+=h[l]/e}null!=f?(f=(d-f)/(b-g),g=b,b-=d/f):(g=b,b*=1.1);f=d;a++;if(20<=a){m.PushOperand(c,\"e#NUM!\",0);return}}m.PushOperand(c,\"n%\",b)}else m.PushOperand(c,\"e#NUM!\",0)};SocialCalc.Formula.FunctionList.IRR=[SocialCalc.Formula.IRRFunction,-1,\"irr\",\"\",\"financial\"];SocialCalc.Formula.SheetCache={sheets:{},waitingForLoading:null,constants:{asloaded:0,recalcing:1,recalcdone:2},loadsheet:null,tiddlersToSheets:{}};\nSocialCalc.Formula.FindInSheetCache=function(a){var c=SocialCalc.Formula.SheetCache,b=SocialCalc.Formula.NormalizeSheetName(a);if(c.sheets[b])return hack.log(\"Found: \"+a,hack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\"),hack.log(\" .name: \"+c.sheets[b].name,hack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\"),hack.log(\" .tiddlerTitle: \"+c.sheets[b].tiddlerTitle,hack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\"),hack.log(\" .recalcstate: \"+c.sheets[b].recalcstate,hack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\"),\nTiddlyWiki?c.tiddlersToSheets[c.sheets[b].tiddlerTitle]:c.sheets[b].sheet;hack.log(\"Not found: \"+a,hack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\");if(c.waitingForLoading)return hack.log(\"Waiting other sheet to be loaded: sfsc.waitingForLoading = \"+c.waitingForLoading,hack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\"),null;c.loadsheet&&alert(\"Using SocialCalc.Formula.SheetCache.loadsheet - deprecated\");c.waitingForLoading=b;hack.log(\"To be loaded: sfsc.waitingForLoading = \"+c.waitingForLoading,\nhack.recalcLink,\"SocialCalc.Formula.FindInSheetCache\");return null};\nSocialCalc.Formula.AddSheetToCache=function(a,c,b,d){var e=null,f=SocialCalc.Formula.SheetCache,g=f.constants;a=SocialCalc.Formula.NormalizeSheetName(a);if(TiddlyWiki){if(f.sheets[a])return f.tiddlersToSheets[f.sheets[a].tiddlerTitle];f.sheets[a]={recalcstate:g.asloaded,name:a,tiddlerTitle:d};d&&f.tiddlersToSheets[d]?e=f.tiddlersToSheets[d]:(c&&(e=new SocialCalc.Sheet,e.ParseSheetSave(c)),f.tiddlersToSheets[d]=e)}else c&&(e=new SocialCalc.Sheet,e.ParseSheetSave(c)),f.sheets[a]={sheet:e,recalcstate:g.asloaded,\nname:a};SocialCalc.Formula.FreshnessInfo.sheets[a]=\"undefined\"==typeof b||!1===b;return e};SocialCalc.Formula.NormalizeSheetName=function(a){return SocialCalc.Callbacks.NormalizeSheetName?SocialCalc.Callbacks.NormalizeSheetName(a):a.toLowerCase()};SocialCalc.Formula.RemoteFunctionInfo={waitingForServer:null};SocialCalc.Formula.FreshnessInfo={sheets:{},volatile:{},recalc_completed:!1};\nSocialCalc.Formula.FreshnessInfoReset=function(){var a=SocialCalc.Formula.FreshnessInfo,c=SocialCalc.Formula.SheetCache,b;for(b in a.sheets)!1===a.sheets[b]&&delete c.sheets[b];TiddlyWiki&&(tiddlersToSheets={});a.sheets={};a.volatile={};a.recalc_completed=!1};SocialCalc.Formula.PlainCoord=function(a){return-1==a.indexOf(\"$\")?a:a.replace(/\\$/g,\"\")};\nSocialCalc.Formula.OrderRangeParts=function(a,c){var b,d,e={};b=SocialCalc.coordToCr(a);d=SocialCalc.coordToCr(c);b.col>d.col?(e.c1=d.col,e.c2=b.col):(e.c1=b.col,e.c2=d.col);b.row>d.row?(e.r1=d.row,e.r2=b.row):(e.r1=b.row,e.r2=d.row);return e};\nSocialCalc.Formula.TestCriteria=function(a,c,b){var d,e,f;if(null==b)return!1;b+=\"\";d=b.charAt(0);\"=\"==d||\"<\"==d||\">\"==d?b=b.substring(1):(d=b.substring(0,2),\"<=\"==d||\"<>\"==d||\">=\"==d?b=b.substring(2):d=\"none\");b=SocialCalc.DetermineValueType(b);if(!b.type){if(\"none\"==d)return!1;if(\"b\"==c.charAt(0)){if(\"=\"==d)return!0}else if(\"<>\"==d)return!0;return!1}e=!1;\"n\"==b.type.charAt(0)&&\"t\"==c.charAt(0)&&(f=SocialCalc.DetermineValueType(a),\"n\"==f.type.charAt(0)&&(a=f.value,c=f.type));if(\"n\"==c.charAt(0)&&\n\"n\"==b.type.charAt(0))switch(a-=0,b.value-=0,d){case \"<\":e=a<b.value;break;case \"<=\":e=a<=b.value;break;case \"=\":case \"none\":e=a==b.value;break;case \">=\":e=a>=b.value;break;case \">\":e=a>b.value;break;case \"<>\":e=a!=b.value}else if(\"e\"==c.charAt(0))e=!1;else if(\"e\"==b.type.charAt(0))e=!1;else{\"n\"==c.charAt(0)&&(a=SocialCalc.format_number_for_display(a,\"n\",\"\"));if(\"n\"==b.type.charAt(0))return!1;a=a?a.toLowerCase():\"\";b.value=b.value?b.value.toLowerCase():\"\";switch(d){case \"<\":e=a<b.value;break;case \"<=\":e=\na<=b.value;break;case \"=\":e=a==b.value;break;case \"none\":e=a.substring(0,b.value.length)==b.value;break;case \">=\":e=a>=b.value;break;case \">\":e=a>b.value;break;case \"<>\":e=a!=b.value}}return e};SocialCalc||(SocialCalc={});SocialCalc.Popup={};SocialCalc.Popup.Types={};SocialCalc.Popup.Controls={};SocialCalc.Popup.Current={};SocialCalc.Popup.LocalizeString=function(a){return a};SocialCalc.Popup.Create=function(a,c,b){var d=SocialCalc.Popup.Types[a];d&&d.Create&&d.Create(a,c,b);SocialCalc.Popup.imagePrefix=SocialCalc.Constants.defaultImagePrefix};\nSocialCalc.Popup.SetValue=function(a,c){var b=SocialCalc.Popup,d=b.Types,e=b.Controls;e[a]?(b=e[a].type,d=d[b],e=e[a].data,d&&d.Create&&(d.SetValue(b,a,c),e.attribs&&e.attribs.changedcallback&&e.attribs.changedcallback(e.attribs,a,c))):alert(\"Unknown control \"+a)};\nSocialCalc.Popup.SetDisabled=function(a,c){var b=SocialCalc.Popup,d=b.Types,e=b.Controls;e[a]?(e=e[a].type,(d=d[e])&&d.Create&&(b.Current.id&&a==b.Current.id&&(d.Hide(e,b.Current.id),b.Current.id=null),d.SetDisabled(e,a,c))):alert(\"Unknown control \"+a)};SocialCalc.Popup.GetValue=function(a){var c=SocialCalc.Popup,b=c.Types,c=c.Controls;if(c[a])return c=c[a].type,(b=b[c])&&b.Create?b.GetValue(c,a):null;alert(\"Unknown control \"+a)};\nSocialCalc.Popup.Initialize=function(a,c){var b=SocialCalc.Popup,d=b.Types,b=b.Controls;b[a]?(b=b[a].type,(d=d[b])&&d.Initialize&&d.Initialize(b,a,c)):alert(\"Unknown control \"+a)};SocialCalc.Popup.Reset=function(a){var c=SocialCalc.Popup.Types;c[a].Reset&&c[a].Reset(a)};\nSocialCalc.Popup.CClick=function(a){var c=SocialCalc.Popup,b=c.Types,d=c.Controls;if(!d[a])alert(\"Unknown control \"+a);else if(!d[a].data||!d[a].data.disabled){var e=d[a].type,f=b[e];if(c.Current.id&&(b[d[c.Current.id].type].Hide(e,c.Current.id),a==c.Current.id)){c.Current.id=null;return}f&&f.Show&&f.Show(e,a);c.Current.id=a}};SocialCalc.Popup.Close=function(){var a=SocialCalc.Popup;a.Current.id&&a.CClick(a.Current.id)};\nSocialCalc.Popup.Cancel=function(){var a=SocialCalc.Popup,c=a.Types,b=a.Controls;a.Current.id&&(b=b[a.Current.id].type,c[b].Cancel(b,a.Current.id),a.Current.id=null)};\nSocialCalc.Popup.CreatePopupDiv=function(a,c){var b,d=SocialCalc.Popup.Controls[a].data,e=document.createElement(\"div\");e.style.position=\"absolute\";b=SocialCalc.GetElementPosition(d.mainele);e.style.top=b.top+d.mainele.offsetHeight+\"px\";e.style.left=b.left+\"px\";e.style.zIndex=100;e.style.backgroundColor=\"#FFF\";e.style.border=\"1px solid black\";c.width&&(e.style.width=c.width);d.mainele.appendChild(e);c.title&&(e.innerHTML='<table cellspacing=\"0\" cellpadding=\"0\" style=\"border-bottom:1px solid black;\"><tr><td style=\"font-size:10px;cursor:default;width:100%;background-color:#999;color:#FFF;\">'+\nc.title+'</td><td style=\"font-size:10px;cursor:default;color:#666;\" onclick=\"SocialCalc.Popup.Cancel();\"> X </td></tr></table>',c.moveable&&(d.dragregistered=e.firstChild.firstChild.firstChild.firstChild,SocialCalc.DragRegister(d.dragregistered,!0,!0,{MouseDown:SocialCalc.DragFunctionStart,MouseMove:SocialCalc.DragFunctionPosition,MouseUp:SocialCalc.DragFunctionPosition,Disabled:null,positionobj:e},d.mainele)));return e};\nSocialCalc.Popup.EnsurePosition=function(a,c){function b(a){var c=SocialCalc.GetElementPosition(a);c.height=a.offsetHeight;c.width=a.offsetWidth;c.bottom=c.top+c.height;c.right=c.left+c.width;return c}var d=SocialCalc.Popup.Controls[a].data,e=d.mainele.firstChild;if(e){var d=d.popupele,f=b(d),g=b(c),e=b(e);e.bottom+f.height<g.bottom&&e.left+f.width<g.right?(d.style.top=e.bottom+\"px\",d.style.left=e.left+\"px\"):e.top-f.height>g.top&&e.left+f.width<g.right?(d.style.top=e.top-f.height+\"px\",d.style.left=\ne.left+\"px\"):e.bottom+f.height<g.bottom&&e.right-f.width>g.left?(d.style.top=e.bottom+\"px\",d.style.left=e.right-f.width+\"px\"):e.top-f.height>g.top&&e.right-f.width>g.left?(d.style.top=e.top-f.height+\"px\",d.style.left=e.right-f.width+\"px\"):e.bottom+f.height<g.bottom&&f.width<g.width?(d.style.top=e.bottom+\"px\",d.style.left=g.left+Math.floor((g.width-f.width)/2)+\"px\"):e.top-f.height>g.top&&f.width<g.width?(d.style.top=e.top-f.height+\"px\",d.style.left=g.left+Math.floor((g.width-f.width)/2)+\"px\"):f.height<\ng.height&&e.right+f.width<g.right?(d.style.top=g.top+Math.floor((g.height-f.height)/2)+\"px\",d.style.left=e.right+\"px\"):f.height<g.height&&e.left-f.width>g.left&&(d.style.top=g.top+Math.floor((g.height-f.height)/2)+\"px\",d.style.left=e.left-f.width+\"px\")}else alert(\"No main popup element firstChild.\")};SocialCalc.Popup.DestroyPopupDiv=function(a,c){a&&(a.innerHTML=\"\",SocialCalc.DragUnregister(c),a.parentNode&&a.parentNode.removeChild(a))};\nSocialCalc.Popup.RGBToHex=function(a){var c=SocialCalc.Popup;return\"\"==a?\"000000\":(a=a.match(/(\\d+)\\D+(\\d+)\\D+(\\d+)/))?c.ToHex(a[1])+c.ToHex(a[2])+c.ToHex(a[3]):\"000000\"};SocialCalc.Popup.HexDigits=\"0123456789ABCDEF\";SocialCalc.Popup.ToHex=function(a){var c=SocialCalc.Popup,b=a%16;return c.HexDigits.charAt(Math.floor(a/16))+c.HexDigits.charAt(b)};\nSocialCalc.Popup.FromHex=function(a){var c=SocialCalc.Popup,b=c.HexDigits.indexOf(a.charAt(0).toUpperCase());a=c.HexDigits.indexOf(a.charAt(1).toUpperCase());return 16*(0<=b?b:0)+(0<=a?a:0)};SocialCalc.Popup.HexToRGB=function(a){var c=SocialCalc.Popup;return\"rgb(\"+c.FromHex(a.substring(1,3))+\",\"+c.FromHex(a.substring(3,5))+\",\"+c.FromHex(a.substring(5,7))+\")\"};SocialCalc.Popup.makeRGB=function(a,c,b){return\"rgb(\"+(0<a?a:0)+\",\"+(0<c?c:0)+\",\"+(0<b?b:0)+\")\"};\nSocialCalc.Popup.splitRGB=function(a){return(a=a.match(/(\\d+)\\D+(\\d+)\\D+(\\d+)\\D/))?{r:a[1]-0,g:a[2]-0,b:a[3]-0}:{r:0,g:0,b:0}};SocialCalc.Popup.Types.List={};\nSocialCalc.Popup.Types.List.Create=function(a,c,b){a={type:a,value:\"\",display:\"\",data:{}};SocialCalc.Popup.Controls[c]=a;a=a.data;a.attribs=b||{};(b=document.getElementById(c))?(a.mainele=b,b.innerHTML='<input style=\"cursor:pointer;width:100px;font-size:smaller;\" onfocus=\"this.blur();\" onclick=\"SocialCalc.Popup.CClick(\\''+c+'\\');\" value=\"\">',a.options=[]):alert(\"Missing element \"+c)};\nSocialCalc.Popup.Types.List.SetValue=function(a,c,b){a=SocialCalc.Popup.Controls[c].data;a.value=b;a.custom=!1;for(b=0;b<a.options.length;b++)if(o=a.options[b],!(o.a&&(o.a.skip||o.a.custom||o.a.cancel)||o.v!=a.value)){a.display=o.o;break}b==a.options.length&&(a.display=\"Custom\",a.custom=!0);a.mainele&&a.mainele.firstChild&&(a.mainele.firstChild.value=a.display)};\nSocialCalc.Popup.Types.List.SetDisabled=function(a,c,b){a=SocialCalc.Popup.Controls[c].data;a.disabled=b;a.mainele&&a.mainele.firstChild&&(a.mainele.firstChild.disabled=b)};SocialCalc.Popup.Types.List.GetValue=function(a,c){return SocialCalc.Popup.Controls[c].data.value};SocialCalc.Popup.Types.List.Initialize=function(a,c,b){var d;a=SocialCalc.Popup;var e=a.Controls[c].data;for(d in b.attribs)e.attribs[d]=b.attribs[d];e.options=b?b.options:[];b.value&&a.SetValue(c,b.value)};\nSocialCalc.Popup.Types.List.Reset=function(a){var c=SocialCalc.Popup,b=c.Types,d=c.Controls;c.Current.id&&d[c.Current.id].type==a&&(b[a].Hide(a,c.Current.id),c.Current.id=null)};\nSocialCalc.Popup.Types.List.Show=function(a,c){var b;b=SocialCalc.Popup;var d=b.Controls[c].data,e=\"\";d.popupele=b.CreatePopupDiv(c,d.attribs);d.custom?(e=SocialCalc.Popup.Types.List.MakeCustom(a,c),b=document.createElement(\"div\"),b.innerHTML='<div style=\"cursor:default;padding:4px;background-color:#CCC;\">'+e+\"</div>\",d.customele=b.firstChild.firstChild.childNodes[1],d.listdiv=null):(e=SocialCalc.Popup.Types.List.MakeList(a,c),b=document.createElement(\"div\"),b.innerHTML='<div style=\"cursor:default;padding:4px;\">'+\ne+\"</div>\",d.customele=null,d.listdiv=b.firstChild);d.contentele=b;d.mainele&&d.mainele.firstChild&&(d.mainele.firstChild.disabled=!0);d.popupele.appendChild(b);d.attribs.ensureWithin&&SocialCalc.Popup.EnsurePosition(c,d.attribs.ensureWithin)};\nSocialCalc.Popup.Types.List.MakeList=function(a,c){var b,d,e,f=SocialCalc.Popup.Controls[c].data,g;g='<table cellspacing=\"0\" cellpadding=\"0\"><tr><td style=\"vertical-align:top;\">';f.ncols=1;for(b=0;b<f.options.length;b++){d=f.options[b];if(d.a){if(d.a.newcol){g+='</td><td style=\"vertical-align:top;\"> </td><td style=\"vertical-align:top;\">';f.ncols+=1;continue}if(d.a.skip){g+='<div style=\"font-size:x-small;white-space:nowrap;\">'+d.o+\"</div>\";continue}}e=d.v!=f.value||d.a&&(d.a.custom||\nd.a.cancel)?\"\":\"background-color:#DDF;\";g+='<div style=\"font-size:x-small;white-space:nowrap;'+e+'\" onclick=\"SocialCalc.Popup.Types.List.ItemClicked(\\''+c+\"','\"+b+\"');\\\" onmousemove=\\\"SocialCalc.Popup.Types.List.MouseMove('\"+c+\"',this);\\\">\"+d.o+\"</div>\"}return g+\"</td></tr></table>\"};\nSocialCalc.Popup.Types.List.MakeCustom=function(a,c){var b=SocialCalc.Popup.LocalizeString,d=\"\",d=SocialCalc.Popup.Controls[c].data.value,d=SocialCalc.special_chars(d);return d='<div style=\"white-space:nowrap;\"><br><input id=\"customvalue\" value=\"'+d+'\"><br><br><input style=\"font-size:smaller;\" type=\"button\" value=\"'+b(\"OK\")+'\" onclick=\"SocialCalc.Popup.Types.List.CustomOK(\\''+c+'\\');return false;\"><input style=\"font-size:smaller;\" type=\"button\" value=\"'+b(\"List\")+'\" onclick=\"SocialCalc.Popup.Types.List.CustomToList(\\''+\nc+'\\');\"><input style=\"font-size:smaller;\" type=\"button\" value=\"'+b(\"Cancel\")+'\" onclick=\"SocialCalc.Popup.Close();\"><br></div>'};\nSocialCalc.Popup.Types.List.ItemClicked=function(a,c){var b,d,e,f=SocialCalc.Popup.Controls[a].data;(b=f.options[c].a)&&b.custom?(b=f.contentele,d=SocialCalc.Popup.Types.List.MakeCustom(\"List\",a),e=document.createElement(\"div\"),e.innerHTML='<div style=\"cursor:default;padding:4px;background-color:#CCC;\">'+d+\"</div>\",f.customele=e.firstChild.firstChild.childNodes[1],f.listdiv=null,f.contentele=e,f.popupele.replaceChild(e,b),f.attribs.ensureWithin&&SocialCalc.Popup.EnsurePosition(a,f.attribs.ensureWithin)):\n(b&&b.cancel||SocialCalc.Popup.SetValue(a,f.options[c].v),SocialCalc.Popup.Close())};SocialCalc.Popup.Types.List.CustomToList=function(a){var c,b,d,e=SocialCalc.Popup.Controls[a].data;c=e.contentele;b=SocialCalc.Popup.Types.List.MakeList(\"List\",a);d=document.createElement(\"div\");d.innerHTML='<div style=\"cursor:default;padding:4px;\">'+b+\"</div>\";e.customele=null;e.listdiv=d.firstChild;e.contentele=d;e.popupele.replaceChild(d,c);e.attribs.ensureWithin&&SocialCalc.Popup.EnsurePosition(a,e.attribs.ensureWithin)};\nSocialCalc.Popup.Types.List.CustomOK=function(a){SocialCalc.Popup.SetValue(a,SocialCalc.Popup.Controls[a].data.customele.value);SocialCalc.Popup.Close()};SocialCalc.Popup.Types.List.MouseMove=function(a,c){var b,d,e=SocialCalc.Popup.Controls[a].data;if(b=e.listdiv){var f=b.firstChild.firstChild.firstChild;for(b=0;b<e.ncols;b++)for(d=0;d<f.childNodes[2*b].childNodes.length;d++)f.childNodes[2*b].childNodes[d].style.backgroundColor=\"#FFF\";c.style.backgroundColor=\"#DDF\"}};\nSocialCalc.Popup.Types.List.Hide=function(a,c){var b=SocialCalc.Popup,d=b.Controls[c].data;b.DestroyPopupDiv(d.popupele,d.dragregistered);d.popupele=null;d.mainele&&d.mainele.firstChild&&(d.mainele.firstChild.disabled=!1)};SocialCalc.Popup.Types.List.Cancel=function(a,c){SocialCalc.Popup.Types.List.Hide(a,c)};SocialCalc.Popup.Types.ColorChooser={};\nSocialCalc.Popup.Types.ColorChooser.Create=function(a,c,b){a={type:a,value:\"\",display:\"\",data:{}};SocialCalc.Popup.Controls[c]=a;a=a.data;a.attribs=b||{};b=a.attribs;a.value=\"\";var d=document.getElementById(c);d?(a.mainele=d,d.innerHTML='<div style=\"cursor:pointer;border:1px solid black;vertical-align:top;width:'+(b.sampleWidth||\"15px\")+\";height:\"+(b.sampleHeight||\"15px\")+';\" onclick=\"SocialCalc.Popup.Types.ColorChooser.ControlClicked(\\''+c+\"');\\\"> </div>\"):alert(\"Missing element \"+c)};\nSocialCalc.Popup.Types.ColorChooser.SetValue=function(a,c,b){a=SocialCalc.Popup;c=a.Controls[c].data;var d=c.attribs;c.value=b;c.custom=!1;c.mainele&&c.mainele.firstChild&&(c.value?(c.mainele.firstChild.style.backgroundColor=c.value,b=d.backgroundImage?\"url(\"+a.imagePrefix+d.backgroundImage+\")\":\"\",a=\"center center\"):(c.mainele.firstChild.style.backgroundColor=\"#FFF\",d.backgroundImageDefault?(b=\"url(\"+a.imagePrefix+d.backgroundImageDefault+\")\",a=\"center center\"):(b=\"url(\"+a.imagePrefix+\"defaultcolor.gif)\",\na=\"left top\")),c.mainele.firstChild.style.backgroundPosition=a,TiddlyWiki&&(b=TiddlyWiki.getModifiedCssImageStyle(b)),c.mainele.firstChild.style.backgroundImage=b)};\nSocialCalc.Popup.Types.ColorChooser.SetDisabled=function(a,c,b){a=SocialCalc.Popup;var d=a.Controls[c].data,e=d.attribs;d.disabled=b;d.mainele&&d.mainele.firstChild&&(b?(d.mainele.firstChild.style.backgroundColor=\"#DDD\",e.backgroundImageDisabled?(img=\"url(\"+a.imagePrefix+e.backgroundImageDisabled+\")\",pos=\"center center\"):(img=\"url(\"+a.imagePrefix+\"defaultcolor.gif)\",pos=\"left top\"),d.mainele.firstChild.style.backgroundPosition=pos,TiddlyWiki&&(img=TiddlyWiki.getModifiedCssImageStyle(img)),d.mainele.firstChild.style.backgroundImage=\nimg):a.SetValue(c,d.value))};SocialCalc.Popup.Types.ColorChooser.GetValue=function(a,c){return SocialCalc.Popup.Controls[c].data.value};SocialCalc.Popup.Types.ColorChooser.Initialize=function(a,c,b){var d;a=SocialCalc.Popup;var e=a.Controls[c].data;for(d in b.attribs)e.attribs[d]=b.attribs[d];b.value&&a.SetValue(c,b.value)};\nSocialCalc.Popup.Types.ColorChooser.Reset=function(a){var c=SocialCalc.Popup,b=c.Types,d=c.Controls;c.Current.id&&d[c.Current.id].type==a&&(b[a].Hide(a,c.Current.id),c.Current.id=null)};\nSocialCalc.Popup.Types.ColorChooser.Show=function(a,c){var b,d;b=SocialCalc.Popup;var e=b.Controls[c].data;d=\"\";e.oldvalue=e.value;e.popupele=b.CreatePopupDiv(c,e.attribs);e.custom?(d=SocialCalc.Popup.Types.ColorChooser.MakeCustom(a,c),b=document.createElement(\"div\"),b.innerHTML='<div style=\"cursor:default;padding:4px;background-color:#CCC;\">'+d+\"</div>\",e.customele=b.firstChild.firstChild.childNodes[2]):(d=SocialCalc.Popup.Types.ColorChooser.CreateGrid(a,c),b=document.createElement(\"div\"),b.style.padding=\n\"3px\",b.style.backgroundColor=\"#CCC\",b.appendChild(d),e.customele=null);e.contentele=b;e.popupele.appendChild(b);e.attribs.ensureWithin&&SocialCalc.Popup.EnsurePosition(c,e.attribs.ensureWithin)};\nSocialCalc.Popup.Types.ColorChooser.MakeCustom=function(a,c){var b=SocialCalc.Popup,d=b.LocalizeString,e=\"\";return e='<div style=\"white-space:nowrap;\"><br>#<input id=\"customvalue\" style=\"width:75px;\" value=\"'+b.Controls[c].data.value+'\"><br><br><input style=\"font-size:smaller;\" type=\"button\" value=\"'+d(\"OK\")+'\" onclick=\"SocialCalc.Popup.Types.ColorChooser.CustomOK(\\''+c+'\\');return false;\"><input style=\"font-size:smaller;\" type=\"button\" value=\"'+d(\"Grid\")+'\" onclick=\"SocialCalc.Popup.Types.ColorChooser.CustomToGrid(\\''+\nc+\"');\\\"><br></div>\"};SocialCalc.Popup.Types.ColorChooser.ItemClicked=function(a,c){SocialCalc.Popup.Close()};SocialCalc.Popup.Types.ColorChooser.CustomToList=function(a){};SocialCalc.Popup.Types.ColorChooser.CustomOK=function(a){var c=SocialCalc.Popup;c.SetValue(a,c.Controls[a].data.customele.value);c.Close()};SocialCalc.Popup.Types.ColorChooser.Hide=function(a,c){var b=SocialCalc.Popup,d=b.Controls[c].data;b.DestroyPopupDiv(d.popupele,d.dragregistered);d.popupele=null};\nSocialCalc.Popup.Types.ColorChooser.Cancel=function(a,c){var b=SocialCalc.Popup;b.SetValue(c,b.Controls[c].data.oldvalue);SocialCalc.Popup.Types.ColorChooser.Hide(a,c)};\nSocialCalc.Popup.Types.ColorChooser.CreateGrid=function(a,c){var b,d,e,f,g,l=SocialCalc.Popup,h=l.Types,m=l.LocalizeString;b=l.Controls[c].data;b.grid={};var p=b.grid,r=document.createElement(\"div\");b=document.createElement(\"table\");b.cellSpacing=0;b.cellPadding=0;b.style.width=\"100px\";p.table=b;b=document.createElement(\"tbody\");p.table.appendChild(b);p.tbody=b;for(d=0;16>d;d++){e=document.createElement(\"tr\");for(f=0;5>f;f++)g={},p[d+\",\"+f]=g,b=document.createElement(\"td\"),b.style.fontSize=\"1px\",\nb.innerHTML=\" \",b.style.height=\"10px\",1>=f?(b.style.width=\"17px\",b.style.borderRight=\"3px solid white\"):(b.style.width=\"20px\",b.style.backgroundRepeat=\"no-repeat\"),e.appendChild(b),g.ele=b;p.tbody.appendChild(e)}r.appendChild(p.table);b=document.createElement(\"div\");b.style.marginTop=\"3px\";b.innerHTML='<table cellspacing=\"0\" cellpadding=\"0\"><tr><td style=\"width:17px;background-color:#FFF;background-image:url('+l.imagePrefix+'defaultcolor.gif);height:16px;font-size:10px;cursor:pointer;\" title=\"'+\nm(\"Default\")+'\"> </td><td style=\"width:23px;height:16px;font-size:10px;text-align:center;cursor:pointer;\" title=\"'+m(\"Custom\")+'\">#</td><td style=\"width:60px;height:16px;font-size:10px;text-align:center;cursor:pointer;\">'+m(\"OK\")+\"</td></tr></table>\";TiddlyWiki&&(b.innerHTML=TiddlyWiki.getModifiedCssImageStyle(b.innerHTML));p.defaultbox=b.firstChild.firstChild.firstChild.childNodes[0];p.defaultbox.onclick=h.ColorChooser.DefaultClicked;p.custom=b.firstChild.firstChild.firstChild.childNodes[1];\np.custom.onclick=h.ColorChooser.CustomClicked;p.msg=b.firstChild.firstChild.firstChild.childNodes[2];p.msg.onclick=h.ColorChooser.CloseOK;r.appendChild(b);p.table.onmousedown=h.ColorChooser.GridMouseDown;h.ColorChooser.DetermineColors(c);h.ColorChooser.SetColors(c);return r};SocialCalc.Popup.Types.ColorChooser.gridToG=function(a,c,b){return a[c+\",\"+b]};\nSocialCalc.Popup.Types.ColorChooser.DetermineColors=function(a){var c=SocialCalc.Popup,b=c.Types.ColorChooser,d=c.Controls[a].data;a=d.grid;var e,f=c.splitRGB(d.value),d=2;e=16-Math.floor((f.r+16)/16);a[\"selectedrow\"+d]=e;for(e=0;16>e;e++)b.gridToG(a,e,d).rgb=c.makeRGB(17*(15-e),0,0);d=3;e=16-Math.floor((f.g+16)/16);a[\"selectedrow\"+d]=e;for(e=0;16>e;e++)b.gridToG(a,e,d).rgb=c.makeRGB(0,17*(15-e),0);d=4;e=16-Math.floor((f.b+16)/16);a[\"selectedrow\"+d]=e;for(e=0;16>e;e++)b.gridToG(a,e,d).rgb=c.makeRGB(0,\n0,17*(15-e));d=1;for(e=0;16>e;e++)b.gridToG(a,e,d).rgb=c.makeRGB(17*(15-e),17*(15-e),17*(15-e));var d=0,c=[0,68,153,204,255],f=\"400 310 420 440 442 340 040 042 032 044 024 004 204 314 402 414\".split(\" \"),g;for(e=0;16>e;e++)g=f[e],b.gridToG(a,e,d).rgb=\"rgb(\"+c[g.charAt(0)-0]+\",\"+c[g.charAt(1)-0]+\",\"+c[g.charAt(2)-0]+\")\"};\nSocialCalc.Popup.Types.ColorChooser.SetColors=function(a){var c,b,d,e=SocialCalc.Popup,f=e.Types.ColorChooser,g=e.Controls[a].data,l=g.grid;for(c=0;16>c;c++)for(b=0;5>b;b++)d=f.gridToG(l,c,b),d.ele.style.backgroundColor=d.rgb,d.ele.title=e.RGBToHex(d.rgb),d.ele.style.backgroundImage=l[\"selectedrow\"+b]==c?TiddlyWiki?TiddlyWiki.getModifiedCssImageStyle(\"url(\"+e.imagePrefix+\"chooserarrow.gif)\"):\"url(\"+e.imagePrefix+\"chooserarrow.gif)\":\"\";e.SetValue(a,g.value);l.msg.style.backgroundColor=g.value;a=e.splitRGB(g.value||\n\"rgb(255,255,255)\");l.msg.style.color=220>a.r+a.g+a.b?\"#FFF\":\"#000\";g.value?(l.msg.style.backgroundImage=\"\",l.msg.title=e.RGBToHex(g.value)):(l.msg.style.backgroundColor=\"#FFF\",l.msg.style.backgroundImage=TiddlyWiki?TiddlyWiki.getModifiedCssImageStyle(\"url(\"+e.imagePrefix+\"defaultcolor.gif)\"):\"url(\"+e.imagePrefix+\"defaultcolor.gif)\",l.msg.title=\"Default\")};\nSocialCalc.Popup.Types.ColorChooser.GridMouseDown=function(a){var c=a||window.event;a=SocialCalc.Popup;var b=a.Types.ColorChooser,d=a.Controls,e=a.Current.id;if(e){var d=d[e].data,f=d.grid;switch(c.type){case \"mousedown\":f.mousedown=!0;break;case \"mouseup\":f.mousedown=!1;break;case \"mousemove\":if(!f.mousedown)return}var g=SocialCalc.GetElementPositionWithScroll(d.mainele),l=c.clientX-g.left,h=c.clientY-g.top,c=SocialCalc.GetElementPositionWithScroll(f.table);c.left-=g.left;c.top-=g.top;g=Math.floor((h-\nc.top-2)/10);g=0>g?0:g;l=Math.floor((l-c.left)/20);l=0>l?0:4<l?4:l;f=b.gridToG(f,0>g?0:15<g?15:g,l).ele.style.backgroundColor;g=a.splitRGB(f);c=a.splitRGB(d.value);switch(l){case 2:d.value=a.makeRGB(g.r,c.g,c.b);break;case 3:d.value=a.makeRGB(c.r,g.g,c.b);break;case 4:d.value=a.makeRGB(c.r,c.g,g.b);break;case 0:case 1:d.value=f}b.DetermineColors(e);b.SetColors(e)}};\nSocialCalc.Popup.Types.ColorChooser.ControlClicked=function(a){var c=SocialCalc.Popup,b=c.Types.ColorChooser,d=c.Current.id;d&&a==d?b.CloseOK():c.CClick(a)};SocialCalc.Popup.Types.ColorChooser.DefaultClicked=function(a){var c=SocialCalc.Popup;a=c.Controls;if(c=c.Current.id)a=a[c].data,a.value=\"\",SocialCalc.Popup.SetValue(c,a.value),SocialCalc.Popup.Close()};\nSocialCalc.Popup.Types.ColorChooser.CustomClicked=function(a){a=SocialCalc.Popup;var c=a.Controls,b=a.Current.id;if(b){var c=c[b].data,d,e,f;d=c.contentele;e=SocialCalc.Popup.Types.ColorChooser.MakeCustom(\"ColorChooser\",b);f=document.createElement(\"div\");f.innerHTML='<div style=\"cursor:default;padding:4px;background-color:#CCC;\">'+e+\"</div>\";c.customele=f.firstChild.firstChild.childNodes[2];c.contentele=f;c.popupele.replaceChild(f,d);c.customele.value=a.RGBToHex(c.value);c.attribs.ensureWithin&&SocialCalc.Popup.EnsurePosition(b,\nc.attribs.ensureWithin)}};\nSocialCalc.Popup.Types.ColorChooser.CustomToGrid=function(a){var c,b;c=SocialCalc.Popup;var d=c.Controls[a].data;SocialCalc.Popup.SetValue(a,c.HexToRGB(\"#\"+d.customele.value));var e;c=d.contentele;e=SocialCalc.Popup.Types.ColorChooser.CreateGrid(\"ColorChooser\",a);b=document.createElement(\"div\");b.style.padding=\"3px\";b.style.backgroundColor=\"#CCC\";b.appendChild(e);d.customele=null;d.contentele=b;d.popupele.replaceChild(b,c);d.attribs.ensureWithin&&SocialCalc.Popup.EnsurePosition(a,d.attribs.ensureWithin)};\nSocialCalc.Popup.Types.ColorChooser.CustomOK=function(a){var c=SocialCalc.Popup;SocialCalc.Popup.SetValue(a,c.HexToRGB(\"#\"+c.Controls[a].data.customele.value));SocialCalc.Popup.Close()};SocialCalc.Popup.Types.ColorChooser.CloseOK=function(a){var c=SocialCalc.Popup;a=c.Controls;if(c=c.Current.id)SocialCalc.Popup.SetValue(c,a[c].data.value),SocialCalc.Popup.Close()};SocialCalc||(alert(\"Main SocialCalc code module needed\"),SocialCalc={});SocialCalc.TableEditor||alert(\"SocialCalc TableEditor code module needed\");SocialCalc.CurrentSpreadsheetControlObject=null;\nSocialCalc.SpreadsheetControl=function(a,c){var b=SocialCalc.Constants;TiddlyWiki&&(this.tiddlyWiki=c,this.keyboard={areListener:!1,focusTable:null,passThru:null,didProcessKey:!1,statusFromProcessKey:!1,repeatingKeyPress:!1,chForProcessKey:\"\"},this.importExport=null);this.spreadsheetDiv=this.parentNode=null;this.viewheight=this.width=this.height=this.requestedSpaceBelow=this.requestedWidth=this.requestedHeight=0;this.tabs=[];this.tabnums={};this.tabreplacements={};this.currentTab=-1;this.views={};\nthis.editorDiv=this.spreadsheetDiv=this.editor=this.context=this.sheet=null;this.moverange=this.sortrange=\"\";this.idPrefix=a||\"SocialCalc-\";this.multipartBoundary=\"SocialCalcSpreadsheetControlSave\";this.imagePrefix=b.defaultImagePrefix;this.toolbarbackground=b.SCToolbarbackground;this.tabbackground=b.SCTabbackground;this.tabselectedCSS=b.SCTabselectedCSS;this.tabplainCSS=b.SCTabplainCSS;this.toolbartext=b.SCToolbartext;this.formulabarheight=b.SCFormulabarheight;this.statuslineheight=b.SCStatuslineheight;\nthis.statuslineCSS=b.SCStatuslineCSS;this.ExportCallback=null;this.sheet=new SocialCalc.Sheet;this.context=new SocialCalc.RenderContext(this.sheet);this.context.showGrid=!0;this.context.showRCHeaders=!0;this.editor=new SocialCalc.TableEditor(this.context);this.editor.StatusCallback.statusline={func:SocialCalc.SpreadsheetControlStatuslineCallback,params:{statuslineid:this.idPrefix+\"statusline\",recalcid1:this.idPrefix+\"divider_recalc\",recalcid2:this.idPrefix+\"button_recalc\"}};SocialCalc.CurrentSpreadsheetControlObject=\nthis;this.editor.MoveECellCallback.movefrom=function(a){var c=SocialCalc.GetSpreadsheetControlObject();c.context.cursorsuffix=\"\";a.range2.hasrange&&!a.cellhandles.noCursorSuffix&&(a.ecell.row==a.range2.top&&(a.ecell.col<a.range2.left||a.ecell.col>a.range2.right+1)&&(c.context.cursorsuffix=\"insertleft\"),a.ecell.col==a.range2.left&&(a.ecell.row<a.range2.top||a.ecell.row>a.range2.bottom+1)&&(c.context.cursorsuffix=\"insertup\"))};this.formulabuttons={formulafunctions:{image:\"formuladialog.gif\",tooltip:\"Functions\",\ncommand:SocialCalc.SpreadsheetControl.DoFunctionList},multilineinput:{image:\"multilinedialog.gif\",tooltip:\"Multi-line Input Box\",command:SocialCalc.SpreadsheetControl.DoMultiline},link:{image:\"linkdialog.gif\",tooltip:\"Link Input Box\",command:SocialCalc.SpreadsheetControl.DoLink},sum:{image:\"sumdialog.gif\",tooltip:\"Auto Sum\",command:SocialCalc.SpreadsheetControl.DoSum}};this.tabnums.edit=this.tabs.length;this.tabs.push({name:\"edit\",text:\"Edit\",html:' <div id=\"%id.edittools\" class=\"SocialCalc-toolbar\"> <img id=\"%id.button_undo\" src=\"%img.undo.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_redo\" src=\"%img.redo.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_copy\" src=\"%img.copy.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_cut\" src=\"%img.cut.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_paste\" src=\"%img.paste.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_delete\" src=\"%img.delete.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_pasteformats\" src=\"%img.pasteformats.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <span id=\"%id.locktools\"><img id=\"%id.button_lock\" src=\"%img.lock.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_unlock\" src=\"%img.unlock.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> </span> <img id=\"%id.button_filldown\" src=\"%img.filldown.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_fillright\" src=\"%img.fillright.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_movefrom\" src=\"%img.movefromoff.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_movepaste\" src=\"%img.movepasteoff.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_moveinsert\" src=\"%img.moveinsertoff.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_alignleft\" src=\"%img.alignleft.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_aligncenter\" src=\"%img.aligncenter.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_alignright\" src=\"%img.alignright.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_borderon\" src=\"%img.borderson.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_borderoff\" src=\"%img.bordersoff.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_swapcolors\" src=\"%img.swapcolors.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_merge\" src=\"%img.merge.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_unmerge\" src=\"%img.unmerge.gif\" style=\"vertical-align:bottom;\"> <img src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_insertrow\" src=\"%img.insertrow.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_insertcol\" src=\"%img.insertcol.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_deleterow\" src=\"%img.deleterow.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_deletecol\" src=\"%img.deletecol.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_hiderow\" src=\"%img.hiderow.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_hidecol\" src=\"%img.hidecol.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.divider_recalc\" src=\"%img.divider1.gif\" style=\"vertical-align:bottom;\"> <img id=\"%id.button_recalc\" src=\"%img.recalc.gif\" style=\"vertical-align:bottom;\"> </div>',\noncreate:null,onclick:null});this.tabnums.settings=this.tabs.length;this.tabs.push({name:\"settings\",text:\"Format\",html:'<div id=\"%id.settingstools\" class=\"SocialCalc-toolbar\" style=\"display:none;\"> <div id=\"%id.sheetsettingstoolbar\" style=\"display:none;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr><td> <div style=\"%tbt.\">%loc!SHEET SETTINGS!:</div> </td></tr><tr><td> <input id=\"%id.settings-savesheet\" type=\"button\" value=\"%loc!Save!\" onclick=\"SocialCalc.SettingsControlSave(\\'sheet\\');\"> <input type=\"button\" value=\"%loc!Cancel!\" onclick=\"SocialCalc.SettingsControlSave(\\'cancel\\');\"> <input type=\"button\" value=\"%loc!Show Cell Settings!\" onclick=\"SocialCalc.SpreadsheetControlSettingsSwitch(\\'cell\\');return false;\"> </td></tr></table> </div> <div id=\"%id.cellsettingstoolbar\" style=\"display:none;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr><td> <div style=\"%tbt.\">%loc!CELL SETTINGS!: <span id=\"%id.settingsecell\"> </span></div> </td></tr><tr><td> <input id=\"%id.settings-savecell\" type=\"button\" value=\"%loc!Save!\" onclick=\"SocialCalc.SettingsControlSave(\\'cell\\');\"> <input type=\"button\" value=\"%loc!Cancel!\" onclick=\"SocialCalc.SettingsControlSave(\\'cancel\\');\"> <input type=\"button\" value=\"%loc!Show Sheet Settings!\" onclick=\"SocialCalc.SpreadsheetControlSettingsSwitch(\\'sheet\\');return false;\"> </td></tr></table> </div></div>',\nview:\"settings\",onclick:function(a,c){SocialCalc.SettingsControls.idPrefix=a.idPrefix;SocialCalc.SettingControlReset();var b=a.sheet.EncodeSheetAttributes(),g=a.sheet.EncodeCellAttributes(a.editor.ecell.coord);SocialCalc.SettingsControlLoadPanel(a.views.settings.values.sheetspanel,b);SocialCalc.SettingsControlLoadPanel(a.views.settings.values.cellspanel,g);document.getElementById(a.idPrefix+\"settingsecell\").innerHTML=a.editor.ecell.coord;SocialCalc.SpreadsheetControlSettingsSwitch(\"cell\");a.views.settings.element.style.height=\na.viewheight+\"px\";a.views.settings.element.firstChild.style.height=a.viewheight+\"px\";b=a.editor.range.hasrange?SocialCalc.crToCoord(a.editor.range.left,a.editor.range.top)+\":\"+SocialCalc.crToCoord(a.editor.range.right,a.editor.range.bottom):a.editor.ecell.coord;document.getElementById(a.idPrefix+\"settings-savecell\").value=SocialCalc.LocalizeString(\"Save to\")+\": \"+b},onclickFocus:!0});this.views.settings={name:\"settings\",values:{},oncreate:function(a,c){var b=SocialCalc.Constants;c.values.sheetspanel=\n{colorchooser:{id:a.idPrefix+\"scolorchooser\"},formatnumber:{setting:\"numberformat\",type:\"PopupList\",id:a.idPrefix+\"formatnumber\",initialdata:b.SCFormatNumberFormats},formattext:{setting:\"textformat\",type:\"PopupList\",id:a.idPrefix+\"formattext\",initialdata:b.SCFormatTextFormats},fontfamily:{setting:\"fontfamily\",type:\"PopupList\",id:a.idPrefix+\"fontfamily\",initialdata:b.SCFormatFontfamilies},fontlook:{setting:\"fontlook\",type:\"PopupList\",id:a.idPrefix+\"fontlook\",initialdata:b.SCFormatFontlook},fontsize:{setting:\"fontsize\",\ntype:\"PopupList\",id:a.idPrefix+\"fontsize\",initialdata:b.SCFormatFontsizes},textalignhoriz:{setting:\"textalignhoriz\",type:\"PopupList\",id:a.idPrefix+\"textalignhoriz\",initialdata:b.SCFormatTextAlignhoriz},numberalignhoriz:{setting:\"numberalignhoriz\",type:\"PopupList\",id:a.idPrefix+\"numberalignhoriz\",initialdata:b.SCFormatNumberAlignhoriz},alignvert:{setting:\"alignvert\",type:\"PopupList\",id:a.idPrefix+\"alignvert\",initialdata:b.SCFormatAlignVertical},textcolor:{setting:\"textcolor\",type:\"ColorChooser\",id:a.idPrefix+\n\"textcolor\"},bgcolor:{setting:\"bgcolor\",type:\"ColorChooser\",id:a.idPrefix+\"bgcolor\"},padtop:{setting:\"padtop\",type:\"PopupList\",id:a.idPrefix+\"padtop\",initialdata:b.SCFormatPadsizes},padright:{setting:\"padright\",type:\"PopupList\",id:a.idPrefix+\"padright\",initialdata:b.SCFormatPadsizes},padbottom:{setting:\"padbottom\",type:\"PopupList\",id:a.idPrefix+\"padbottom\",initialdata:b.SCFormatPadsizes},padleft:{setting:\"padleft\",type:\"PopupList\",id:a.idPrefix+\"padleft\",initialdata:b.SCFormatPadsizes},colwidth:{setting:\"colwidth\",\ntype:\"PopupList\",id:a.idPrefix+\"colwidth\",initialdata:b.SCFormatColwidth},recalc:{setting:\"recalc\",type:\"PopupList\",id:a.idPrefix+\"recalc\",initialdata:b.SCFormatRecalc},usermaxcol:{setting:\"usermaxcol\",type:\"PopupList\",id:a.idPrefix+\"usermaxcol\",initialdata:b.SCFormatUserMaxCol},usermaxrow:{setting:\"usermaxrow\",type:\"PopupList\",id:a.idPrefix+\"usermaxrow\",initialdata:b.SCFormatUserMaxRow}};c.values.cellspanel={name:\"cell\",colorchooser:{id:a.idPrefix+\"scolorchooser\"},cformatnumber:{setting:\"numberformat\",\ntype:\"PopupList\",id:a.idPrefix+\"cformatnumber\",initialdata:b.SCFormatNumberFormats},cformattext:{setting:\"textformat\",type:\"PopupList\",id:a.idPrefix+\"cformattext\",initialdata:b.SCFormatTextFormats},cfontfamily:{setting:\"fontfamily\",type:\"PopupList\",id:a.idPrefix+\"cfontfamily\",initialdata:b.SCFormatFontfamilies},cfontlook:{setting:\"fontlook\",type:\"PopupList\",id:a.idPrefix+\"cfontlook\",initialdata:b.SCFormatFontlook},cfontsize:{setting:\"fontsize\",type:\"PopupList\",id:a.idPrefix+\"cfontsize\",initialdata:b.SCFormatFontsizes},\ncalignhoriz:{setting:\"alignhoriz\",type:\"PopupList\",id:a.idPrefix+\"calignhoriz\",initialdata:b.SCFormatTextAlignhoriz},calignvert:{setting:\"alignvert\",type:\"PopupList\",id:a.idPrefix+\"calignvert\",initialdata:b.SCFormatAlignVertical},ctextcolor:{setting:\"textcolor\",type:\"ColorChooser\",id:a.idPrefix+\"ctextcolor\"},cbgcolor:{setting:\"bgcolor\",type:\"ColorChooser\",id:a.idPrefix+\"cbgcolor\"},cbt:{setting:\"bt\",type:\"BorderSide\",id:a.idPrefix+\"cbt\"},cbr:{setting:\"br\",type:\"BorderSide\",id:a.idPrefix+\"cbr\"},cbb:{setting:\"bb\",\ntype:\"BorderSide\",id:a.idPrefix+\"cbb\"},cbl:{setting:\"bl\",type:\"BorderSide\",id:a.idPrefix+\"cbl\"},cpadtop:{setting:\"padtop\",type:\"PopupList\",id:a.idPrefix+\"cpadtop\",initialdata:b.SCFormatPadsizes},cpadright:{setting:\"padright\",type:\"PopupList\",id:a.idPrefix+\"cpadright\",initialdata:b.SCFormatPadsizes},cpadbottom:{setting:\"padbottom\",type:\"PopupList\",id:a.idPrefix+\"cpadbottom\",initialdata:b.SCFormatPadsizes},cpadleft:{setting:\"padleft\",type:\"PopupList\",id:a.idPrefix+\"cpadleft\",initialdata:b.SCFormatPadsizes}};\nSocialCalc.SettingsControlInitializePanel(c.values.sheetspanel);SocialCalc.SettingsControlInitializePanel(c.values.cellspanel)},replacements:{itemtitle:{regex:/\\%itemtitle\\./g,replacement:'style=\"padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;\"'},sectiontitle:{regex:/\\%sectiontitle\\./g,replacement:'style=\"padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;\"'},parttitle:{regex:/\\%parttitle\\./g,replacement:'style=\"font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;\"'},\nitembody:{regex:/\\%itembody\\./g,replacement:'style=\"padding:12px 0px 0px 0px;vertical-align:top;font-size:small;\"'},bodypart:{regex:/\\%bodypart\\./g,replacement:'style=\"padding:0px 10px 0px 0px;font-size:small;vertical-align:top;\"'}},divStyle:\"border:1px solid black;overflow:auto;\",html:'<div id=\"%id.scolorchooser\" style=\"display:none;position:absolute;z-index:20;\"></div><table cellspacing=\"0\" cellpadding=\"0\"> <tr><td style=\"vertical-align:top;\"><table id=\"%id.sheetsettingstable\" style=\"display:none;\" cellspacing=\"0\" cellpadding=\"0\"><tr> <td %itemtitle.><br>%loc!Default Format!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Number!</div> <span id=\"%id.formatnumber\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Text!</div> <span id=\"%id.formattext\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Default Alignment!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Text Horizontal!</div> <span id=\"%id.textalignhoriz\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Number Horizontal!</div> <span id=\"%id.numberalignhoriz\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Vertical!</div> <span id=\"%id.alignvert\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Default Font!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Family!</div> <span id=\"%id.fontfamily\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Bold & Italics!</div> <span id=\"%id.fontlook\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Size!</div> <span id=\"%id.fontsize\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Color!</div> <div id=\"%id.textcolor\" class=\"SocialCalc-colorchooser\"></div> </td> <td %bodypart.> <div %parttitle.>%loc!Background!</div> <div id=\"%id.bgcolor\" class=\"SocialCalc-colorchooser\"></div> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Default Padding!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Top!</div> <span id=\"%id.padtop\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Right!</div> <span id=\"%id.padright\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Bottom!</div> <span id=\"%id.padbottom\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Left!</div> <span id=\"%id.padleft\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Default Column Width!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.> </div> <span id=\"%id.colwidth\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Recalculation!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.> </div> <span id=\"%id.recalc\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Dimensions!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Columns!</div> <span id=\"%id.usermaxcol\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Rows!</div> <span id=\"%id.usermaxrow\"></span> </td> </tr></table> </td></tr></table><table id=\"%id.cellsettingstable\" cellspacing=\"0\" cellpadding=\"0\"><tr> <td %itemtitle.><br>%loc!Format!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Number!</div> <span id=\"%id.cformatnumber\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Text!</div> <span id=\"%id.cformattext\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Alignment!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Horizontal!</div> <span id=\"%id.calignhoriz\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Vertical!</div> <span id=\"%id.calignvert\"></span> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Font!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Family!</div> <span id=\"%id.cfontfamily\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Bold & Italics!</div> <span id=\"%id.cfontlook\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Size!</div> <span id=\"%id.cfontsize\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Color!</div> <div id=\"%id.ctextcolor\" class=\"SocialCalc-colorchooser\"></div> </td> <td %bodypart.> <div %parttitle.>%loc!Background!</div> <div id=\"%id.cbgcolor\" class=\"SocialCalc-colorchooser\"></div> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Borders!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"> <tr><td %bodypart. colspan=\"3\"><div %parttitle.>%loc!Top Border!</div></td> <td %bodypart. colspan=\"3\"><div %parttitle.>%loc!Right Border!</div></td> <td %bodypart. colspan=\"3\"><div %parttitle.>%loc!Bottom Border!</div></td> <td %bodypart. colspan=\"3\"><div %parttitle.>%loc!Left Border!</div></td> </tr><tr> <td %bodypart.> <input id=\"%id.cbt-onoff-bcb\" onclick=\"SocialCalc.SettingsControlOnchangeBorder(this);\" type=\"checkbox\"> </td> <td %bodypart.> <div id=\"%id.cbt-color\" class=\"SocialCalc-colorchooser\"></div> </td> <td> </td> <td %bodypart.> <input id=\"%id.cbr-onoff-bcb\" onclick=\"SocialCalc.SettingsControlOnchangeBorder(this);\" type=\"checkbox\"> </td> <td %bodypart.> <div id=\"%id.cbr-color\" class=\"SocialCalc-colorchooser\"></div> </td> <td> </td> <td %bodypart.> <input id=\"%id.cbb-onoff-bcb\" onclick=\"SocialCalc.SettingsControlOnchangeBorder(this);\" type=\"checkbox\"> </td> <td %bodypart.> <div id=\"%id.cbb-color\" class=\"SocialCalc-colorchooser\"></div> </td> <td> </td> <td %bodypart.> <input id=\"%id.cbl-onoff-bcb\" onclick=\"SocialCalc.SettingsControlOnchangeBorder(this);\" type=\"checkbox\"> </td> <td %bodypart.> <div id=\"%id.cbl-color\" class=\"SocialCalc-colorchooser\"></div> </td> <td> </td> </tr></table> </td></tr><tr> <td %itemtitle.><br>%loc!Padding!:</td> <td %itembody.> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td %bodypart.> <div %parttitle.>%loc!Top!</div> <span id=\"%id.cpadtop\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Right!</div> <span id=\"%id.cpadright\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Bottom!</div> <span id=\"%id.cpadbottom\"></span> </td> <td %bodypart.> <div %parttitle.>%loc!Left!</div> <span id=\"%id.cpadleft\"></span> </td> </tr></table> </td></tr></table> </td><td style=\"vertical-align:top;padding:12px 0px 0px 12px;\"> <div style=\"width:100px;height:100px;overflow:hidden;border:1px solid black;background-color:#EEE;padding:6px;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td id=\"sample-text\" style=\"height:100px;width:100px;\"><div>%loc!This is a<br>sample!</div><div>-1234.5</div></td> </tr></table> </div> </td></tr></table><br>'};\nthis.tabnums.sort=this.tabs.length;this.tabs.push({name:\"sort\",text:\"Sort\",html:' <div id=\"%id.sorttools\" class=\"SocialCalc-toolbar\" style=\"display:none;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td style=\"vertical-align:top;padding-right:4px;width:160px;\"> <div style=\"%tbt.\">%loc!Set Cells To Sort!</div> <select id=\"%id.sortlist\" size=\"1\" onfocus=\"%s.CmdGotFocus(this);\"><option selected>[select range]</option></select> <input type=\"button\" value=\"%loc!OK!\" onclick=\"%s.DoCmd(this, \\'ok-setsort\\');\" style=\"font-size:x-small;\"> </td> <td style=\"vertical-align:middle;padding-right:16px;width:100px;text-align:right;\"> <div style=\"%tbt.\"> </div> <input type=\"button\" id=\"%id.sortbutton\" value=\"%loc!Sort Cells! A1:A1\" onclick=\"%s.DoCmd(this, \\'dosort\\');\" style=\"visibility:hidden;\"> </td> <td style=\"vertical-align:top;padding-right:16px;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td style=\"vertical-align:top;\"> <div style=\"%tbt.\">%loc!Major Sort!</div> <select id=\"%id.majorsort\" size=\"1\" onfocus=\"%s.CmdGotFocus(this);\"></select> </td><td> <input type=\"radio\" name=\"majorsort\" id=\"%id.majorsortup\" value=\"up\" checked><span style=\"font-size:x-small;color:#FFF;\">%loc!Up!</span><br> <input type=\"radio\" name=\"majorsort\" id=\"%id.majorsortdown\" value=\"down\"><span style=\"font-size:x-small;color:#FFF;\">%loc!Down!</span> </td> </tr></table> </td> <td style=\"vertical-align:top;padding-right:16px;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td style=\"vertical-align:top;\"> <div style=\"%tbt.\">%loc!Minor Sort!</div> <select id=\"%id.minorsort\" size=\"1\" onfocus=\"%s.CmdGotFocus(this);\"></select> </td><td> <input type=\"radio\" name=\"minorsort\" id=\"%id.minorsortup\" value=\"up\" checked><span style=\"font-size:x-small;color:#FFF;\">%loc!Up!</span><br> <input type=\"radio\" name=\"minorsort\" id=\"%id.minorsortdown\" value=\"down\"><span style=\"font-size:x-small;color:#FFF;\">%loc!Down!</span> </td> </tr></table> </td> <td style=\"vertical-align:top;padding-right:16px;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td style=\"vertical-align:top;\"> <div style=\"%tbt.\">%loc!Last Sort!</div> <select id=\"%id.lastsort\" size=\"1\" onfocus=\"%s.CmdGotFocus(this);\"></select> </td><td> <input type=\"radio\" name=\"lastsort\" id=\"%id.lastsortup\" value=\"up\" checked><span style=\"font-size:x-small;color:#FFF;\">%loc!Up!</span><br> <input type=\"radio\" name=\"lastsort\" id=\"%id.lastsortdown\" value=\"down\"><span style=\"font-size:x-small;color:#FFF;\">%loc!Down!</span> </td> </tr></table> </td> </tr></table> </div>',\nonclick:SocialCalc.SpreadsheetControlSortOnclick});this.editor.SettingsCallbacks.sort={save:SocialCalc.SpreadsheetControlSortSave,load:SocialCalc.SpreadsheetControlSortLoad};this.tabnums.audit=this.tabs.length;this.tabs.push({name:\"audit\",text:\"Audit\",html:'<div id=\"%id.audittools\" class=\"SocialCalc-toolbar\" style=\"display:none;\"> <div style=\"%tbt.\"> </div></div>',view:\"audit\",onclick:function(a,c){var b=SocialCalc.LocalizeString,g,l,h='<table cellspacing=\"0\" cellpadding=\"0\" style=\"margin-bottom:10px;\"><tr><td style=\"font-size:small;padding:6px;\"><b>'+\nb(\"Audit Trail This Session\")+\":</b><br><br>\",m=a.sheet.changes.stack,p=a.sheet.changes.tos;for(g=0;g<m.length;g++)for(g==p+1&&(h+='<br></td></tr><tr><td style=\"font-size:small;background-color:#EEE;padding:6px;\">'+b(\"UNDONE STEPS\")+\":<br>\"),l=0;l<m[g].command.length;l++)h+=SocialCalc.special_chars(m[g].command[l])+\"<br>\";a.views.audit.element.innerHTML=h+\"</td></tr></table>\";SocialCalc.CmdGotFocus(!0)},onclickFocus:!0});this.views.audit={name:\"audit\",divStyle:\"border:1px solid black;overflow:auto;\",\nhtml:\"Audit Trail\"};this.tabnums.comment=this.tabs.length;this.tabs.push({name:\"comment\",text:\"Comment\",html:'<div id=\"%id.commenttools\" class=\"SocialCalc-toolbar\" style=\"display:none;\"><table cellspacing=\"0\" cellpadding=\"0\"><tr><td><textarea id=\"%id.commenttext\" class=\"SocialCalc-commenttext\" style=\"font-size:small;overflow:auto;\" onfocus=\"%s.CmdGotFocus(this);\"></textarea></td><td style=\"vertical-align:top;\"> <input type=\"button\" value=\"%loc!Save!\" onclick=\"%s.SpreadsheetControlCommentSet();\" style=\"font-size:x-small;\"></td></tr></table></div>',\nview:\"sheet\",onclick:SocialCalc.SpreadsheetControlCommentOnclick,onunclick:SocialCalc.SpreadsheetControlCommentOnunclick});this.tabnums.names=this.tabs.length;this.tabs.push({name:\"names\",text:\"Names\",html:'<div id=\"%id.namestools\" class=\"SocialCalc-toolbar\" style=\"display:none;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td style=\"vertical-align:top;padding-right:24px;\"> <div style=\"%tbt.\">%loc!Existing Names!</div> <select id=\"%id.nameslist\" size=\"1\" onchange=\"%s.SpreadsheetControlNamesChangedName();\" onfocus=\"%s.CmdGotFocus(this);\"><option selected>[New]</option></select> </td> <td style=\"vertical-align:top;padding-right:6px;\"> <div style=\"%tbt.\">%loc!Name!</div> <input type=\"text\" id=\"%id.namesname\" style=\"font-size:x-small;width:75px;\" onfocus=\"%s.CmdGotFocus(this);\"> </td> <td style=\"vertical-align:top;padding-right:6px;\"> <div style=\"%tbt.\">%loc!Description!</div> <input type=\"text\" id=\"%id.namesdesc\" style=\"font-size:x-small;width:150px;\" onfocus=\"%s.CmdGotFocus(this);\"> </td> <td style=\"vertical-align:top;padding-right:6px;\"> <div style=\"%tbt.\">%loc!Value!</div> <input type=\"text\" id=\"%id.namesvalue\" width=\"16\" style=\"font-size:x-small;width:100px;\" onfocus=\"%s.CmdGotFocus(this);\"> </td> <td style=\"vertical-align:top;padding-right:12px;width:100px;\"> <div style=\"%tbt.\">%loc!Set Value To!</div> <input type=\"button\" id=\"%id.namesrangeproposal\" value=\"A1\" onclick=\"%s.SpreadsheetControlNamesSetValue();\" style=\"font-size:x-small;\"> </td> <td style=\"vertical-align:top;padding-right:6px;\"> <div style=\"%tbt.\"> </div> <input type=\"button\" value=\"%loc!Save!\" onclick=\"%s.SpreadsheetControlNamesSave();\" style=\"font-size:x-small;\"> <input type=\"button\" value=\"%loc!Delete!\" onclick=\"%s.SpreadsheetControlNamesDelete()\" style=\"font-size:x-small;\"> </td> </tr></table></div>',\nview:\"sheet\",onclick:SocialCalc.SpreadsheetControlNamesOnclick,onunclick:SocialCalc.SpreadsheetControlNamesOnunclick});this.tabnums.clipboard=this.tabs.length;this.tabs.push({name:\"clipboard\",text:\"Clipboard\",html:'<div id=\"%id.clipboardtools\" class=\"SocialCalc-toolbar\" style=\"display:none;\"> <table cellspacing=\"0\" cellpadding=\"0\"><tr> <td style=\"vertical-align:top;padding-right:24px;\"><!- *tiddlywiki* begin /> <div style=\"%tbt.\">'+SocialCalc.Constants.s_clipboard_menu_title+'</div> </td> <td style=\"vertical-align:top;padding-right:16px;\"> <span style=\"%tbt.\">%loc!Tiddler! : </span> <input type=\"text\" id=\"%id.clipboard-tiddler\" onfocus=\"%s.CmdGotFocus(this);\"> </td> <td style=\"vertical-align:top;\"> <input type=\"button\" value=\"%loc!Export!\" id=\"%id.clipboard-export\" style=\"font-size:x-small;\"> <select id=\"%id.clipboard-export-select-source\" onfocus=\"%s.CmdGotFocus(this);\"></select> <span style=\"%tbt.\"> %loc!to! </span> <select id=\"%id.clipboard-export-select-format\" onfocus=\"%s.CmdGotFocus(this);\"></select> <div style=\"padding-top:4px;\"> <input type=\"button\" value=\"%loc!Import!\" id=\"%id.clipboard-import\" style=\"font-size:x-small;\"> </div><!- *tiddlywiki* end /> </td> </tr></table></div>',\nview:\"clipboard\",onclick:SocialCalc.SpreadsheetControlClipboardOnclick,onclickFocus:\"clipboardtext\"});this.views.clipboard={name:\"clipboard\",divStyle:\"overflow:auto;\",html:'<div style=\"width:100%;height:100%;overflow:hidden\"> <div style=\"font-size:x-small;padding:5px 0px 10px 0px;\"> <b>%loc!Display Clipboard in!:</b> <input type=\"radio\" id=\"%id.clipboardformat-tab\" name=\"%id.clipboardformat\" checked onclick=\"%s.SpreadsheetControlClipboardFormat(\\'tab\\');\"> %loc!Tab-delimited format! <input type=\"radio\" id=\"%id.clipboardformat-csv\" name=\"%id.clipboardformat\" onclick=\"%s.SpreadsheetControlClipboardFormat(\\'csv\\');\"> %loc!CSV format! <input type=\"radio\" id=\"%id.clipboardformat-scsave\" name=\"%id.clipboardformat\" onclick=\"%s.SpreadsheetControlClipboardFormat(\\'scsave\\');\"> %loc!SocialCalc-save format! </div> <input type=\"button\" value=\"%loc!Load SocialCalc Clipboard With This!\" style=\"font-size:x-small;\" onclick=\"%s.SpreadsheetControlClipboardLoad();\"> <input type=\"button\" value=\"%loc!Clear SocialCalc Clipboard!\" style=\"font-size:x-small;\" onclick=\"%s.SpreadsheetControlClipboardClear();\"> <textarea id=\"%id.clipboardtext\" style=\"width:100%;height:80%;font-size:small;overflow:auto;margin-top:5px;\" onfocus=\"%s.CmdGotFocus(this);\"></textarea></div>'}};\nSocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl=function(a,c,b,d){return SocialCalc.InitializeSpreadsheetControl(this,a,c,b,d)};SocialCalc.SpreadsheetControl.prototype.DoOnResize=function(){return SocialCalc.DoOnResize(this)};SocialCalc.SpreadsheetControl.prototype.SizeSSDiv=function(){return SocialCalc.SizeSSDiv(this)};SocialCalc.SpreadsheetControl.prototype.ExecuteCommand=function(a,c){return SocialCalc.SpreadsheetControlExecuteCommand(this,a,c)};\nSocialCalc.SpreadsheetControl.prototype.CreateSheetHTML=function(){return SocialCalc.SpreadsheetControlCreateSheetHTML(this)};SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave=function(a){return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this,a)};SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave=function(a){return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this,a)};\nSocialCalc.SpreadsheetControl.prototype.CreateCellHTML=function(a){return SocialCalc.SpreadsheetControlCreateCellHTML(this,a)};SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave=function(a){return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this,a)};SocialCalc.SpreadsheetControl.prototype.ParseSheetSave=function(a){return this.sheet.ParseSheetSave(a)};SocialCalc.SpreadsheetControl.prototype.CreateSheetSave=function(){return this.sheet.CreateSheetSave()};\nSocialCalc.InitializeSpreadsheetControl=function(a,c,b,d,e){var f=SocialCalc.Constants,g=SocialCalc.LocalizeString,l=SocialCalc.LocalizeSubstrings,h,m,p,r=a.tabs,q=a.views;a.requestedHeight=b;a.requestedWidth=d;a.requestedSpaceBelow=e;\"string\"==typeof c&&(c=document.getElementById(c));null==c&&alert(\"SocialCalc.SpreadsheetControl not given parent node.\");a.parentNode=c;a.spreadsheetDiv=document.createElement(\"div\");a.SizeSSDiv();for(b=c.firstChild;null!=b;b=c.firstChild)c.removeChild(b);b=TiddlyWiki?\n'<div><div style=\"'+a.toolbarbackground+'padding:0px 0px 0p 0px;\">':'<div><div style=\"'+a.toolbarbackground+'padding:12px 10px 10px 4px;height:40px;\">';for(d=0;d<r.length;d++)b+=r[d].html;b+=\"</div>\";b=TiddlyWiki?b+('<div style=\"'+a.tabbackground+'margin:0px 0px 8px 0px;\">'):b+('<div style=\"'+a.tabbackground+'padding-bottom:4px;margin:0px 0px 8px 0px;\">');if(TiddlyWiki)for(d=0;d<r.length;d++)b+='<div id=\"%id.'+r[d].name+'tab\" style=\"'+(0==d?a.tabselectedCSS:a.tabplainCSS)+'\" onclick=\"%s.SetTab(this);\">'+\ng(r[d].text)+\"</div>\";else{b+='<table cellpadding=\"0\" cellspacing=\"0\"><tr>';for(d=0;d<r.length;d++)b+=' <td id=\"%id.'+r[d].name+'tab\" style=\"'+(0==d?a.tabselectedCSS:a.tabplainCSS)+'\" onclick=\"%s.SetTab(this);\">'+g(r[d].text)+\"</td>\";b+=\" </tr></table>\"}b+=\"</div></div>\";a.currentTab=0;for(m in a.tabreplacements)b=b.replace(a.tabreplacements[m].regex,a.tabreplacements[m].replacement);b=b.replace(/\\%s\\./g,\"SocialCalc.\");b=b.replace(/\\%id\\./g,a.idPrefix);b=b.replace(/\\%tbt\\./g,a.toolbartext);b=b.replace(/\\%img\\./g,\na.imagePrefix);b=l(b);if(TiddlyWiki){e=/[\"][.]?[/]?images\\/(.+?)[\"]/g;for(var n;n=e.exec(b);)(d=TiddlyWiki.getModifiedImgSrc(n[0].replace(/\\\"/g,\"\")))&&(b=b.replace(n[0],'\"'+d+'\"'))}a.spreadsheetDiv.innerHTML=b;c.appendChild(a.spreadsheetDiv);a.Buttons={button_undo:{tooltip:\"Undo\",command:\"undo\"},button_redo:{tooltip:\"Redo\",command:\"redo\"},button_copy:{tooltip:\"Copy\",command:\"copy\"},button_cut:{tooltip:\"Cut\",command:\"cut\"},button_paste:{tooltip:\"Paste\",command:\"paste\"},button_pasteformats:{tooltip:\"Paste Formats\",\ncommand:\"pasteformats\"},button_lock:{tooltip:\"Lock\",command:\"lock\"},button_unlock:{tooltip:\"Unlock\",command:\"unlock\"},button_delete:{tooltip:\"Delete Contents\",command:\"delete\"},button_filldown:{tooltip:\"Fill Down\",command:\"filldown\"},button_fillright:{tooltip:\"Fill Right\",command:\"fillright\"},button_movefrom:{tooltip:\"Set/Clear Move From\",command:\"movefrom\"},button_movepaste:{tooltip:\"Move Paste\",command:\"movepaste\"},button_moveinsert:{tooltip:\"Move Insert\",command:\"moveinsert\"},button_alignleft:{tooltip:\"Align Left\",\ncommand:\"align-left\"},button_aligncenter:{tooltip:\"Align Center\",command:\"align-center\"},button_alignright:{tooltip:\"Align Right\",command:\"align-right\"},button_borderon:{tooltip:\"Borders On\",command:\"borderon\"},button_borderoff:{tooltip:\"Borders Off\",command:\"borderoff\"},button_swapcolors:{tooltip:\"Swap Colors\",command:\"swapcolors\"},button_merge:{tooltip:\"Merge Cells\",command:\"merge\"},button_unmerge:{tooltip:\"Unmerge Cells\",command:\"unmerge\"},button_insertrow:{tooltip:\"Insert Row\",command:\"insertrow\"},\nbutton_insertcol:{tooltip:\"Insert Column\",command:\"insertcol\"},button_deleterow:{tooltip:\"Delete Row\",command:\"deleterow\"},button_deletecol:{tooltip:\"Delete Column\",command:\"deletecol\"},button_hiderow:{tooltip:\"Hide Row\",command:\"hiderow\"},button_hidecol:{tooltip:\"Hide Column\",command:\"hidecol\"},button_recalc:{tooltip:\"Recalc\",command:\"recalc\"}};for(p in a.Buttons)(c=document.getElementById(a.idPrefix+p))?(c.style.border=\"1px solid \"+f.ISCButtonBorderNormal,SocialCalc.TooltipRegister(c,g(a.Buttons[p].tooltip),\n{},a.spreadsheetDiv),SocialCalc.ButtonRegister(a.editor,c,{normalstyle:\"border:1px solid \"+f.ISCButtonBorderNormal+\";backgroundColor:\"+f.ISCButtonBorderNormal+\";\",hoverstyle:\"border:1px solid \"+f.ISCButtonBorderHover+\";backgroundColor:\"+f.ISCButtonBorderNormal+\";\",downstyle:\"border:1px solid \"+f.ISCButtonBorderDown+\";backgroundColor:\"+f.ISCButtonDownBackground+\";\"},{MouseDown:SocialCalc.DoButtonCmd,command:a.Buttons[p].command})):alert(\"Button \"+(a.idPrefix+p)+\" missing\");TiddlyWiki?(a.formulabarDiv=\ndocument.createElement(\"div\"),a.formulabarDiv.style=\"margin: 0px 0px 8px 0px;\",a.formulabarDiv.innerHTML='<input type=\"text\" style=\"width:70%;margin-right:4px;\" value=\"\">'):(a.formulabarDiv=document.createElement(\"div\"),a.formulabarDiv.style.height=a.formulabarheight+\"px\",a.formulabarDiv.innerHTML='<input type=\"text\" size=\"60\" value=\"\"> ');a.spreadsheetDiv.appendChild(a.formulabarDiv);f=new SocialCalc.InputBox(a.formulabarDiv.firstChild,a.editor);TiddlyWiki&&SocialCalc.CmdGotFocus(f.element);\nfor(p in a.formulabuttons){c=document.createElement(\"img\");c.id=a.idPrefix+p;if(TiddlyWiki){if(d=(a.formulabuttons[p].skipImagePrefix?\"\":a.imagePrefix)+a.formulabuttons[p].image,d=TiddlyWiki.getModifiedImgSrc(d))c.src=d}else c.src=(a.formulabuttons[p].skipImagePrefix?\"\":a.imagePrefix)+a.formulabuttons[p].image;c.style.verticalAlign=\"middle\";c.style.border=\"1px solid #FFF\";c.style.marginLeft=\"4px\";SocialCalc.TooltipRegister(c,g(a.formulabuttons[p].tooltip),{},a.spreadsheetDiv);SocialCalc.ButtonRegister(a.editor,\nc,{normalstyle:\"border:1px solid #FFF;backgroundColor:#FFF;\",hoverstyle:\"border:1px solid #CCC;backgroundColor:#FFF;\",downstyle:\"border:1px solid #000;backgroundColor:#FFF;\"},{MouseDown:a.formulabuttons[p].command,Disabled:function(){return a.editor.ECellReadonly()}});a.formulabarDiv.appendChild(c)}for(d=0;d<r.length;d++)if(r[d].oncreate)r[d].oncreate(a,r[d].name);a.nonviewheight=a.statuslineheight+a.spreadsheetDiv.firstChild.offsetHeight+a.spreadsheetDiv.lastChild.offsetHeight;a.viewheight=a.height-\na.nonviewheight;a.editorDiv=a.editor.CreateTableEditor(a.width,a.viewheight);a.spreadsheetDiv.appendChild(a.editorDiv);for(h in q){b=q[h].html;for(m in q[h].replacements)b=b.replace(q[h].replacements[m].regex,q[h].replacements[m].replacement);b=b.replace(/\\%s\\./g,\"SocialCalc.\");b=b.replace(/\\%id\\./g,a.idPrefix);b=b.replace(/\\%tbt\\./g,a.toolbartext);b=b.replace(/\\%img\\./g,a.imagePrefix);g=document.createElement(\"div\");SocialCalc.setStyles(g,q[h].divStyle);g.style.display=\"none\";g.style.width=a.width+\n\"px\";g.style.height=a.viewheight+\"px\";g.id=a.idPrefix+q[h].name+\"view\";b=l(b);g.innerHTML=b;a.spreadsheetDiv.appendChild(g);q[h].element=g;if(q[h].oncreate)q[h].oncreate(a,q[h])}q.sheet={name:\"sheet\",element:a.editorDiv};a.statuslineDiv=document.createElement(\"div\");TiddlyWiki?a.statuslineDiv.setAttribute(\"class\",\"SocialCalc-statusline\"):(a.statuslineDiv.style.cssText=a.statuslineCSS,a.statuslineDiv.style.height=a.statuslineheight-(a.statuslineDiv.style.paddingTop.slice(0,-2)-0)-(a.statuslineDiv.style.paddingBottom.slice(0,\n-2)-0)+\"px\");a.statuslineDiv.id=a.idPrefix+\"statusline\";a.spreadsheetDiv.appendChild(a.statuslineDiv);TiddlyWiki&&a.spreadsheetDiv.setAttribute(\"tabindex\",\"0\");if(a.spreadsheetDiv.addEventListener)a.spreadsheetDiv.addEventListener(\"mousedown\",function(){SocialCalc.SetSpreadsheetControlObject(a);TiddlyWiki&&(a.tiddlyWiki.saveTodo.flagStart=!0)},!1),a.spreadsheetDiv.addEventListener(\"mouseover\",function(){SocialCalc.SetSpreadsheetControlObject(a)},!1);else if(a.spreadsheetDiv.attachEvent)a.spreadsheetDiv.attachEvent(\"onmousedown\",\nfunction(){SocialCalc.SetSpreadsheetControlObject(a)}),a.spreadsheetDiv.attachEvent(\"onmouseover\",function(){SocialCalc.SetSpreadsheetControlObject(a)});else throw SocialCalc.Constants.s_BrowserNotSupported;};SocialCalc.LocalizeString=function(a){var c=SocialCalc.LocalizeStringList[a];c||(c=SocialCalc.Constants[\"s_loc_\"+a.toLowerCase().replace(/\\s/g,\"_\").replace(/\\W/g,\"X\")]||a,SocialCalc.LocalizeStringList[a]=c);return c};SocialCalc.LocalizeStringList={};\nSocialCalc.LocalizeSubstrings=function(a){var c=SocialCalc.LocalizeString;return a.replace(/%(loc|ssc)!(.*?)!/g,function(a,d,e){return\"ssc\"==d?SocialCalc.Constants[e]||alert(\"Missing constant: \"+e):c(e)})};SocialCalc.GetSpreadsheetControlObject=function(){var a=SocialCalc.CurrentSpreadsheetControlObject;if(a)return a};SocialCalc.SetSpreadsheetControlObject=function(a){SocialCalc.CurrentSpreadsheetControlObject=a;a.keyboard.focusTable&&a&&(a.keyboard.focusTable=a.editor)};\nSocialCalc.DoOnResize=function(a){var c,b=a.views;TiddlyWiki&&(a.keyboard.areListener=!1);if(a.SizeSSDiv()){for(vname in b)c=b[vname].element,c.style.width=a.width+\"px\",c.style.height=a.height-a.nonviewheight+\"px\";a.editor.ResizeTableEditor(a.width,a.height-a.nonviewheight)}};\nSocialCalc.SizeSSDiv=function(a){var c,b=!1,d;c=SocialCalc.GetViewportInfo();d=a.requestedHeight||c.height-(a.requestedSpaceBelow||0);a.height!=d&&(a.height=d,a.spreadsheetDiv.style.height=d+\"px\",b=!0);d=a.requestedWidth||c.width;a.width!=d&&(a.width=d,a.spreadsheetDiv.style.width=d+\"px\",b=!0);a.spreadsheetDiv.style.position=\"relative\";return b};\nSocialCalc.SetTab=function(a){var c,b,d,e,f,g={},l={},h=SocialCalc.GetSpreadsheetControlObject(),m=h.tabs,p=h.views;a=\"string\"==typeof a?a:a.id.slice(h.idPrefix.length,-3);if(h.editor.busy&&(!m[h.currentTab].view||\"sheet\"==m[h.currentTab].view))for(e=0;e<m.length;e++)if(m[e].name==a&&m[e].view&&\"sheet\"!=m[e].view)return;if(h.tabs[h.currentTab].onunclick)h.tabs[h.currentTab].onunclick(h,h.tabs[h.currentTab].name);for(e=0;e<m.length;e++)c=m[e].name,g[c]=document.getElementById(h.idPrefix+c+\"tab\"),l[c]=\ndocument.getElementById(h.idPrefix+c+\"tools\"),c==a?(b=e,l[c].style.display=\"block\",g[c].style.cssText=h.tabselectedCSS):(l[c].style.display=\"none\",g[c].style.cssText=h.tabplainCSS);h.currentTab=b;if(m[b].onclick)m[b].onclick(h,a);for(f in p)!m[b].view&&\"sheet\"==f||m[b].view==f?(p[f].element.style.display=\"block\",d=f):p[f].element.style.display=\"none\";m[b].onclickFocus?(b=m[b].onclickFocus,\"string\"==typeof b&&(b=document.getElementById(h.idPrefix+b),b.focus()),SocialCalc.CmdGotFocus(b)):SocialCalc.KeyboardFocus();\np[d].needsresize&&p[d].onresize&&(p[d].needsresize=!1,p[d].onresize(h,p[d]));\"sheet\"==d?(h.statuslineDiv.style.display=\"block\",h.editor.ScheduleRender()):h.statuslineDiv.style.display=\"none\"};\nSocialCalc.SpreadsheetControlStatuslineCallback=function(a,c,b,d){var e=document.getElementById(d.statuslineid);e&&(e.innerHTML=a.GetStatuslineString(c,b,d));switch(c){case \"cmdendnorender\":case \"calcfinished\":case \"doneposcalc\":c=document.getElementById(d.recalcid1);d=document.getElementById(d.recalcid2);if(!c||!d)break;\"yes\"==a.context.sheetobj.attribs.needsrecalc?(c.style.display=\"inline\",d.style.display=\"inline\"):(c.style.display=\"none\",d.style.display=\"none\")}};\nSocialCalc.UpdateSortRangeProposal=function(a){document.getElementById(SocialCalc.GetSpreadsheetControlObject().idPrefix+\"sortlist\").options[0].text=a.range.hasrange?SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom):SocialCalc.LocalizeString(\"[select range]\")};\nSocialCalc.LoadColumnChoosers=function(a){var c=SocialCalc.LocalizeString,b,d,e,f;a.sortrange&&-1==a.sortrange.indexOf(\":\")?(b=SocialCalc.Formula.LookupName(a.sheet,a.sortrange||\"\"),\"range\"==b.type?(b=b.value.match(/^(.*)\\|(.*)\\|$/),b=b[1]+\":\"+b[2]):b=\"A1:A1\"):b=a.sortrange;var g=SocialCalc.ParseRange(b);e=document.getElementById(a.idPrefix+\"majorsort\");f=e.selectedIndex;e.options.length=0;e.options[e.options.length]=new Option(c(\"[None]\"),\"\");for(b=g.cr1.col;b<=g.cr2.col;b++)d=SocialCalc.rcColname(b),\ne.options[e.options.length]=new Option(c(\"Column \")+d,d);e.selectedIndex=1<f&&f<=g.cr2.col-g.cr1.col+1?f:1;e=document.getElementById(a.idPrefix+\"minorsort\");f=e.selectedIndex;e.options.length=0;e.options[e.options.length]=new Option(c(\"[None]\"),\"\");for(b=g.cr1.col;b<=g.cr2.col;b++)d=SocialCalc.rcColname(b),e.options[e.options.length]=new Option(d,d);e.selectedIndex=0<f&&f<=g.cr2.col-g.cr1.col+1?f:0;e=document.getElementById(a.idPrefix+\"lastsort\");f=e.selectedIndex;e.options.length=0;e.options[e.options.length]=\nnew Option(c(\"[None]\"),\"\");for(b=g.cr1.col;b<=g.cr2.col;b++)d=SocialCalc.rcColname(b),e.options[e.options.length]=new Option(d,d);e.selectedIndex=0<f&&f<=g.cr2.col-g.cr1.col+1?f:0};SocialCalc.CmdGotFocus=function(a){SocialCalc.GetSpreadsheetControlObject().keyboard.passThru=a};SocialCalc.DoButtonCmd=function(a,c,b){SocialCalc.DoCmd(b.element,b.functionobj.command)};\nSocialCalc.DoCmd=function(a,c){var b,d,e,f,g,l;f=SocialCalc.GetSpreadsheetControlObject();e=f.editor;switch(c){case \"undo\":f.ExecuteCommand(\"undo\",\"\");break;case \"redo\":f.ExecuteCommand(\"redo\",\"\");break;case \"fill-rowcolstuff\":case \"fill-text\":e=c.substring(5);d=document.getElementById(f.idPrefix+e+\"list\");for(b=d.length=0;b<SocialCalc.SpreadsheetCmdTable[e].length;b++)d.options[b]=new Option(SocialCalc.SpreadsheetCmdTable[e][b].t);c=\"changed-\"+e;case \"changed-rowcolstuff\":case \"changed-text\":e=c.substring(8);\nd=document.getElementById(f.idPrefix+e+\"list\");d=SocialCalc.SpreadsheetCmdTable.slists[SocialCalc.SpreadsheetCmdTable[e][d.selectedIndex].s];f=document.getElementById(f.idPrefix+e+\"slist\");for(b=f.length=0;b<(d.length||0);b++)f.options[b]=new Option(d[b].t,d[b].s);return;case \"ok-rowcolstuff\":case \"ok-text\":e=c.substring(3);d=document.getElementById(f.idPrefix+e+\"list\");f=document.getElementById(f.idPrefix+e+\"slist\");b=SocialCalc.SpreadsheetCmdTable[e][d.selectedIndex].c;d=f[f.selectedIndex].value;\nSocialCalc.SpreadsheetControlExecuteCommand(a,b,d);break;case \"ok-setsort\":b=document.getElementById(f.idPrefix+\"sortlist\");f.sortrange=0==b.selectedIndex?e.range.hasrange?SocialCalc.crToCoord(e.range.left,e.range.top)+\":\"+SocialCalc.crToCoord(e.range.right,e.range.bottom):e.ecell.coord+\":\"+e.ecell.coord:b.options[b.selectedIndex].value;d=document.getElementById(f.idPrefix+\"sortbutton\");d.value=SocialCalc.LocalizeString(\"Sort \")+f.sortrange;d.style.visibility=\"visible\";SocialCalc.LoadColumnChoosers(f);\na&&a.blur&&a.blur();SocialCalc.KeyboardFocus();return;case \"dosort\":if(f.sortrange&&-1==f.sortrange.indexOf(\":\")){e=SocialCalc.Formula.LookupName(f.sheet,f.sortrange||\"\");if(\"range\"!=e.type)return;e=e.value.match(/^(.*)\\|(.*)\\|$/);e=e[1]+\":\"+e[2]}else e=f.sortrange;if(\"A1:A1\"==e)return;b=\"sort \"+e+\" \";e=document.getElementById(f.idPrefix+\"majorsort\");d=document.getElementById(f.idPrefix+\"majorsortup\");b+=e.options[e.selectedIndex].value+(d.checked?\" up\":\" down\");e=document.getElementById(f.idPrefix+\n\"minorsort\");0<e.selectedIndex&&(d=document.getElementById(f.idPrefix+\"minorsortup\"),b+=\" \"+e.options[e.selectedIndex].value+(d.checked?\" up\":\" down\"));e=document.getElementById(f.idPrefix+\"lastsort\");0<e.selectedIndex&&(d=document.getElementById(f.idPrefix+\"lastsortup\"),b+=\" \"+e.options[e.selectedIndex].value+(d.checked?\" up\":\" down\"));f.ExecuteCommand(b,\"\");break;case \"merge\":b=SocialCalc.SpreadsheetCmdLookup[c]||\"\";d=SocialCalc.SpreadsheetCmdSLookup[c]||\"\";f.ExecuteCommand(b,d);e.range.hasrange&&\n(e.MoveECell(SocialCalc.crToCoord(e.range.left,e.range.top)),e.RangeRemove());break;case \"movefrom\":e.range2.hasrange?(f.context.cursorsuffix=\"\",e.Range2Remove(),f.ExecuteCommand(\"redisplay\",\"\")):e.range.hasrange?(e.range2.top=e.range.top,e.range2.right=e.range.right,e.range2.bottom=e.range.bottom,e.range2.left=e.range.left,e.range2.hasrange=!0,e.MoveECell(SocialCalc.crToCoord(e.range.left,e.range.top))):(e.range2.top=e.ecell.row,e.range2.right=e.ecell.col,e.range2.bottom=e.ecell.row,e.range2.left=\ne.ecell.col,e.range2.hasrange=!0);b=e.range2.hasrange?\"\":\"off\";d=document.getElementById(f.idPrefix+\"button_movefrom\");d.src=f.imagePrefix+\"movefrom\"+b+\".gif\";d=document.getElementById(f.idPrefix+\"button_movepaste\");d.src=f.imagePrefix+\"movepaste\"+b+\".gif\";d=document.getElementById(f.idPrefix+\"button_moveinsert\");d.src=f.imagePrefix+\"moveinsert\"+b+\".gif\";e.range2.hasrange&&e.RangeRemove();break;case \"movepaste\":case \"moveinsert\":e.range2.hasrange&&(f.context.cursorsuffix=\"\",b=c+\" \"+SocialCalc.crToCoord(e.range2.left,\ne.range2.top)+\":\"+SocialCalc.crToCoord(e.range2.right,e.range2.bottom)+\" \"+e.ecell.coord,f.ExecuteCommand(b,\"\"),e.Range2Remove(),d=document.getElementById(f.idPrefix+\"button_movefrom\"),d.src=f.imagePrefix+\"movefromoff.gif\",d=document.getElementById(f.idPrefix+\"button_movepaste\"),d.src=f.imagePrefix+\"movepasteoff.gif\",d=document.getElementById(f.idPrefix+\"button_moveinsert\"),d.src=f.imagePrefix+\"moveinsertoff.gif\");break;case \"swapcolors\":b=f.sheet;g=b.GetAssuredCell(e.ecell.coord);d=b.attribs.defaultcolor?\nb.colors[b.attribs.defaultcolor]:\"rgb(0,0,0)\";l=b.attribs.defaultbgcolor?b.colors[b.attribs.defaultbgcolor]:\"rgb(255,255,255)\";e=g.color?b.colors[g.color]:d;e==l&&(e=\"\");b=g.bgcolor?b.colors[g.bgcolor]:l;b==d&&(b=\"\");f.ExecuteCommand(\"set %C color \"+b+\"%Nset %C bgcolor \"+e,\"\");break;default:b=SocialCalc.SpreadsheetCmdLookup[c]||\"\",d=SocialCalc.SpreadsheetCmdSLookup[c]||\"\",f.ExecuteCommand(b,d)}a&&a.blur&&a.blur();SocialCalc.KeyboardFocus()};\nSocialCalc.SpreadsheetCmdLookup={copy:\"copy %C all\",cut:\"cut %C all\",paste:\"paste %C all\",pasteformats:\"paste %C formats\",lock:\"set %C readonly yes\",unlock:\"set %C readonly no\",\"delete\":\"erase %C formulas\",filldown:\"filldown %C all\",fillright:\"fillright %C all\",erase:\"erase %C all\",borderon:\"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S\",borderoff:\"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S\",merge:\"merge %C\",unmerge:\"unmerge %C\",\"align-left\":\"set %C cellformat left\",\"align-center\":\"set %C cellformat center\",\n\"align-right\":\"set %C cellformat right\",\"align-default\":\"set %C cellformat\",insertrow:\"insertrow %C\",insertcol:\"insertcol %C\",deleterow:\"deleterow %C\",deletecol:\"deletecol %C\",hiderow:\"set %H hide yes\",hidecol:\"set %W hide yes\",undo:\"undo\",redo:\"redo\",recalc:\"recalc\"};SocialCalc.SpreadsheetCmdSLookup={borderon:\"1px solid rgb(0,0,0)\",borderoff:\"\"};\nSocialCalc.SpreadsheetControlExecuteCommand=function(a,c,b){a=SocialCalc.GetSpreadsheetControlObject().editor;var d,e,f,g;a.range.hasrange?(e=d=SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom),f=SocialCalc.rcColname(a.range.left)+\":\"+SocialCalc.rcColname(a.range.right),g=a.range.top+\":\"+a.range.bottom):(e=a.ecell.coord,d=a.ecell.coord+\":\"+a.ecell.coord,f=SocialCalc.rcColname(SocialCalc.coordToCr(a.ecell.coord).col),g=SocialCalc.coordToCr(a.ecell.coord).row);\nc=c.replace(/%C/g,e);c=c.replace(/%R/g,d);c=c.replace(/%N/g,\"\\n\");c=c.replace(/%S/g,b);c=c.replace(/%W/g,f);c=c.replace(/%H/g,g);c=c.replace(/%P/g,\"%\");a.EditorScheduleSheetCommands(c,!0,!1)};SocialCalc.SpreadsheetControlCreateSheetHTML=function(a){var c,b;c=\"\";c=new SocialCalc.RenderContext(a.sheet);a=document.createElement(\"div\");b=c.RenderSheet(null,{type:\"html\"});a.appendChild(b);delete c;c=a.innerHTML;delete b;delete a;return c};\nSocialCalc.SpreadsheetControlCreateCellHTML=function(a,c,b){var d=\"\",d=a.sheet.cells[c];if(!d)return\"\";d=void 0==d.displaystring?SocialCalc.FormatValueForDisplay(a.sheet,d.datavalue,c,b||a.context.defaultHTMLlinkstyle):d.displaystring;\" \"==d&&(d=\"\");return d};\nSocialCalc.SpreadsheetControlCreateCellHTMLSave=function(a,c,b){var d,e,f,g,l,h=[];d=c?SocialCalc.ParseRange(c):{cr1:{row:1,col:1},cr2:{row:a.sheet.attribs.lastrow,col:a.sheet.attribs.lastcol}};c=d.cr1;d=d.cr2;h.push(\"version:1.0\");for(e=c.row;e<=d.row;e++)for(f=c.col;f<=d.col;f++)if(g=SocialCalc.crToCoord(f,e),l=a.sheet.cells[g])l=void 0==l.displaystring?SocialCalc.FormatValueForDisplay(a.sheet,l.datavalue,g,b||a.context.defaultHTMLlinkstyle):l.displaystring,\" \"!=l&&h.push(g+\":\"+SocialCalc.encodeForSave(l));\nh.push(\"\");return h.join(\"\\n\")};\nSocialCalc.SpreadsheetControl.DoFunctionList=function(){var a,c,b=SocialCalc.Formula,d=SocialCalc.Constants.function_classlist,e=SocialCalc.GetSpreadsheetControlObject(),f=e.idPrefix+\"function\";c=document.getElementById(f+\"dialog\");if(!c){b.FillFunctionInfo();c='<table><tr><td><span style=\"font-size:x-small;font-weight:bold\">%loc!Category!</span><br><select id=\"'+f+'class\" size=\"'+d.length+'\" style=\"width:120px;\" onchange=\"SocialCalc.SpreadsheetControl.FunctionClassChosen(this.options[this.selectedIndex].value);\">';for(a=\n0;a<d.length;a++)c+='<option value=\"'+d[a]+'\"'+(0==a?\" selected>\":\">\")+SocialCalc.special_chars(b.FunctionClasses[d[a]].name)+\"</option>\";c+='</select></td><td> </td><td id=\"'+f+'list\"><span style=\"font-size:x-small;font-weight:bold\">%loc!Functions!</span><br><select id=\"'+f+'name\" size=\"'+d.length+'\" style=\"width:240px;\" onchange=\"SocialCalc.SpreadsheetControl.FunctionChosen(this.options[this.selectedIndex].value);\" ondblclick=\"SocialCalc.SpreadsheetControl.DoFunctionPaste();\">';c+=SocialCalc.SpreadsheetControl.GetFunctionNamesStr(\"all\");\nc+='</td></tr><tr><td colspan=\"3\"><div id=\"'+f+'desc\" style=\"width:380px;height:80px;overflow:auto;font-size:x-small;\">'+SocialCalc.SpreadsheetControl.GetFunctionInfoStr(b.FunctionClasses[d[0]].items[0])+'</div><div style=\"width:380px;text-align:right;padding-top:6px;font-size:small;\"><input type=\"button\" value=\"%loc!Paste!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.DoFunctionPaste();\"> <input type=\"button\" value=\"%loc!Cancel!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.HideFunctions();\"></div></td></tr></table>';\nb=document.createElement(\"div\");b.id=f+\"dialog\";b.style.position=\"absolute\";d=SocialCalc.GetViewportInfo();a=SocialCalc.GetElementPositionWithScroll(e.spreadsheetDiv);b.style.top=d.height/3-a.top+\"px\";b.style.left=d.width/3-a.left+\"px\";b.style.zIndex=100;b.style.backgroundColor=\"#FFF\";b.style.border=\"1px solid black\";b.style.width=\"400px\";c=SocialCalc.LocalizeSubstrings('<table cellspacing=\"0\" cellpadding=\"0\" style=\"border-bottom:1px solid black;\"><tr><td style=\"font-size:10px;cursor:default;width:100%;background-color:#999;color:#FFF;\"> %loc!Function List!</td><td style=\"font-size:10px;cursor:default;color:#666;\" onclick=\"SocialCalc.SpreadsheetControl.HideFunctions();\"> X </td></tr></table><div class=\"SocialCalc-functiondialogbody\" style=\"background-color:#DDD;\">'+\nc+\"</div>\");b.innerHTML=c;SocialCalc.DragRegister(b.firstChild.firstChild.firstChild.firstChild,!0,!0,{MouseDown:SocialCalc.DragFunctionStart,MouseMove:SocialCalc.DragFunctionPosition,MouseUp:SocialCalc.DragFunctionPosition,Disabled:null,positionobj:b},e.spreadsheetDiv);e.spreadsheetDiv.appendChild(b);c=document.getElementById(f+\"name\");c.focus();SocialCalc.CmdGotFocus(c)}};\nSocialCalc.SpreadsheetControl.GetFunctionNamesStr=function(a){var c,b=\"\";c=SocialCalc.Formula.FunctionClasses[a];for(a=0;a<c.items.length;a++)b+='<option value=\"'+c.items[a]+'\"'+(0==a?\" selected>\":\">\")+c.items[a]+\"</option>\";return b};SocialCalc.SpreadsheetControl.FillFunctionNames=function(a,c){var b,d;b=SocialCalc.Formula;c.length=0;d=b.FunctionClasses[a];for(b=0;b<d.items.length;b++)c.options[b]=new Option(d.items[b],d.items[b]),0==b&&(c.options[b].selected=!0)};\nSocialCalc.SpreadsheetControl.GetFunctionInfoStr=function(a){var c=SocialCalc.Formula,b=c.FunctionList[a],d=SocialCalc.special_chars;a=\"<b>\"+a+\"(\"+d(c.FunctionArgString(a))+\")</b><br>\";return a+=d(b[3])};SocialCalc.SpreadsheetControl.FunctionClassChosen=function(a){var c=SocialCalc.GetSpreadsheetControlObject().idPrefix+\"function\",b=SocialCalc.Formula;SocialCalc.SpreadsheetControl.FillFunctionNames(a,document.getElementById(c+\"name\"));SocialCalc.SpreadsheetControl.FunctionChosen(b.FunctionClasses[a].items[0])};\nSocialCalc.SpreadsheetControl.FunctionChosen=function(a){var c=SocialCalc.GetSpreadsheetControlObject().idPrefix+\"function\";document.getElementById(c+\"desc\").innerHTML=SocialCalc.SpreadsheetControl.GetFunctionInfoStr(a)};SocialCalc.SpreadsheetControl.HideFunctions=function(){var a=SocialCalc.GetSpreadsheetControlObject(),a=document.getElementById(a.idPrefix+\"functiondialog\");a.innerHTML=\"\";SocialCalc.DragUnregister(a);SocialCalc.KeyboardFocus();a.parentNode&&a.parentNode.removeChild(a)};\nSocialCalc.SpreadsheetControl.DoFunctionPaste=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=a.editor,b=document.getElementById(a.idPrefix+\"functionname\"),a=document.getElementById(a.idPrefix+\"multilinetextarea\"),b=b.value+\"(\";SocialCalc.SpreadsheetControl.HideFunctions();a?(a.value+=b,a.focus(),SocialCalc.CmdGotFocus(a)):c.EditorAddToInput(b,\"=\")};\nSocialCalc.SpreadsheetControl.DoMultiline=function(){var a=SocialCalc.LocalizeSubstrings,c,b,d=SocialCalc.GetSpreadsheetControlObject(),e=d.editor,f=e.workingvalues,d=SocialCalc.GetSpreadsheetControlObject(),g=d.idPrefix+\"multiline\";c=document.getElementById(g+\"dialog\");if(!c){switch(e.state){case \"start\":f.ecoord=e.ecell.coord;f.erow=e.ecell.row;f.ecol=e.ecell.col;e.RangeRemove();b=SocialCalc.GetCellContents(e.context.sheetobj,f.ecoord);break;case \"input\":case \"inputboxdirect\":b=e.inputBox.GetText()}e.inputBox.element.disabled=\n!0;b=SocialCalc.special_chars(b);c='<textarea id=\"'+g+'textarea\" style=\"width:380px;height:120px;margin:10px 0px 0px 6px;\">'+b+'</textarea><div style=\"width:380px;text-align:right;padding:6px 0px 4px 6px;font-size:small;\">'+a('<input type=\"button\" value=\"%loc!Set Cell Contents!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.DoMultilinePaste();\"> <input type=\"button\" value=\"%loc!Clear!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.DoMultilineClear();\"> <input type=\"button\" value=\"%loc!Cancel!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.HideMultiline();\"></div></div>');\nb=document.createElement(\"div\");b.id=g+\"dialog\";b.style.position=\"absolute\";e=SocialCalc.GetViewportInfo();f=SocialCalc.GetElementPositionWithScroll(d.spreadsheetDiv);b.style.top=e.height/3-f.top+\"px\";b.style.left=e.width/3-f.left+\"px\";b.style.zIndex=100;b.style.backgroundColor=\"#FFF\";b.style.border=\"1px solid black\";b.style.width=\"400px\";b.innerHTML='<table cellspacing=\"0\" cellpadding=\"0\" style=\"border-bottom:1px solid black;\"><tr><td style=\"font-size:10px;cursor:default;width:100%;background-color:#999;color:#FFF;\">'+\na(\" %loc!Multi-line Input Box!\")+'</td><td style=\"font-size:10px;cursor:default;color:#666;\" onclick=\"SocialCalc.SpreadsheetControl.HideMultiline();\"> X </td></tr></table><div style=\"background-color:#DDD;\">'+c+\"</div>\";SocialCalc.DragRegister(b.firstChild.firstChild.firstChild.firstChild,!0,!0,{MouseDown:SocialCalc.DragFunctionStart,MouseMove:SocialCalc.DragFunctionPosition,MouseUp:SocialCalc.DragFunctionPosition,Disabled:null,positionobj:b},d.spreadsheetDiv);d.spreadsheetDiv.appendChild(b);\nc=document.getElementById(g+\"textarea\");c.focus();SocialCalc.CmdGotFocus(c)}};SocialCalc.SpreadsheetControl.HideMultiline=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=a.editor,a=document.getElementById(a.idPrefix+\"multilinedialog\");a.innerHTML=\"\";SocialCalc.DragUnregister(a);SocialCalc.KeyboardFocus();a.parentNode&&a.parentNode.removeChild(a);switch(c.state){case \"start\":c.inputBox.DisplayCellContents(null);break;case \"input\":case \"inputboxdirect\":c.inputBox.element.disabled=!1,c.inputBox.Focus()}};\nSocialCalc.SpreadsheetControl.DoMultilineClear=function(){var a=SocialCalc.GetSpreadsheetControlObject(),a=document.getElementById(a.idPrefix+\"multilinetextarea\");a.value=\"\";a.focus()};\nSocialCalc.SpreadsheetControl.DoMultilinePaste=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=a.editor,b=c.workingvalues,a=document.getElementById(a.idPrefix+\"multilinetextarea\").value;SocialCalc.SpreadsheetControl.HideMultiline();switch(c.state){case \"start\":b.partialexpr=\"\";b.ecoord=c.ecell.coord;b.erow=c.ecell.row;b.ecol=c.ecell.col;break;case \"input\":case \"inputboxdirect\":c.inputBox.Blur(),c.inputBox.ShowInputBox(!1),c.state=\"start\"}c.EditorSaveEdit(a)};\nSocialCalc.SpreadsheetControl.DoLink=function(){var a=SocialCalc.LocalizeString,c,b,d,e,f=SocialCalc.GetSpreadsheetControlObject();d=f.editor;e=d.workingvalues;var f=SocialCalc.GetSpreadsheetControlObject(),g=f.idPrefix+\"link\";b=document.getElementById(g+\"dialog\");if(!b){switch(d.state){case \"start\":e.ecoord=d.ecell.coord;e.erow=d.ecell.row;e.ecol=d.ecell.col;d.RangeRemove();c=SocialCalc.GetCellContents(d.context.sheetobj,e.ecoord);break;case \"input\":case \"inputboxdirect\":c=d.inputBox.GetText()}d.inputBox.element.disabled=\n!0;\"'\"==c.charAt(0)&&(c=c.slice(1));b=SocialCalc.ParseCellLinkText(c);SocialCalc.special_chars(c);d=(c=f.sheet.cells[d.ecell.coord])&&c.textvalueformat?\"\":\" checked\";e=b.newwin?\" checked\":\"\";c='<div style=\"padding:6px 0px 4px 6px;\"><span style=\"font-size:smaller;\">'+a(\"Description\")+'</span><br><input type=\"text\" id=\"'+g+'desc\" style=\"width:380px;\" value=\"'+SocialCalc.special_chars(b.desc)+'\"><br><span style=\"font-size:smaller;\">'+a(\"URL\")+'</span><br><input type=\"text\" id=\"'+g+'url\" style=\"width:380px;\" value=\"'+\nSocialCalc.special_chars(b.url)+'\"><br>';SocialCalc.Callbacks.MakePageLink&&(c+='<span style=\"font-size:smaller;\">'+a(\"Page Name\")+'</span><br><input type=\"text\" id=\"'+g+'pagename\" style=\"width:380px;\" value=\"'+SocialCalc.special_chars(b.pagename)+'\"><br><span style=\"font-size:smaller;\">'+a(\"Workspace\")+'</span><br><input type=\"text\" id=\"'+g+'workspace\" style=\"width:380px;\" value=\"'+SocialCalc.special_chars(b.workspace)+'\"><br>');c+=SocialCalc.LocalizeSubstrings('<input type=\"checkbox\" id=\"'+g+'format\"'+\nd+'> <span style=\"font-size:smaller;\">%loc!Set to Link format!</span><br><input type=\"checkbox\" id=\"'+g+'popup\"'+e+'> <span style=\"font-size:smaller;\">%loc!Show in new browser window!</span></div><div style=\"width:380px;text-align:right;padding:6px 0px 4px 6px;font-size:small;\"><input type=\"button\" value=\"%loc!Set Cell Contents!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.DoLinkPaste();\"> <input type=\"button\" value=\"%loc!Clear!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.DoLinkClear();\"> <input type=\"button\" value=\"%loc!Cancel!\" style=\"font-size:smaller;\" onclick=\"SocialCalc.SpreadsheetControl.HideLink();\"></div></div>');\nb=document.createElement(\"div\");b.id=g+\"dialog\";b.style.position=\"absolute\";d=SocialCalc.GetViewportInfo();e=SocialCalc.GetElementPositionWithScroll(f.spreadsheetDiv);b.style.top=d.height/3-e.top+\"px\";b.style.left=d.width/3-e.left+\"px\";b.style.zIndex=100;b.style.backgroundColor=\"#FFF\";b.style.border=\"1px solid black\";b.style.width=\"400px\";b.innerHTML='<table cellspacing=\"0\" cellpadding=\"0\" style=\"border-bottom:1px solid black;\"><tr><td style=\"font-size:10px;cursor:default;width:100%;background-color:#999;color:#FFF;\"> '+\na(\"Link Input Box\")+'</td><td style=\"font-size:10px;cursor:default;color:#666;\" onclick=\"SocialCalc.SpreadsheetControl.HideLink();\"> X </td></tr></table><div style=\"background-color:#DDD;\">'+c+\"</div>\";SocialCalc.DragRegister(b.firstChild.firstChild.firstChild.firstChild,!0,!0,{MouseDown:SocialCalc.DragFunctionStart,MouseMove:SocialCalc.DragFunctionPosition,MouseUp:SocialCalc.DragFunctionPosition,Disabled:null,positionobj:b},f.spreadsheetDiv);f.spreadsheetDiv.appendChild(b);b=document.getElementById(g+\n\"url\");b.focus();SocialCalc.CmdGotFocus(b)}};SocialCalc.SpreadsheetControl.HideLink=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=a.editor,a=document.getElementById(a.idPrefix+\"linkdialog\");a.innerHTML=\"\";SocialCalc.DragUnregister(a);SocialCalc.KeyboardFocus();a.parentNode&&a.parentNode.removeChild(a);switch(c.state){case \"start\":c.inputBox.DisplayCellContents(null);break;case \"input\":case \"inputboxdirect\":c.inputBox.element.disabled=!1,c.inputBox.Focus()}};\nSocialCalc.SpreadsheetControl.DoLinkClear=function(){var a=SocialCalc.GetSpreadsheetControlObject();document.getElementById(a.idPrefix+\"linkdesc\").value=\"\";document.getElementById(a.idPrefix+\"linkpagename\").value=\"\";document.getElementById(a.idPrefix+\"linkworkspace\").value=\"\";a=document.getElementById(a.idPrefix+\"linkurl\");a.value=\"\";a.focus()};\nSocialCalc.SpreadsheetControl.DoLinkPaste=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=a.editor,b=c.workingvalues,d=document.getElementById(a.idPrefix+\"linkdesc\"),e=document.getElementById(a.idPrefix+\"linkurl\"),f=document.getElementById(a.idPrefix+\"linkpagename\"),g=document.getElementById(a.idPrefix+\"linkworkspace\"),l=document.getElementById(a.idPrefix+\"linkformat\"),h=\"\",m,p;document.getElementById(a.idPrefix+\"linkpopup\").checked?(a=\"<<\",h=\">>\",m=\"[[\",p=\"]]\"):(a=\"<\",h=\">\",m=\"[\",p=\"]\");\nh=f&&f.value?g.value?d.value+\"{\"+g.value+m+f.value+p+\"}\":d.value+m+f.value+p:d.value+a+e.value+h;SocialCalc.SpreadsheetControl.HideLink();switch(c.state){case \"start\":b.partialexpr=\"\";b.ecoord=c.ecell.coord;b.erow=c.ecell.row;b.ecol=c.ecell.col;break;case \"input\":case \"inputboxdirect\":c.inputBox.Blur(),c.inputBox.ShowInputBox(!1),c.state=\"start\"}l.checked&&SocialCalc.SpreadsheetControlExecuteCommand(null,\"set %C textvalueformat text-link\",\"\");c.EditorSaveEdit(h)};\nSocialCalc.SpreadsheetControl.DoSum=function(){var a,c,b,d,e=SocialCalc.GetSpreadsheetControlObject().editor,f=e.context.sheetobj;if(e.range.hasrange)a=SocialCalc.crToCoord(e.range.left,e.range.top)+\":\"+SocialCalc.crToCoord(e.range.right,e.range.bottom),a=\"set \"+SocialCalc.crToCoord(e.range.right,e.range.bottom+1)+\" formula sum(\"+a+\")\";else if(a=e.ecell.row-1,b=e.ecell.col,1>=a)a=\"set \"+e.ecell.coord+\" constant e#REF! 0 #REF!\";else{for(d=!1;0<a;){c=SocialCalc.crToCoord(b,a);c=f.GetAssuredCell(c);\nif(c.datatype&&\"t\"!=c.datatype)d=!0;else if(d){a++;break}a--}a=\"set \"+e.ecell.coord+\" formula sum(\"+SocialCalc.crToCoord(b,a)+\":\"+SocialCalc.crToCoord(b,e.ecell.row-1)+\")\"}e.EditorScheduleSheetCommands(a,!0,!1)};\nSocialCalc.SpreadsheetControlSortOnclick=function(a,c){var b,d,e=[],f=document.getElementById(a.idPrefix+\"sortlist\");SocialCalc.LoadColumnChoosers(a);a.editor.RangeChangeCallback.sort=SocialCalc.UpdateSortRangeProposal;for(b in a.sheet.names)e.push(b);e.sort();f.length=0;f.options[0]=new Option(SocialCalc.LocalizeString(\"[select range]\"));for(d=0;d<e.length;d++)b=e[d],f.options[d+1]=new Option(b,b),b==a.sortrange&&(f.options[d+1].selected=!0);\"\"==a.sortrange&&(f.options[0].selected=!0);SocialCalc.UpdateSortRangeProposal(a.editor);\nSocialCalc.KeyboardFocus()};\nSocialCalc.SpreadsheetControlSortSave=function(a,c){var b=SocialCalc.GetSpreadsheetControlObject(),d,e,f;d=\"sort:\"+SocialCalc.encodeForSave(b.sortrange)+\":\";e=document.getElementById(b.idPrefix+\"majorsort\");f=document.getElementById(b.idPrefix+\"majorsortup\");d+=e.selectedIndex+(f.checked?\":up\":\":down\");e=document.getElementById(b.idPrefix+\"minorsort\");0<e.selectedIndex?(f=document.getElementById(b.idPrefix+\"minorsortup\"),d+=\":\"+e.selectedIndex+(f.checked?\":up\":\":down\")):d+=\"::\";e=document.getElementById(b.idPrefix+\n\"lastsort\");0<e.selectedIndex?(f=document.getElementById(b.idPrefix+\"lastsortup\"),d+=\":\"+e.selectedIndex+(f.checked?\":up\":\":down\")):d+=\"::\";return d+\"\\n\"};\nSocialCalc.SpreadsheetControlSortLoad=function(a,c,b,d){a=SocialCalc.GetSpreadsheetControlObject();b=b.split(\":\");a.sortrange=SocialCalc.decodeFromSave(b[1]);c=document.getElementById(a.idPrefix+\"sortbutton\");a.sortrange?(c.value=SocialCalc.LocalizeString(\"Sort \")+a.sortrange,c.style.visibility=\"visible\"):c.style.visibility=\"hidden\";SocialCalc.LoadColumnChoosers(a);sele=document.getElementById(a.idPrefix+\"majorsort\");sele.selectedIndex=b[2]-0;document.getElementById(a.idPrefix+\"majorsort\"+b[3]).checked=\n!0;sele=document.getElementById(a.idPrefix+\"minorsort\");b[4]?(sele.selectedIndex=b[4]-0,document.getElementById(a.idPrefix+\"minorsort\"+b[5]).checked=!0):(sele.selectedIndex=0,document.getElementById(a.idPrefix+\"minorsortup\").checked=!0);sele=document.getElementById(a.idPrefix+\"lastsort\");b[6]?(sele.selectedIndex=b[6]-0,document.getElementById(a.idPrefix+\"lastsort\"+b[7]).checked=!0):(sele.selectedIndex=0,document.getElementById(a.idPrefix+\"lastsortup\").checked=!0);return!0};\nSocialCalc.SpreadsheetControlCommentOnclick=function(a,c){a.editor.MoveECellCallback.comment=SocialCalc.SpreadsheetControlCommentMoveECell;SocialCalc.SpreadsheetControlCommentDisplay(a,c);SocialCalc.KeyboardFocus()};SocialCalc.SpreadsheetControlCommentDisplay=function(a,c){var b=\"\";a.editor.ecell&&a.editor.ecell.coord&&a.sheet.cells[a.editor.ecell.coord]&&(b=a.sheet.cells[a.editor.ecell.coord].comment||\"\");document.getElementById(a.idPrefix+\"commenttext\").value=b};\nSocialCalc.SpreadsheetControlCommentMoveECell=function(a){SocialCalc.SpreadsheetControlCommentDisplay(SocialCalc.GetSpreadsheetControlObject(),\"comment\")};\nSocialCalc.SpreadsheetControlCommentSet=function(){var a=SocialCalc.GetSpreadsheetControlObject();a.ExecuteCommand(\"set %C comment \"+SocialCalc.encodeForSave(document.getElementById(a.idPrefix+\"commenttext\").value));var c=SocialCalc.GetEditorCellElement(a.editor,a.editor.ecell.row,a.editor.ecell.col);a.editor.ECellReadonly()||(c.element.title=document.getElementById(a.idPrefix+\"commenttext\").value,a.editor.UpdateCellCSS(c,a.editor.ecell.row,a.editor.ecell.col));SocialCalc.KeyboardFocus()};\nSocialCalc.SpreadsheetControlCommentOnunclick=function(a,c){delete a.editor.MoveECellCallback.comment};\nSocialCalc.SpreadsheetControlNamesOnclick=function(a,c){document.getElementById(a.idPrefix+\"namesname\").value=\"\";document.getElementById(a.idPrefix+\"namesdesc\").value=\"\";document.getElementById(a.idPrefix+\"namesvalue\").value=\"\";a.editor.RangeChangeCallback.names=SocialCalc.SpreadsheetControlNamesRangeChange;a.editor.MoveECellCallback.names=SocialCalc.SpreadsheetControlNamesRangeChange;SocialCalc.SpreadsheetControlNamesRangeChange(a.editor);SocialCalc.SpreadsheetControlNamesFillNameList();SocialCalc.SpreadsheetControlNamesChangedName()};\nSocialCalc.SpreadsheetControlNamesFillNameList=function(){var a=SocialCalc.LocalizeString,c,b=[],d=SocialCalc.GetSpreadsheetControlObject(),e=document.getElementById(d.idPrefix+\"nameslist\"),f=document.getElementById(d.idPrefix+\"namesname\").value.toUpperCase().replace(/[^A-Z0-9_\\.]/g,\"\");for(c in d.sheet.names)b.push(c);b.sort();e.length=0;e.options[0]=0<b.length?new Option(a(\"[New]\")):new Option(a(\"[None]\"));for(a=0;a<b.length;a++)c=b[a],e.options[a+1]=new Option(c,c),c==f&&(e.options[a+1].selected=\n!0);\"\"==f&&(e.options[0].selected=!0)};\nSocialCalc.SpreadsheetControlNamesChangedName=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=document.getElementById(a.idPrefix+\"nameslist\"),c=c.options[c.selectedIndex].value;a.sheet.names[c]?(document.getElementById(a.idPrefix+\"namesname\").value=c,document.getElementById(a.idPrefix+\"namesdesc\").value=a.sheet.names[c].desc||\"\",document.getElementById(a.idPrefix+\"namesvalue\").value=a.sheet.names[c].definition||\"\"):(document.getElementById(a.idPrefix+\"namesname\").value=\"\",document.getElementById(a.idPrefix+\n\"namesdesc\").value=\"\",document.getElementById(a.idPrefix+\"namesvalue\").value=\"\")};SocialCalc.SpreadsheetControlNamesRangeChange=function(a){var c=SocialCalc.GetSpreadsheetControlObject();document.getElementById(c.idPrefix+\"namesrangeproposal\").value=a.range.hasrange?SocialCalc.crToCoord(a.range.left,a.range.top)+\":\"+SocialCalc.crToCoord(a.range.right,a.range.bottom):a.ecell.coord};SocialCalc.SpreadsheetControlNamesOnunclick=function(a,c){delete a.editor.RangeChangeCallback.names;delete a.editor.MoveECellCallback.names};\nSocialCalc.SpreadsheetControlNamesSetValue=function(){var a=SocialCalc.GetSpreadsheetControlObject();document.getElementById(a.idPrefix+\"namesvalue\").value=document.getElementById(a.idPrefix+\"namesrangeproposal\").value;SocialCalc.KeyboardFocus()};\nSocialCalc.SpreadsheetControlNamesSave=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=document.getElementById(a.idPrefix+\"namesname\").value;SocialCalc.SetTab(a.tabs[0].name);SocialCalc.KeyboardFocus();\"\"!=c&&a.ExecuteCommand(\"name define \"+c+\" \"+document.getElementById(a.idPrefix+\"namesvalue\").value+\"\\nname desc \"+c+\" \"+document.getElementById(a.idPrefix+\"namesdesc\").value)};\nSocialCalc.SpreadsheetControlNamesDelete=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=document.getElementById(a.idPrefix+\"namesname\").value;SocialCalc.SetTab(a.tabs[0].name);SocialCalc.KeyboardFocus();\"\"!=c&&a.ExecuteCommand(\"name delete \"+c);SocialCalc.KeyboardFocus()};\nSocialCalc.SpreadsheetControlClipboardOnclick=function(a,c){a=SocialCalc.GetSpreadsheetControlObject();TiddlyWiki&&a.tiddlyWiki.clickImportExportUI(a);clipele=document.getElementById(a.idPrefix+\"clipboardtext\");document.getElementById(a.idPrefix+\"clipboardformat-tab\").checked=!0;clipele.value=SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard,\"tab\")};\nSocialCalc.SpreadsheetControlClipboardFormat=function(a){var c=SocialCalc.GetSpreadsheetControlObject();clipele=document.getElementById(c.idPrefix+\"clipboardtext\");clipele.value=SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard,a)};\nSocialCalc.SpreadsheetControlClipboardLoad=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=\"tab\";SocialCalc.SetTab(a.tabs[0].name);SocialCalc.KeyboardFocus();document.getElementById(a.idPrefix+\"clipboardformat-csv\").checked?c=\"csv\":document.getElementById(a.idPrefix+\"clipboardformat-scsave\").checked&&(c=\"scsave\");a.editor.EditorScheduleSheetCommands(\"loadclipboard \"+SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(document.getElementById(a.idPrefix+\"clipboardtext\").value,c)),\n!0,!1)};SocialCalc.SpreadsheetControlClipboardClear=function(){var a=SocialCalc.GetSpreadsheetControlObject(),c=document.getElementById(a.idPrefix+\"clipboardtext\");c.value=\"\";a.editor.EditorScheduleSheetCommands(\"clearclipboard\",!0,!1);c.focus()};SocialCalc.SpreadsheetControlClipboardExport=function(){var a=SocialCalc.GetSpreadsheetControlObject();a.ExportCallback&&a.ExportCallback(a);SocialCalc.SetTab(a.tabs[0].name);SocialCalc.KeyboardFocus()};\nSocialCalc.SpreadsheetControlSettingsSwitch=function(a){SocialCalc.SettingControlReset();var c=SocialCalc.GetSpreadsheetControlObject(),b=document.getElementById(c.idPrefix+\"sheetsettingstable\"),d=document.getElementById(c.idPrefix+\"cellsettingstable\"),e=document.getElementById(c.idPrefix+\"sheetsettingstoolbar\"),f=document.getElementById(c.idPrefix+\"cellsettingstoolbar\");\"sheet\"==a?(b.style.display=\"block\",d.style.display=\"none\",e.style.display=\"block\",f.style.display=\"none\",SocialCalc.SettingsControlSetCurrentPanel(c.views.settings.values.sheetspanel)):\n(b.style.display=\"none\",d.style.display=\"block\",e.style.display=\"none\",f.style.display=\"block\",SocialCalc.SettingsControlSetCurrentPanel(c.views.settings.values.cellspanel))};\nSocialCalc.SettingsControlSave=function(a){var c,b,d=SocialCalc.GetSpreadsheetControlObject(),e=SocialCalc.SettingsControlUnloadPanel(SocialCalc.SettingsControls.CurrentPanel);SocialCalc.SetTab(d.tabs[0].name);SocialCalc.KeyboardFocus();\"sheet\"==a?b=d.sheet.DecodeSheetAttributes(e):\"cell\"==a&&(d.editor.range.hasrange&&(c=SocialCalc.crToCoord(d.editor.range.left,d.editor.range.top)+\":\"+SocialCalc.crToCoord(d.editor.range.right,d.editor.range.bottom)),b=d.sheet.DecodeCellAttributes(d.editor.ecell.coord,\ne,c));b&&d.editor.EditorScheduleSheetCommands(b,!0,!1)};\nSocialCalc.SpreadsheetControlCreateSpreadsheetSave=function(a,c){var b=\"\",d=\"\",e,f;if(c)for(e in c)f=\"\\n\"!=c[e].charAt(c[e]-1)?\"\\n\":\"\",b+=\"--\"+a.multipartBoundary+\"\\nContent-type: text/plain; charset=UTF-8\\n\\n\"+c[e]+f,d+=\"part:\"+e+\"\\n\";return\"socialcalc:version:1.0\\nMIME-Version: 1.0\\nContent-Type: multipart/mixed; boundary=\"+a.multipartBoundary+\"\\n--\"+a.multipartBoundary+\"\\nContent-type: text/plain; charset=UTF-8\\n\\n# SocialCalc Spreadsheet Control Save\\nversion:1.0\\npart:sheet\\npart:edit\\npart:audit\\n\"+d+\n\"--\"+a.multipartBoundary+\"\\nContent-type: text/plain; charset=UTF-8\\n\\n\"+a.CreateSheetSave()+\"--\"+a.multipartBoundary+\"\\nContent-type: text/plain; charset=UTF-8\\n\\n\"+a.editor.SaveEditorSettings()+\"--\"+a.multipartBoundary+\"\\nContent-type: text/plain; charset=UTF-8\\n\\n\"+a.sheet.CreateAuditString()+b+\"--\"+a.multipartBoundary+\"--\\n\"};\nSocialCalc.SpreadsheetControlDecodeSpreadsheetSave=function(a,c){var b,d,e,f,g,l,h,m={},p=[];b=c.search(/^MIME-Version:\\s1\\.0/mi);if(0>b)return m;d=/^Content-Type:\\s*multipart\\/mixed;\\s*boundary=(\\S+)/mig;d.lastIndex=b;e=d.exec(c);if(0>=d.lastIndex)return m;b=e[1];f=new RegExp(\"^--\"+b+\"(?:\\r\\n|\\n)\",\"mg\");f.lastIndex=d.lastIndex;f.exec(c);d=/(?:\\r\\n|\\n)(?:\\r\\n|\\n)/gm;d.lastIndex=f.lastIndex;e=d.exec(c);if(!e)return m;g=d.lastIndex;f.lastIndex=g;e=f.exec(c);if(!e)return m;e=e.index;g=c.substring(g,\ne).split(/\\r\\n|\\n/);for(l=0;l<g.length;l++)switch(line=g[l],h=line.split(\":\"),h[0]){case \"part\":p.push(h[1])}for(pnum=0;pnum<p.length;pnum++){d.lastIndex=e;e=d.exec(c);if(!e)break;g=d.lastIndex;pnum==p.length-1&&(f=new RegExp(\"^--\"+b+\"--$\",\"mg\"));f.lastIndex=g;e=f.exec(c);if(!e)break;e=e.index;m[p[pnum]]={start:g,end:e}}return m};SocialCalc.SettingsControls={Controls:{},CurrentPanel:null};\nSocialCalc.SettingsControlSetCurrentPanel=function(a){SocialCalc.SettingsControls.CurrentPanel=a;SocialCalc.SettingsControls.PopupChangeCallback({panelobj:a},\"\",null)};SocialCalc.SettingsControlInitializePanel=function(a){var c,b=SocialCalc.SettingsControls;for(c in a)\"name\"!=c&&(ctrl=b.Controls[a[c].type])&&ctrl.Initialize&&ctrl.Initialize(a,c)};\nSocialCalc.SettingsControlLoadPanel=function(a,c){var b,d=SocialCalc.SettingsControls;for(b in a)\"name\"!=b&&(ctrl=d.Controls[a[b].type])&&ctrl.SetValue&&ctrl.SetValue(a,b,c[a[b].setting])};SocialCalc.SettingsControlUnloadPanel=function(a){var c,b=SocialCalc.SettingsControls,d={};for(c in a)\"name\"!=c&&(ctrl=b.Controls[a[c].type])&&ctrl.GetValue&&(d[a[c].setting]=ctrl.GetValue(a,c));return d};\nSocialCalc.SettingsControls.PopupChangeCallback=function(a,c,b){var d=SocialCalc.Constants;if((c=document.getElementById(\"sample-text\"))&&a&&a.panelobj){b=SocialCalc.CurrentSpreadsheetControlObject.idPrefix;var e=\"cell\"==a.panelobj.name?\"c\":\"\",f,g;g=d.defaultCellLayout.match(/^padding.(\\S+) (\\S+) (\\S+) (\\S+).vertical.align.(\\S+);$/)||[];g={color:[\"textcolor\"],backgroundColor:[\"bgcolor\",\"#FFF\"],fontSize:[\"fontsize\",d.defaultCellFontSize],fontFamily:[\"fontfamily\"],paddingTop:[\"padtop\",g[1]],paddingRight:[\"padright\",\ng[2]],paddingBottom:[\"padbottom\",g[3]],paddingLeft:[\"padleft\",g[4]],verticalAlign:[\"alignvert\",g[5]]};for(f in g)d=SocialCalc.Popup.GetValue(b+e+g[f][0])||g[f][1]||\"\",c.style[f]=d;if(\"c\"==e){g={borderTop:\"cbt\",borderRight:\"cbr\",borderBottom:\"cbb\",borderLeft:\"cbl\"};for(f in g)d=SocialCalc.SettingsControls.BorderSideGetValue(a.panelobj,g[f]),c.style[f]=d?d.val||\"\":\"\";d=SocialCalc.Popup.GetValue(b+\"calignhoriz\");c.style.textAlign=d||\"left\"}else c.style.border=\"\",d=SocialCalc.Popup.GetValue(b+\"textalignhoriz\"),\nc.style.textAlign=d||\"left\",d=SocialCalc.Popup.GetValue(b+\"numberalignhoriz\");c.childNodes[1].style.textAlign=d||\"right\";g=(d=SocialCalc.Popup.GetValue(b+e+\"fontlook\"))?d.match(/^(\\S+) (\\S+)$/)||[]:[];c.style.fontStyle=g[1]||\"\";c.style.fontWeight=g[2]||\"\";d=SocialCalc.Popup.GetValue(b+e+\"formatnumber\")||\"General\";a=SocialCalc.FormatNumber.formatNumberWithFormat(9.8765,d,\"\");f=SocialCalc.FormatNumber.formatNumberWithFormat(-1234.5,d,\"\");\"??-???-?? ??:??:??\"!=f&&(a+=\"<br>\"+f);c.childNodes[1].innerHTML=\na}};SocialCalc.SettingsControls.PopupListSetValue=function(a,c,b){if(b){var d=SocialCalc.Popup;b.def?d.SetValue(a[c].id,\"\"):d.SetValue(a[c].id,b.val)}else alert(c+\" no value\")};SocialCalc.SettingsControls.PopupListGetValue=function(a,c){var b=a[c];return b?(b=SocialCalc.Popup.GetValue(b.id))?{def:!1,val:b}:{def:!0,val:0}:null};\nSocialCalc.SettingsControls.PopupListInitialize=function(a,c){var b,d,e,f;b=SocialCalc.SettingsControls;b=a[c].initialdata||b.Controls[a[c].type].InitialData||\"\";b=SocialCalc.LocalizeSubstrings(b);var g=b.split(/\\|/),l=[];for(b=0;b<(g.length||0);b++)d=g[b],e=d.indexOf(\":\"),f=d.substring(0,e),-1!=f.indexOf(\"\\\\\")&&(f=f.replace(/\\\\c/g,\":\"),f=f.replace(/\\\\b/g,\"\\\\\")),f=SocialCalc.special_chars(f),l[b]=\"[custom]\"==f?{o:SocialCalc.Constants.s_PopupListCustom,v:d.substring(e+1),a:{custom:!0}}:\"[cancel]\"==\nf?{o:SocialCalc.Constants.s_PopupListCancel,v:\"\",a:{cancel:!0}}:\"[break]\"==f?{o:\"-----\",v:\"\",a:{skip:!0}}:\"[newcol]\"==f?{o:\"\",v:\"\",a:{newcol:!0}}:{o:f,v:d.substring(e+1)};SocialCalc.Popup.Create(\"List\",a[c].id,{});SocialCalc.Popup.Initialize(a[c].id,{options:l,attribs:{changedcallback:SocialCalc.SettingsControls.PopupChangeCallback,panelobj:a}})};SocialCalc.SettingsControls.PopupListReset=function(a){SocialCalc.Popup.Reset(\"List\")};\nSocialCalc.SettingsControls.Controls.PopupList={SetValue:SocialCalc.SettingsControls.PopupListSetValue,GetValue:SocialCalc.SettingsControls.PopupListGetValue,Initialize:SocialCalc.SettingsControls.PopupListInitialize,OnReset:SocialCalc.SettingsControls.PopupListReset,ChangedCallback:null};SocialCalc.SettingsControls.ColorChooserSetValue=function(a,c,b){if(b){var d=SocialCalc.Popup;b.def?d.SetValue(a[c].id,\"\"):d.SetValue(a[c].id,b.val)}else alert(c+\" no value\")};\nSocialCalc.SettingsControls.ColorChooserGetValue=function(a,c){var b=SocialCalc.Popup.GetValue(a[c].id);return b?{def:!1,val:b}:{def:!0,val:0}};SocialCalc.SettingsControls.ColorChooserInitialize=function(a,c){SocialCalc.Popup.Create(\"ColorChooser\",a[c].id,{});SocialCalc.Popup.Initialize(a[c].id,{attribs:{title:\" \",moveable:!0,width:\"106px\",changedcallback:SocialCalc.SettingsControls.PopupChangeCallback,panelobj:a}})};SocialCalc.SettingsControls.ColorChooserReset=function(a){SocialCalc.Popup.Reset(\"ColorChooser\")};\nSocialCalc.SettingsControls.Controls.ColorChooser={SetValue:SocialCalc.SettingsControls.ColorChooserSetValue,GetValue:SocialCalc.SettingsControls.ColorChooserGetValue,Initialize:SocialCalc.SettingsControls.ColorChooserInitialize,OnReset:SocialCalc.SettingsControls.ColorChooserReset,ChangedCallback:null};\nSocialCalc.SettingsControls.BorderSideSetValue=function(a,c,b){a=a[c].id;if(b){if(c=document.getElementById(a+\"-onoff-bcb\"))b.val?(c.checked=!0,c.value=b.val,b=b.val.match(/(\\S+)\\s+(\\S+)\\s+(\\S.+)/),a+=\"-color\",SocialCalc.Popup.SetValue(a,b[3]),SocialCalc.Popup.SetDisabled(a,!1)):(c.checked=!1,c.value=b.val,a+=\"-color\",SocialCalc.Popup.SetValue(a,\"\"),SocialCalc.Popup.SetDisabled(a,!0))}else alert(c+\" no value\")};\nSocialCalc.SettingsControls.BorderSideGetValue=function(a,c){var b,d=a[c].id;if(b=document.getElementById(d+\"-onoff-bcb\"))return b.checked?(b=SocialCalc.Popup.GetValue(d+\"-color\"),{def:!1,val:\"1px solid \"+(b||\"rgb(0,0,0)\")}):{def:!1,val:\"\"}};\nSocialCalc.SettingsControls.BorderSideInitialize=function(a,c){var b=a[c].id;SocialCalc.Popup.Create(\"ColorChooser\",b+\"-color\",{});SocialCalc.Popup.Initialize(b+\"-color\",{attribs:{title:\" \",width:\"106px\",moveable:!0,changedcallback:SocialCalc.SettingsControls.PopupChangeCallback,panelobj:a}})};\nSocialCalc.SettingsControlOnchangeBorder=function(a){var c=SocialCalc.SettingsControls,b=c.CurrentPanel,d=a.id.match(/(^.*\\-)(\\w+)\\-(\\w+)\\-(\\w+)$/);if(d){var e=d[2],b=b[e].type;switch(d[4]){case \"bcb\":a.checked?c.Controls[b].SetValue(c.CurrentPanel,e,{def:!1,val:a.value||\"1px solid rgb(0,0,0)\"}):c.Controls[b].SetValue(c.CurrentPanel,e,{def:!1,val:\"\"})}}};\nSocialCalc.SettingsControls.Controls.BorderSide={SetValue:SocialCalc.SettingsControls.BorderSideSetValue,GetValue:SocialCalc.SettingsControls.BorderSideGetValue,OnClick:SocialCalc.SettingsControls.ColorComboOnClick,Initialize:SocialCalc.SettingsControls.BorderSideInitialize,InitialData:{thickness:\"1 pixel:1px\",style:\"Solid:solid\"},ChangedCallback:null};SocialCalc.SettingControlReset=function(){var a=SocialCalc.SettingsControls,c;for(c in a.Controls)a.Controls[c].OnReset&&a.Controls[c].OnReset(c)};\nSocialCalc.OtherSaveParts={};\nSocialCalc.CtrlSEditor=function(a){var c,b;if(0<a.length)c=SocialCalc.special_chars(SocialCalc.OtherSaveParts[a]||\"\");else for(b in c=\"Listing of Parts\\n\",SocialCalc.OtherSaveParts)c+=SocialCalc.special_chars(\"\\nPart: \"+b+\"\\n=====\\n\"+SocialCalc.OtherSaveParts[b]+\"\\n\");b=document.createElement(\"div\");b.style.cssText=\"position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;\";b.id=\"socialcalc-editbox\";b.innerHTML=a+'<br><br><textarea id=\"socialcalc-editbox-textarea\" style=\"width:250px;height:200px;\">'+\nc+\"</textarea><br><br><input type=button onclick=\\\"SocialCalc.CtrlSEditorDone ('socialcalc-editbox', '\"+a+'\\');\" value=\"OK\">';document.body.appendChild(b);a=document.getElementById(\"socialcalc-editbox-textarea\");a.focus();SocialCalc.CmdGotFocus(a)};SocialCalc.CtrlSEditorDone=function(a,c){var b=document.getElementById(a+\"-textarea\").value;0<c.length&&(0<b.length?SocialCalc.OtherSaveParts[c]=b:delete SocialCalc.OtherSaveParts[c]);b=document.getElementById(a);SocialCalc.KeyboardFocus();b.parentNode.removeChild(b)};SocialCalc||(alert(\"Main SocialCalc code module needed\"),SocialCalc={});SocialCalc.TableEditor||alert(\"SocialCalc TableEditor code module needed\");SocialCalc.CurrentSpreadsheetViewerObject=null;\nSocialCalc.SpreadsheetViewer=function(a,c){var b=SocialCalc.Constants;TiddlyWiki&&(this.tiddlyWiki=c,this.keyboard={areListener:!1,focusTable:null,passThru:null,didProcessKey:!1,statusFromProcessKey:!1,repeatingKeyPress:!1,chForProcessKey:\"\"},this.inputView=null);this.spreadsheetDiv=this.parentNode=null;this.viewheight=this.width=this.height=this.requestedSpaceBelow=this.requestedWidth=this.requestedHeight=0;this.editorDiv=this.spreadsheetDiv=this.editor=this.context=this.sheet=null;this.sortrange=\n\"\";this.idPrefix=a||\"SocialCalc-\";this.imagePrefix=b.defaultImagePrefix;this.statuslineheight=b.SVStatuslineheight;this.statuslineCSS=b.SVStatuslineCSS;this.sheet=new SocialCalc.Sheet;this.context=new SocialCalc.RenderContext(this.sheet);this.context.showGrid=!0;this.context.showRCHeaders=!0;this.editor=new SocialCalc.TableEditor(this.context);this.editor.noEdit=!0;this.editor.StatusCallback.statusline={func:SocialCalc.SpreadsheetViewerStatuslineCallback,params:{}};this.hasStatusLine=!0;this.statuslineHTML=\n'<table cellspacing=\"0\" cellpadding=\"0\"><tr><td width=\"100%\" style=\"overflow:hidden;\">{status}</td><td> </td></tr></table>';this.noRecalc=this.statuslineFull=!0;this.repeatingMacroTimer=null;this.repeatingMacroInterval=60;this.repeatingMacroCommands=\"\";TiddlyWiki?SocialCalc.CurrentSpreadsheetControlObject=this:SocialCalc.CurrentSpreadsheetViewerObject=this};\nSocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer=function(a,c,b,d){return SocialCalc.InitializeSpreadsheetViewer(this,a,c,b,d)};SocialCalc.SpreadsheetViewer.prototype.LoadSave=function(a){return SocialCalc.SpreadsheetViewerLoadSave(this,a)};SocialCalc.SpreadsheetViewer.prototype.DoOnResize=function(){return SocialCalc.DoOnResize(this)};SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv=function(){return SocialCalc.SizeSSDiv(this)};\nSocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave=function(a){return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this,a)};SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave=function(a){return this.sheet.ParseSheetSave(a)};\nSocialCalc.InitializeSpreadsheetViewer=function(a,c,b,d,e){a.requestedHeight=b;a.requestedWidth=d;a.requestedSpaceBelow=e;\"string\"==typeof c&&(c=document.getElementById(c));null==c&&alert(\"SocialCalc.SpreadsheetControl not given parent node.\");a.parentNode=c;a.spreadsheetDiv=document.createElement(\"div\");a.SizeSSDiv();for(b=c.firstChild;null!=b;b=c.firstChild)c.removeChild(b);c.appendChild(a.spreadsheetDiv);a.nonviewheight=a.hasStatusLine?a.statuslineheight:0;a.viewheight=a.height-a.nonviewheight;\na.editorDiv=a.editor.CreateTableEditor(a.width,a.viewheight);a.spreadsheetDiv.appendChild(a.editorDiv);a.hasStatusLine&&(a.statuslineDiv=document.createElement(\"div\"),a.statuslineDiv.style.cssText=a.statuslineCSS,a.statuslineDiv.style.height=a.statuslineheight-(a.statuslineDiv.style.paddingTop.slice(0,-2)-0)-(a.statuslineDiv.style.paddingBottom.slice(0,-2)-0)+\"px\",a.statuslineDiv.id=a.idPrefix+\"statusline\",a.spreadsheetDiv.appendChild(a.statuslineDiv),a.editor.StatusCallback.statusline={func:SocialCalc.SpreadsheetViewerStatuslineCallback,\nparams:{spreadsheetobj:a}});TiddlyWiki&&(a.inputView=document.createElement(\"input\"),a.inputView.setAttribute(\"type\",\"text\"),a.inputView.style.width=\"0px\",a.inputView.style.height=\"0px\",a.inputView.style.padding=\"0\",a.inputView.style.border=\"0\",a.spreadsheetDiv.appendChild(a.inputView),SocialCalc.CmdGotFocus(a.inputView));if(TiddlyWiki)if(a.spreadsheetDiv.addEventListener)a.spreadsheetDiv.addEventListener(\"mousedown\",function(){SocialCalc.SetSpreadsheetControlObject(a)},!1),a.spreadsheetDiv.addEventListener(\"mouseover\",\nfunction(){SocialCalc.SetSpreadsheetControlObject(a)},!1);else if(a.spreadsheetDiv.attachEvent)a.spreadsheetDiv.attachEvent(\"onmousedown\",function(){SocialCalc.SetSpreadsheetControlObject(a)}),a.spreadsheetDiv.attachEvent(\"onmouseover\",function(){SocialCalc.SetSpreadsheetControlObject(a)});else throw SocialCalc.Constants.s_BrowserNotSupported;};\nSocialCalc.SpreadsheetViewerLoadSave=function(a,c){var b,d,e;if(b=a.DecodeSpreadsheetSave(c))b.sheet&&(a.sheet.ResetSheet(),a.sheet.ParseSheetSave(c.substring(b.sheet.start,b.sheet.end))),b.edit&&a.editor.LoadEditorSettings(c.substring(b.edit.start,b.edit.end)),b.startupmacro&&a.editor.EditorScheduleSheetCommands(c.substring(b.startupmacro.start,b.startupmacro.end),!1,!0),b.repeatingmacro&&(b=c.substring(b.repeatingmacro.start,b.repeatingmacro.end),b=b.replace(\"\\r\",\"\"),d=b.indexOf(\"\\n\"),0<d&&(e=b.substring(0,\nd)-0,a.repeatingMacroInterval=e,a.repeatingMacroCommands=b.substring(d+1),0<e&&(a.repeatingMacroTimer=window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro,1E3*a.repeatingMacroInterval))));\"off\"==a.editor.context.sheetobj.attribs.recalc||a.noRecalc?a.editor.ScheduleRender():a.editor.EditorScheduleSheetCommands(\"recalc\")};\nSocialCalc.SpreadsheetViewerDoRepeatingMacro=function(){var a=SocialCalc.GetSpreadsheetViewerObject(),c=a.editor;a.repeatingMacroTimer=null;SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro={func:SocialCalc.SpreadsheetViewerRepeatMacroCommand,data:null};c.EditorScheduleSheetCommands(a.repeatingMacroCommands)};\nSocialCalc.SpreadsheetViewerRepeatMacroCommand=function(a,c,b,d,e){a=SocialCalc.GetSpreadsheetViewerObject();d=d.RestOfString()-0;0<d||(d=a.repeatingMacroInterval);a.repeatingMacroInterval=d;a.repeatingMacroTimer=window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro,1E3*a.repeatingMacroInterval)};SocialCalc.SpreadsheetViewerStopRepeatingMacro=function(){var a=SocialCalc.GetSpreadsheetViewerObject();a.repeatingMacroTimer&&(window.clearTimeout(a.repeatingMacroTimer),a.repeatingMacroTimer=null)};\nSocialCalc.SpreadsheetViewerDoButtonCmd=function(a,c,b){a=b.element;b=b.functionobj.command;c=SocialCalc.GetSpreadsheetViewerObject().editor;switch(b){case \"recalc\":c.EditorScheduleSheetCommands(\"recalc\")}a&&a.blur&&a.blur();SocialCalc.KeyboardFocus()};SocialCalc.LocalizeString=function(a){var c=SocialCalc.LocalizeStringList[a];c||(c=SocialCalc.Constants[\"s_loc_\"+a.toLowerCase().replace(/\\s/g,\"_\").replace(/\\W/g,\"X\")]||a,SocialCalc.LocalizeStringList[a]=c);return c};SocialCalc.LocalizeStringList={};\nSocialCalc.LocalizeSubstrings=function(a){var c=SocialCalc.LocalizeString;return a.replace(/%(loc|ssc)!(.*?)!/g,function(a,d,e){return\"ssc\"==d?SocialCalc.Constants[e]||alert(\"Missing constant: \"+e):c(e)})};SocialCalc.GetSpreadsheetViewerObject=function(){var a=SocialCalc.CurrentSpreadsheetViewerObject;if(a)return a;throw\"No current SpreadsheetViewer object.\";};\nSocialCalc.DoOnResize=function(a){var c,b=a.views;if(a.SizeSSDiv()){for(vname in b)c=b[vname].element,c.style.width=a.width+\"px\",c.style.height=a.height-a.nonviewheight+\"px\";a.editor.ResizeTableEditor(a.width,a.height-a.nonviewheight)}};SocialCalc.SpreadsheetViewerStatuslineCallback=function(a,c,b,d){var e=d.spreadsheetobj,f=\"\";e&&e.statuslineDiv&&(f=e.statuslineFull?a.GetStatuslineString(c,b,d):a.ecell.coord,f=e.statuslineHTML.replace(/\\{status\\}/,f),e.statuslineDiv.innerHTML=f)};\nSocialCalc.CmdGotFocus=function(a){SocialCalc.GetSpreadsheetControlObject().keyboard.passThru=a};SocialCalc.SpreadsheetViewerCreateSheetHTML=function(a){var c,b;c=\"\";c=new SocialCalc.RenderContext(a.sheet);a=document.createElement(\"div\");b=c.RenderSheet(null,{type:\"html\"});a.appendChild(b);delete c;c=a.innerHTML;delete b;delete a;return c};\nSocialCalc.SpreadsheetViewerDecodeSpreadsheetSave=function(a,c){var b,d,e,f,g,l,h,m={},p=[];/[^\\n]\\r[^\\n]/.test(c)&&(c=c.replace(/([^\\n])\\r([^\\n])/g,\"$1\\r\\n$2\"));b=c.search(/^MIME-Version:\\s1\\.0/mi);if(0>b)return m;d=/^Content-Type:\\s*multipart\\/mixed;\\s*boundary=(\\S+)/mig;d.lastIndex=b;e=d.exec(c);if(0>=d.lastIndex)return m;b=e[1];f=new RegExp(\"^--\"+b+\"(?:\\r\\n|\\n)\",\"mg\");f.lastIndex=d.lastIndex;f.exec(c);d=/(?:\\r\\n|\\n)(?:\\r\\n|\\n)/gm;d.lastIndex=f.lastIndex;e=d.exec(c);if(!e)return m;g=d.lastIndex;\nf.lastIndex=g;e=f.exec(c);if(!e)return m;e=e.index;g=c.substring(g,e).split(/\\r\\n|\\n/);for(l=0;l<g.length;l++)switch(line=g[l],h=line.split(\":\"),h[0]){case \"part\":p.push(h[1])}for(pnum=0;pnum<p.length;pnum++){d.lastIndex=e;e=d.exec(c);if(!e)break;g=d.lastIndex;pnum==p.length-1&&(f=new RegExp(\"^--\"+b+\"--$\",\"mg\"));f.lastIndex=g;e=f.exec(c);if(!e)break;e=e.index;m[p[pnum]]={start:g,end:e}}return m};(function(){Class=function(a,c){if(!a)throw\"Class requires a class definition string as its first argument\";if(!c)throw\"Class requires a class wrapper function as its second argument\";if(!a.match(/^([\\w\\.]+)(?:\\(\\s*([\\w\\.]+)\\s*\\))?(?:\\s+(.*?)\\s*)?$/))throw\"Can't parse Class Definition: '\"+a+\"'\";var b=RegExp.$1,d=RegExp.$2||\"\",e=[];RegExp.$3&&(e=RegExp.$3.split(/\\s+/));for(var f=[],g=!0,l=0,h=e.length;l<h;l++){var m=e[l];\"-nostrict\"==m&&(g=!1);m.match(/^-inc=(.+)$/)&&(f=RegExp.$1.split(\",\"))}for(var e=\nb.split(\".\"),p=Class.global,l=0;l<e.length;l++)p[e[l]]||(p[e[l]]=function(){try{this.init()}catch(a){}}),p=p[e[l]];p.className=b;p.isa=function(a){if(p.baseClassName=a)p.prototype=eval(\"new \"+a+\"()\"),p.prototype.superFunc=function(c){return eval(a).prototype[c]}};p.isa(d);p.global=Class.global;p.addGlobal=function(){this.newGlobals++;return Class.global};p.extend=function(a){if(\"object\"!=typeof a)throw\"extend requires an object of name:value pairs\";for(var c in a)p.prototype[c]=a[c]};b=0;for(d=f.length;b<\nd;b++)l=f[b],f[b]=\"proto\"==l?p.prototype:\"this\"==l?p:Class.global[l];g?Class.eval_strict(c,p,f):c.apply(p,f);return p}})();Class.global=this;Class.eval_strict=function(a,c,b){var d=0,e;for(e in Class.global)d++;c.newGlobals=0;a.apply(c,b);a=0;for(e in Class.global)a++;if(d+c.newGlobals!=a)throw\"Class '\"+c.className+\"' defines \"+(a-d)+\" new global JavaScript variables without using this.addGlobal()\";delete c.newGlobals};Class(\"Document.Emitter\",function(){var a=this.prototype;a.className=\"Document.Emitter\";a.instantiate=function(){return eval(\"new \"+this.className+\"()\")};a.init=function(){this.output=\"\"};a.content=function(){return this.output};a.insert=function(a){this.output+=a.output}});Class(\"Document.Emitter.HTML(Document.Emitter)\",function(){var a=this.prototype;a.className=\"Document.Emitter.HTML\";a.begin_node=function(a){var b=a.type;switch(b){case \"asis\":case \"line\":break;case \"br\":case \"hr\":this.output+=\"<\"+b+\" />\";break;case \"html\":this.output+='<span class=\"wafl\">Raw HTML section. Edit in Wiki Text mode.</span>';break;case \"waflparagraph\":case \"waflphrase\":case \"im\":if(a._wafl.match(/^image:\\s*(\\S+)(?:\\s+size=(\\w+))?/)){a=\"if (typeof(ss) != 'undefined' && ss.editor) { var recalc = function () { try { ss.editor.DoPositionCalculations() } catch (e) { setTimeout(recalc, 500) } }; recalc() } if (!window.image_dimension_cache) window.image_dimension_cache = {};window.image_dimension_cache['/data/wafl/\"+\na._label.replace(/&/g,\"&\").replace(/\"/g,\""\").replace(/</g,\"<\").replace(/>/g,\">\").replace(/'/g,\"\\\\'\").replace(/\\\\/g,\"\\\\\\\\\")+\"'] = [ this.offsetWidth, this.offsetHeight ]; this.style.width = this.offsetWidth + 'px'; this.style.height = this.offsetHeight + 'px'\";var b=RegExp.$1,d=RegExp.$2;switch(d){case \"small\":d=\"100\";break;case \"medium\":d=\"300\";break;case \"large\":d=\"600\"}d&&(d=' width=\"'+d+'\"');this.output+='<img src=\"'+b.replace(/&/g,\"&\").replace(/\"/g,\""\").replace(/</g,\"<\").replace(/>/g,\n\">\")+'\" onload=\"'+a+'\"'+d+\" />\";break}this.output+='<span class=\"wafl\">'+a._label.replace(/&/g,\"&\").replace(/\"/g,\""\").replace(/</g,\"<\").replace(/>/g,\">\").replace(/'/g,\"\\\\'\").replace(/\\\\/g,\"\\\\\\\\\")+\"</span>\";break;case \"a\":case \"wikilink\":this.output+='<a href=\"'+encodeURI(a._href)+'\">';break;case \"file\":this.output+='<a title=\"(network resource)\" href=\"'+encodeURI(a._href)+'\">';break;case \"ul\":case \"ol\":case \"table\":case \"tr\":this.output+=\"<\"+b+\">\\n\";break;default:this.output+=\"<\"+\nb+\">\"}};a.end_node=function(a){a=a.type;switch(a){case \"asis\":case \"br\":case \"hr\":case \"html\":case \"waflparagraph\":case \"waflphrase\":case \"im\":break;case \"line\":this.output+=\"<br />\";break;case \"file\":case \"wikilink\":this.output+=\"</a>\";break;default:0==a.search(/^(?:p|ul|ol|li|h\\d|table|tr|td)$/)?this.output+=\"</\"+a+\">\\n\":this.output+=\"</\"+a+\">\"}};a.text_node=function(a){this.output+=a.replace(/&/g,\"&\").replace(/>/g,\">\").replace(/</g,\"<\").replace(/\"/g,\""\").replace(/'/g,\"'\")}});Class(\"Document.Parser\",function(){var a=this.prototype;a.className=\"Document.Parser\";a.init=function(){};a.parse=function(a,b){this.input=-1==a.search(/\\n$/)?a+\"\\n\":a;b&&(this.receiver=b);this.receiver.init();this.grammar=this.create_grammar();this.parse_blocks(\"top\");return this.receiver.content()};a.create_grammar=function(){throw\"Please define create_grammar in a derived class of Document.Parser.\";};a.parse_blocks=function(a){if(a=this.grammar[a].blocks)for(;this.input.length;){for(var b=this.input.length,\nd=0;d<a.length;d++){var e=a[d],f=this.find_match(\"matched_block\",e);if(f){this.input=this.input.substr(f.end);this.handle_match(e,f);break}}if(this.input.length>=b)throw this.classname+\": Reduction error for:\\n\"+this.input+\"\\n\"+JSON.stringify(this);}};a.handle_match=function(a,b){var d=this.grammar[a];this.subparse(d.blocks?\"parse_blocks\":\"parse_phrases\",b,a,d.filter)};a.find_match=function(a,b){var d=this.grammar[b].match;if(!d)throw\"no regexp for type: \"+b;if(d=this.input.match(d))return d=this[a].call(this,\nd,this.grammar[b].lookbehind),d.type=this.grammar[b].type||b,d};a.parse_phrases=function(a){if(a=this.grammar[a].phrases)for(;this.input.length;){for(var b=null,d=0;d<a.length;d++){var e=this.find_match(\"matched_phrase\",a[d]);if(e&&(!b||e.begin<b.begin)&&(b=e,0==b.begin))break}if(!b){this.receiver.text_node(this.input||\"\");break}0!=b.begin&&this.receiver.text_node(this.input.substr(0,b.begin)||\"\");this.input=this.input.substr(b.end);this.handle_match(b.type,b)}else this.receiver.text_node(this.input||\n\"\")};a.subparse=function(a,b,d,e){b.type=this.grammar[d].type;null==b.type&&(b.type=d);e=e?e(b):null;b.type&&this.receiver.begin_node(b);var f=eval(\"new \"+this.className+\"()\");f.input=null==e?b.text:e;f.grammar=this.grammar;f.receiver=this.receiver.instantiate();f[a].call(f,d);this.receiver.insert(f.receiver);b.type&&this.receiver.end_node(b)};a.matched_block=function(a){return{begin:a.index,text:a[1],end:a[0].length,1:a[2],2:a[3],3:a[4]}};a.matched_phrase=function(a,b){if(b){var d=a[2],e=this.input.indexOf(a[1]);\nreturn{text:d,begin:e,end:e+a[1].length,1:RegExp.$2,2:RegExp.$3,3:RegExp.$4}}return{begin:a.index,text:a[1],end:a.index+a[0].length,1:a[2],2:a[3],3:a[4]}}});Class(\"Document.Parser.Wikitext(Document.Parser)\",function(){var a=this.prototype;a.className=\"Document.Parser.Wikitext\";a.init=function(){};a.create_grammar=function(){var a=\"pre html hr hx waflparagraph ul ol blockquote p empty else\".split(\" \"),b=\"waflphrase asis wikilink wikilink2 a im mail file tt b i del a\".split(\" \"),d=function(a,c){c=\"\\\\\"+(c||a);a=\"\\\\\"+a;return{match:new RegExp(\"(?:^|[^\"+a+\"\\\\w])(\"+a+\"(?=\\\\S)(?!\"+c+\")(.*?)\"+c+\"(?=[^\"+c+\"\\\\w]|$))\"),phrases:\"\\\\`\"==a?null:b,lookbehind:!0}},e=\n{yahoo:\"yahoo\",ymsgr:\"yahoo\",callto:\"callto\",callme:\"callto\",skype:\"callto\",aim:\"aim\"},f={aim:\"AIM: %1\",yahoo:\"Yahoo: %1\",callto:\"Skype: %1\"},g=\"(\\\\b(\",l;for(l in e)g+=l+\"|\";g=g.replace(/\\|$/,\")\\\\:([^\\\\s\\\\>\\\\)]+))\");l=function(a,b){var c=new RegExp(\"(^|\\n)\"+b+\" *\",\"g\");return{match:new RegExp(\"^(\"+a+\"+ .*\\n(?:[*-+#]+ .*\\n)*)(?:s*\\n)?\"),blocks:[\"ul\",\"ol\",\"subl\",\"li\"],filter:function(a){return a.text.replace(c,\"$1\")}}};return{_all_blocks:a,_all_phrases:b,top:{blocks:a},ol:l(\"#\",\"[*#]\"),ul:l(\"[-+*]\",\n\"[-+*#]\"),blockquote:{match:/^((?:>[^\\n]*\\n)+)(?:\\s*\\n)?/,blocks:[\"blockquote\",\"line\"],filter:function(a){return a.text.replace(/(^|\\n)>\\ ?/g,\"$1\")}},line:{match:/([^\\n]*)\\n/,phrases:b},subl:{type:\"li\",match:/^(([^\\n]*)\\n[*#]+\\ [^\\n]*\\n(?:[*#]+\\ [^\\n]*\\n)*)(?:\\s*\\n)?/,blocks:[\"ul\",\"ol\",\"li2\"]},li:{match:/([^\\n]*)\\n/,phrases:b},li2:{type:\"\",match:/([^\\n]*)\\n/,phrases:b},html:{match:/^(\\.html\\ *\\n(?:[^\\n]*\\n)*?\\.html)\\ *\\n(?:\\s*\\n)?/,filter:function(a){a._html=a.text;return\"\"}},pre:{match:/^\\.pre\\ *\\n((?:[^\\n]*\\n)*?)\\.pre\\ *\\n(?:\\s*\\n)?/},\nhr:{match:/^--+(?:\\s*\\n)?/},hx:{match:/^((\\^+) *([^\\n]*?)(\\s+=+)?\\s*?\\n+)/,phrases:b,filter:function(a){a.type=\"h\"+a[\"1\"].length;return a[2]}},p:{match:/^((?:(?!(?:(?:\\^+|\\#+|\\*+|\\-+) |\\>|\\.\\w+\\s*\\n|\\{[^\\}]+\\}\\s*\\n))[^\\n]*\\S[^\\n]*\\n)+(?:(?=^|\\n)\\s*\\n)*)/,phrases:b,filter:function(a){return a.text.replace(/\\n$/,\"\")}},empty:{match:/^(\\s*\\n)/,filter:function(a){a.type=\"\"}},\"else\":{match:/^(([^\\n]*)\\n)/,phrases:[],filter:function(a){a.type=\"p\"}},waflparagraph:{match:/^\\{(.*)\\}[\\ \\t]*\\n(?:\\s*\\n)?/,filter:function(a){a._wafl=\na._label=a.text;return\"\"}},waflphrase:{match:/(?:^|[\\s\\-])((?:\"([^\\n]+?)\")?\\{([\\w-]+(?=[\\:\\ \\}])(?:\\s*:)?\\s*[^\\n]*?\\s*)\\}(?=[\\W_]|$))/,filter:function(a){a._wafl=a[2];a._label=a[1]||a._wafl;return\"\"},lookbehind:!0},asis:{match:/(\\{\\{([^\\n]*?)\\}\\}(\\}*))/,filter:function(a){a.type=\"\";return a[1]+a[2]}},wikilink:{match:/(?:^|[_\\W])(\\[()(?=[^\\s\\[\\]])(.*?)\\](?=[_\\W]|$))/,filter:function(a){a._href=\"?\"+a[2];return a.text||a[2]},lookbehind:!0},wikilink2:{type:\"wikilink\",match:/(?:\"([^\"]*)\"\\s*)(\\[(?=[^\\s\\[\\]])(.*?)\\](?=[_\\W]|$))/,\nfilter:function(a){a._href=\"?\"+a[2];return a[1]||a[2]}},a:{match:/((?:\"([^\"]*)\"\\s*)?<?((?:http|https|ftp|irc|file):(?:\\/\\/)?[\\;\\/\\?\\:\\@\\&\\=\\+\\$\\,\\[\\]\\#A-Za-z0-9\\-\\_\\.\\!\\~\\*\\'\\(\\)]+[A-Za-z0-9\\/#])>?)/,filter:function(a){a._href=a[2];return a[1]||a[2]}},file:{match:/((?:\"([^\"]*)\")?<(\\\\\\\\[^\\s\\>\\)]+)>)/,filter:function(a){var b=a[2].replace(/^\\\\\\\\/,\"\");a._href=\"file://\"+b.replace(/\\\\/g,\"/\");return a[\"1\"]||b}},im:{match:new RegExp(g),filter:function(a){a._wafl=a[1]+\": \"+a[2];a._label=(f[e[a[1]]]||\"%1\").replace(/%1/g,\na[2]);return\"\"}},mail:{match:/([\\w+%\\-\\.]+@(?:[\\w\\-]+\\.)+[\\w\\-]+)/,filter:function(a){a.type=\"a\";a._href=\"mailto:\"+a.text.replace(/%/g,\"%25\")}},tt:d(\"`\"),b:d(\"*\"),i:d(\"_\"),del:d(\"-\")}}});\n\nexports.SocialCalc = SocialCalc;\n})();"
},
"$:/plugins/rboue/SocialCalc/Lib/graph.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/SocialCalc/Lib/graph.js",
"module-type": "library",
"text": "(function (){\n\n // Graph object\n\n var Graph = function() {};\n\n Graph.init = function(SocialCalc, sessionConfig) {\n if (!SocialCalc) alert('Cannot find SocialCalc');\n\n // Localization\n\n SocialCalc.Constants.s_loc_plain = \"Plain\";\n SocialCalc.Constants.s_loc_graph = \"Graph\";\n SocialCalc.Constants.s_loc_cells_to_graph = \"Cells to Graph\";\n SocialCalc.Constants.s_loc_set_cells_to_graph = \"Set Cells To Graph\";\n SocialCalc.Constants.s_loc_graph_type = \"Graph Type\";\n SocialCalc.Constants.s_loc_help = \"Help\";\n SocialCalc.Constants.s_loc_horizontal_bar = \"Horizontal Bar\";\n SocialCalc.Constants.s_loc_vertical_bar = \"Vertical Bar\";\n SocialCalc.Constants.s_loc_pie_chart = \"Pie Chart\";\n SocialCalc.Constants.s_loc_line_chart = \"Line Chart\";\n SocialCalc.Constants.s_loc_scatter_chart = \"Plot Points\";\n SocialCalc.Constants.s_loc_not_set = \"Not Set\";\n SocialCalc.Constants.s_loc_unknown_range_name = \"Unknown range name\";\n SocialCalc.Constants.s_loc_hide_help = \"Hide Help\";\n SocialCalc.Constants.s_loc_x = \"X\";\n SocialCalc.Constants.s_loc_y = \"Y\";\n SocialCalc.Constants.s_loc_max = \"Max\";\n SocialCalc.Constants.s_loc_min = \"Min\";\n SocialCalc.Constants.s_loc_ok = \" OK \";\n SocialCalc.Constants.s_loc_Xselect_rangeX = \"[select range]\";\n SocialCalc.Constants.s_GraphRangeNotSelected = \"Select a range of cells with numeric values to graph and use the OK button above to set the range as the graph range.\";\n SocialCalc.Constants.s_graph_error_selection = \"<b>Range selection error</b>.<br>You must select cells in a single row or column !\";\n SocialCalc.Constants.s_graph_help_intro = \"This is the help text for graph type: \";\n SocialCalc.Constants.s_graph_VerticalBar_help = \"The <b>Graph</b> tab displays a bar graph of the cells which have been selected (either in a single row across or column down). If the row above (or column to the left) of the selection has values, those values are used as labels. Otherwise the cell coordinates are used (e.g., B5).\";\n SocialCalc.Constants.s_graph_HorizontalBar_help = \"The <b>Graph</b> tab displays a bar graph of the cells which have been selected (either in a single row across or column down). If the row above (or column to the left) of the selection has values, those values are used as labels. Otherwise the cell coordinates are used (e.g., B5).\";\n SocialCalc.Constants.s_graph_PieChart_help = \"The <b>Graph</b> tab displays a pie chart of the cells which have been selected (either in a single row across or column down). If the row above (or column to the left) of the selection has values, those values are used as labels. Otherwise the cell coordinates are used (e.g., B5).\";\n SocialCalc.Constants.s_graph_PieChart_error_selection = \"<b>Selection error</b><br>You must select cells with positive value !\";\n SocialCalc.Constants.s_graph_LineChart_help = \"The <b>Graph</b> tab displays a XY profile line of the cells which have been selected (either in a single row across or column down). The row above (or column to the left) of the selection is used as X coordinates.\";\n SocialCalc.Constants.s_graph_ScatterChart_help = \"The <b>Graph</b> tab displays a XY scattered chart of the cells which have been selected (either in a single row across or column down). The row above (or column to the left) of the selection is used as X coordinates. If row below (or column to the right) have values, they are interpreted as plot dimensions.\";\n\n // Configuration\n\n SocialCalc.GraphTypesInfo = {\n // Graph types\n displayorder: [\"verticalbar\", \"horizontalbar\", \"piechart\", \"linechart\", \"scatterchart\"],\n verticalbar: {\n display: SocialCalc.Constants.s_loc_vertical_bar,\n func: Graph.GraphVerticalBar\n },\n horizontalbar: {\n display: SocialCalc.Constants.s_loc_horizontal_bar,\n func: Graph.GraphHorizontalBar\n },\n piechart: {\n display: SocialCalc.Constants.s_loc_pie_chart,\n func: Graph.MakePieChart\n },\n linechart: {\n display: SocialCalc.Constants.s_loc_line_chart,\n func: Graph.MakeLineChart\n },\n scatterchart: {\n display: SocialCalc.Constants.s_loc_scatter_chart,\n func: Graph.MakeScatterChart\n },\n\n // Graph visuals\n visual: {\n marginX: 0.07, // X margin ratio v/s graph width\n marginY: 0.07, // Y margin ratio v/s graph height\n axisWidth: 0.01, // axis printed width\n fontSize: 0.03, // font size ratio v/s graph height\n fontSizeMin: 10, // minimum font size in pixel\n valueMargin: 0.7, // margin between value and X axis, in font size unit\n labelMargin: 0.7 // margin between label and X axis, in font size unit\n }\n };\n };\n\n \n var colorIndex = 0;\n var getBarColor = function(){\n var colors = ['00f', 'ff0', '0ff', 'f0f', 'f00', '0f0', '888', '880', '088', '808', '008', '800', '080'];\n var iMax = colors.length - 1;\n if (colorIndex <= iMax)\n return colors[colorIndex++]\n else {\n return colors[Math.round(Math.random() * iMax)];\n }\n };\n var getDrawColor = function(){\n return \"#\" + getBarColor();\n };\n\n // Add Graph tab\n Graph.addGraphTab = function(spreadsheet) {\n if (spreadsheet.tabs) {\n spreadsheet.tabnums.graph = spreadsheet.tabs.length;\n spreadsheet.tabs.push({\n name: 'graph',\n text: SocialCalc.Constants.s_loc_graph,\n html:\n '<div id=\"%id.graphtools\" class=\"SocialCalc-toolbar\" style=\"display:none;\">' +\n ' <table cellspacing=\"0\" cellpadding=\"0\">' +\n ' <tr>' +\n ' <td style=\"vertical-align:top;padding-right:24px;\">' +\n ' <div style=\"%tbt.\">%loc!Cells to Graph!</div>' +\n ' <div id=\"%id.graphrange\" style=\"%tbt.\">Not Set</div>' +\n ' </td>' +\n ' <td style=\"vertical-align:top;padding-right:24px;\">' +\n ' <div style=\"%tbt.\">%loc!Set Cells To Graph!</div>' +\n ' <select id=\"%id.graphlist\" size=\"1\" onfocus=\"%s.CmdGotFocus(this);\">' +\n ' <option selected>[select range]</option>' +\n ' </select>' +\n ' </td>' +\n ' <td style=\"vertical-align:top;padding-right:4px;\">' +\n ' <div style=\"%tbt.\">%loc!Graph Type!</div>' +\n ' <select id=\"%id.graphtype\" size=\"1\" onchange=\"Graph.GraphChanged(this);\" onfocus=\"%s.CmdGotFocus(this);\">' +\n ' </select>' +\n ' <input type=\"button\" value=\"OK\" onclick=\"Graph.GraphSetCells();\" style=\"font-size:x-small;\">' +\n ' </td>' +\n ' <td style=\"vertical-align:top;padding-right:16px;\">' +\n ' <div style=\"%tbt.\"> </div>' +\n ' <input id=\"%id.graphhelp\" type=\"button\" onclick=\"Graph.DoGraph(true);\" value=\"Help\" style=\"font-size:x-small;\"/>' +\n ' </td>' +\n ' <td style=\"vertical-align:top\">' +\n ' <div id=\"%id.graphLimits\">' +\n ' <span style=\"%tbt.\">%loc!Min! %loc!X!</span>' +\n ' <input type=\"text\" id=\"%id.graphMinX\" onchange=\"Graph.MinMaxChanged(this,0);\" onfocus=\"%s.CmdGotFocus(this);\" size=\"5\"/>' +\n ' <span style=\"%tbt.\">%loc!Max! %loc!X!</span>' +\n ' <input type=\"text\" id=\"%id.graphMaxX\" onchange=\"Graph.MinMaxChanged(this,1);\" onfocus=\"%s.CmdGotFocus(this);\" size=\"5\"/><br>' +\n ' <span style=\"%tbt.\">%loc!Min! %loc!Y!</span>' +\n ' <input type=\"text\" id=\"%id.graphMinY\" onchange=\"Graph.MinMaxChanged(this,2);\" onfocus=\"%s.CmdGotFocus(this);\" size=\"5\"/>' +\n ' <span style=\"%tbt.\">%loc!Max! %loc!Y!</span>' +\n ' <input type=\"text\" id=\"%id.graphMaxY\" onchange=\"Graph.MinMaxChanged(this,3);\" onfocus=\"%s.CmdGotFocus(this);\" size=\"5\"/>' +\n ' </div>' +\n ' </td>' +\n ' </tr>' +\n ' </table>' +\n '</div>',\n view: 'graph',\n onclick: Graph.GraphOnClick,\n onclickFocus: true\n });\n }\n if (spreadsheet.views) {\n spreadsheet.views.graph = {\n name: 'graph',\n divStyle: \"overflow:auto;\",\n values: {},\n html: '<div style=\"padding:6px;\">Graph View</div>'\n };\n }\n if (spreadsheet.editor) {\n spreadsheet.editor.SettingsCallbacks.graph = {\n save: Graph.GraphSave,\n load: Graph.GraphLoad\n };\n }\n };\n\n Graph.GraphOnClick = function(s, t){\n colorIndex = 0;\n var SCLoc = SocialCalc.LocalizeString;\n var namelist = [];\n var nl = document.getElementById(s.idPrefix + 'graphlist');\n s.editor.RangeChangeCallback.graph = Graph.UpdateGraphRangeProposal;\n for (var name in s.sheet.names) {\n namelist.push(name);\n }\n namelist.sort();\n nl.length = 0;\n nl.options[0] = new Option(SCLoc(\"[select range]\"));\n for (var i = 0; i < namelist.length; i++) {\n var name = namelist[i];\n nl.options[i + 1] = new Option(name, name);\n if (name === s.graphrange) {\n nl.options[i + 1].selected = true;\n }\n }\n if (s.graphrange === '') {\n nl.options[0].selected = true;\n }\n Graph.UpdateGraphRangeProposal(s.editor);\n nl = document.getElementById(s.idPrefix + 'graphtype');\n nl.length = 0;\n for (var i = 0; i < SocialCalc.GraphTypesInfo.displayorder.length; i++) {\n var name = SocialCalc.GraphTypesInfo.displayorder[i];\n nl.options[i] = new Option(SCLoc(SocialCalc.GraphTypesInfo[name].display), name);\n if (name === s.graphtype) {\n nl.options[i].selected = true;\n }\n }\n if (!s.graphtype) {\n nl.options[0].selected = true;\n s.graphtype = nl.options[0].value;\n }\n var graphLimits = document.getElementById(s.idPrefix + \"graphLimits\");\n graphLimits.style.display = \"none\";\n\n Graph.DoGraph(false, false);\n };\n\n Graph.UpdateGraphRangeProposal = function(editor){\n var ele;\n ele = document.getElementById(SocialCalc.GetSpreadsheetControlObject().idPrefix + \"graphlist\");\n if (editor.range.hasrange) {\n return ele.options[0].text = SocialCalc.crToCoord(editor.range.left, editor.range.top) + \":\" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom);\n } else {\n return ele.options[0].text = SocialCalc.LocalizeString(\"[select range]\");\n }\n };\n\n Graph.GraphSetCells = function(){\n var spreadsheet, editor, lele, ele;\n spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n editor = spreadsheet.editor;\n lele = document.getElementById(spreadsheet.idPrefix + \"graphlist\");\n if (lele.selectedIndex === 0) {\n if (editor.range.hasrange) {\n spreadsheet.graphrange = SocialCalc.crToCoord(editor.range.left, editor.range.top) + \":\" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom);\n } else {\n spreadsheet.graphrange = editor.ecell.coord + \":\" + editor.ecell.coord;\n }\n } else {\n spreadsheet.graphrange = lele.options[lele.selectedIndex].value;\n }\n ele = document.getElementById(spreadsheet.idPrefix + \"graphrange\");\n ele.innerHTML = spreadsheet.graphrange;\n Graph.DoGraph(false, false);\n };\n\n Graph.DoGraph = function(helpflag, isResize){\n colorIndex = 0;\n var spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n var editor = spreadsheet.editor;\n var gview = spreadsheet.views.graph.element;\n var ginfo = SocialCalc.GraphTypesInfo[spreadsheet.graphtype];\n var gfunc = ginfo.func;\n if (!spreadsheet.graphrange) {\n if (gfunc && helpflag) {\n gfunc(spreadsheet, null, gview, spreadsheet.graphtype, helpflag, isResize);\n } else {\n gview.innerHTML = \"<div style=\\\"padding:30px;font-weight:bold;\\\">\" + SocialCalc.Constants.s_GraphRangeNotSelected + \"</div>\";\n }\n return;\n }\n var grange = spreadsheet.graphrange;\n if (grange && grange.indexOf(\":\") === -1) {\n var nrange = SocialCalc.Formula.LookupName(spreadsheet.sheet, grange || \"\");\n if (nrange.type !== \"range\") {\n gview.innerHTML = SocialCalc.LocalizeString(\"Unknown range name\") + \": \" + grange;\n return;\n }\n var rparts = nrange.value.match(/^(.*)\\|(.*)\\|$/);\n grange = rparts[1] + \":\" + rparts[2];\n }\n var prange = SocialCalc.ParseRange(grange);\n var range = {};\n if (prange.cr1.col <= prange.cr2.col) {\n range.left = prange.cr1.col;\n range.right = prange.cr2.col;\n } else {\n range.left = prange.cr2.col;\n range.right = prange.cr1.col;\n }\n if (prange.cr1.row <= prange.cr2.row) {\n range.top = prange.cr1.row;\n range.bottom = prange.cr2.row;\n } else {\n range.top = prange.cr2.row;\n range.bottom = prange.cr1.row;\n }\n if (gfunc) {\n gfunc(spreadsheet, range, gview, spreadsheet.graphtype, helpflag, isResize);\n }\n };\n\n Graph.GraphChanged = function(gtobj){\n SocialCalc.CurrentSpreadsheetControlObject.graphtype = gtobj.options[gtobj.selectedIndex].value;\n return Graph.DoGraph(false, false);\n };\n\n Graph.MinMaxChanged = function(minmaxobj, index){\n var spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n switch (index) {\n case 0:\n spreadsheet.graphMinX = minmaxobj.value;\n break;\n case 1:\n spreadsheet.graphMaxX = minmaxobj.value;\n break;\n case 2:\n spreadsheet.graphMinY = minmaxobj.value;\n break;\n case 3:\n spreadsheet.graphMaxY = minmaxobj.value;\n }\n return Graph.DoGraph(false, true);\n };\n\n Graph.GraphSave = function(editor, setting){\n var spreadsheet, gtype, str;\n spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n gtype = spreadsheet.graphtype || \"\";\n str = \"graph:range:\" + SocialCalc.encodeForSave(spreadsheet.graphrange) + \":type:\" + SocialCalc.encodeForSave(gtype);\n str += \":minmax:\" + SocialCalc.encodeForSave(spreadsheet.graphMinX + \",\" + spreadsheet.graphMaxX + \",\" + spreadsheet.graphMinY + \",\" + spreadsheet.graphMaxY) + \"\\n\";\n return str;\n };\n\n Graph.GraphLoad = function(editor, setting, line, flags){\n var spreadsheet, parts, i, splitMinMax;\n spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n parts = line.split(\":\");\n i = 1;\n while (i < parts.length) {\n switch (parts[i]) {\n case 'type':\n spreadsheet.graphtype = SocialCalc.decodeFromSave(parts[i + 1]);\n break;\n case 'range':\n spreadsheet.graphrange = SocialCalc.decodeFromSave(parts[i + 1]);\n break;\n case 'minmax':\n splitMinMax = SocialCalc.decodeFromSave(parts[i + 1]).split(',');\n spreadsheet.graphMinX = splitMinMax[0];\n document.getElementById(spreadsheet.idPrefix+\"graphMinX\").value = spreadsheet.graphMinX;\n spreadsheet.graphMaxX = splitMinMax[1];\n document.getElementById(spreadsheet.idPrefix+\"graphMaxX\").value = spreadsheet.graphMaxX;\n spreadsheet.graphMinY = splitMinMax[2];\n document.getElementById(spreadsheet.idPrefix+\"graphMinY\").value = spreadsheet.graphMinY;\n spreadsheet.graphMaxY = splitMinMax[3];\n document.getElementById(spreadsheet.idPrefix+\"graphMaxY\").value = spreadsheet.graphMaxY;\n }\n i += 2;\n }\n return true;\n };\n\n // Extract display data from a range of cell\n var cellRangeToDisplay = function(range) {\n var spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n var values = [];\n var labels = [];\n var nitems, byrow;\n if (!(range.right === range.left || range.top === range.bottom))\n return null;\n if (range.left === range.right) {\n nitems = range.bottom - range.top + 1;\n byrow = true;\n } else {\n nitems = range.right - range.left + 1;\n byrow = false;\n }\n var val = null; minval = null, maxval = null;\n for (var i = 0; i < nitems; i++) {\n var cr = byrow\n ? SocialCalc.rcColname(range.left) + (i + range.top)\n : SocialCalc.rcColname(i + range.left) + range.top;\n var cr1 = byrow\n ? SocialCalc.rcColname(range.left - 1 || 1) + (i + range.top)\n : SocialCalc.rcColname(i + range.left) + (range.top - 1 || 1);\n var cell = spreadsheet.sheet.GetAssuredCell(cr);\n if (cell.valuetype.charAt(0) === \"n\") {\n val = cell.datavalue - 0;\n if (maxval == null || maxval < val) maxval = val;\n if (minval == null || minval > val) minval = val;\n values.push(val);\n cell = spreadsheet.sheet.GetAssuredCell(cr1);\n if (cell.valuetype.charAt(0) === \"t\" || cell.valuetype.charAt(0) === \"n\")\n labels.push(\"\" + cell.datavalue);\n else\n labels.push(cr);\n }\n }\n if (maxval < 0) maxval = 0;\n if (minval > 0) minval = 0;\n\n return {values: values, labels: labels, minval: minval, maxval: maxval};\n };\n\n Graph.GraphVerticalBar = function(spreadsheet, range, gview, gtype, helpflag) {\n fonc = \"Graph.GraphVerticalBar\";\n var scc = SocialCalc.Constants;\n var str;\n if (helpflag || !range) {\n str = \"<input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\"><br><br>\" + scc.s_graph_help_intro + SocialCalc.GraphTypesInfo[gtype].display + \".<br><br>\" + scc.s_graph_VerticalBar_help + \"<br><br><input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\">\";\n str = SocialCalc.LocalizeSubstrings(str);\n gview.innerHTML = str;\n return;\n }\n var data = cellRangeToDisplay(range);\n if (!data) {\n gview.innerHTML = scc.s_graph_error_selection;\n return;\n }\n var graphLimits = document.getElementById(spreadsheet.idPrefix + \"graphLimits\");\n graphLimits.style.display = \"none\";\n\n // Create display\n str = \"<table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" style=\\\"width:100%;\\\"><tr><td><canvas id=\\\"\"+spreadsheet.idPrefix+\"myBarCanvas\\\" style=\\\"border:1px solid black;\\\"></canvas></td></tr></table>\";\n gview.innerHTML = str;\n var canv = document.getElementById(spreadsheet.idPrefix+'myBarCanvas');\n\n // The canvas must be explicitly resized to fill space\n canv.width = 0 + gview.style.width.replace(\"px\", \"\") - 4;\n canv.height = 0 + gview.style.height.replace(\"px\", \"\") - 4;\n\n var configVisual = SocialCalc.GraphTypesInfo.visual;\n var marginX = Math.floor(canv.width * configVisual.marginX);\n var marginY = Math.floor(canv.height * configVisual.marginY);\n totalWidth = canv.width - 2 * marginX;\n totalHeight = canv.height - 2 * marginY;\n\n // Draw X axis\n var ctx = canv.getContext('2d');\n var barColor = getBarColor();\n ctx.fillStyle = '#' + barColor;\n var originY = totalHeight * (data.maxval / (data.maxval - data.minval)) + marginY;\n ctx.lineWidth = totalHeight * configVisual.axisWidth;\n ctx.moveTo(0, originY);\n ctx.lineTo(canv.width, originY);\n ctx.stroke();\n\n // Draw bars\n var barWidth = Math.floor(totalWidth / (data.values.length || 1));\n var yScale = totalHeight / (data.maxval - data.minval);\n for (var i = 0; i < data.values.length; i++) {\n ctx.fillRect(marginX + i * barWidth, originY - yScale * data.values[i], barWidth, yScale * data.values[i]);\n barColor = getBarColor();\n ctx.fillStyle = '#' + barColor;\n }\n\n // Draw labels\n ctx.strokeStyle = '#000000';\n ctx.fillStyle = '#000000';\n var fontSize = Math.floor(canv.height * configVisual.fontSize);\n if (fontSize < configVisual.fontSizeMin) fontSize = configVisual.fontSizeMin;\n ctx.font = \"\" + fontSize + \"px bold Arial\";\n var offsetTextX = (barWidth <= 3 * fontSize) ? 0 : fontSize;\n for (var i = 0; i < data.values.length; i++) {\n var yValue, yLabel;\n if (data.values[i] > 0) {\n yValue = originY - fontSize * configVisual.valueMargin;\n yLabel = originY + fontSize * (configVisual.labelMargin + 1);\n } else {\n yValue = originY + fontSize * (configVisual.valueMargin + 1);\n yLabel = originY - fontSize * configVisual.labelMargin;\n }\n var x = marginX + offsetTextX + i * barWidth;\n ctx.fillText(data.values[i], x, yValue);\n ctx.fillText(data.labels[i], x, yLabel);\n }\n };\n\n Graph.GraphHorizontalBar = function(spreadsheet, range, gview, gtype, helpflag){\n fonc = \"Graph.GraphHorizontalBar\";\n var scc = SocialCalc.Constants;\n var str;\n if (helpflag || !range) {\n str = \"<input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\"><br><br>\" + scc.s_graph_help_intro + SocialCalc.GraphTypesInfo[gtype].display + \".<br><br>\" + scc.s_graph_HorizontalBar_help + \"<br><br><input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\">\";\n gview.innerHTML = str;\n return;\n }\n var data = cellRangeToDisplay(range);\n if (!data) {\n gview.innerHTML = scc.s_graph_error_selection;\n return;\n }\n var graphLimits = document.getElementById(spreadsheet.idPrefix + \"graphLimits\");\n graphLimits.style.display = \"none\";\n\n // Create display\n str = \"<table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" style=\\\"width:100%;\\\"><tr><td><canvas id=\\\"\"+spreadsheet.idPrefix+\"myBarCanvas\\\" style=\\\"border:1px solid black;\\\"></canvas></td></tr></table>\";\n gview.innerHTML = str;\n var canv = document.getElementById(spreadsheet.idPrefix+\"myBarCanvas\");\n\n // The canvas must be explicitly resized to fill space\n canv.width = 0 + gview.style.width.replace(\"px\", \"\") - 4;\n canv.height = 0 + gview.style.height.replace(\"px\", \"\") - 4;\n\n var configVisual = SocialCalc.GraphTypesInfo.visual;\n var marginX = Math.floor(canv.width * configVisual.marginX);\n var marginY = Math.floor(canv.height * configVisual.marginY);\n totalWidth = canv.width - 2 * marginX;\n totalHeight = canv.height - 2 * marginY;\n\n // Draw Y axis\n var ctx = canv.getContext(\"2d\");\n barColor = getBarColor();\n ctx.fillStyle = \"#\" + barColor;\n var originX = totalWidth * (1 - (data.maxval / (data.maxval - data.minval))) + marginX;\n ctx.lineWidth = totalWidth * configVisual.axisWidth;\n ctx.moveTo(originX, 0);\n ctx.lineTo(originX, canv.height);\n ctx.stroke();\n\n // Draw bars\n var barWidth = Math.floor(totalHeight / (data.values.length || 1));\n var yScale = totalWidth / (data.maxval - data.minval);\n for (var i = 0; i < data.values.length; i++) {\n ctx.fillRect(originX + yScale * data.values[i], marginY + i * barWidth, - yScale * data.values[i], barWidth);\n barColor = getBarColor();\n ctx.fillStyle = \"#\" + barColor;\n }\n\n // Draw labels\n ctx.strokeStyle = \"#000000\";\n ctx.fillStyle = \"#000000\";\n var fontSize = Math.floor(canv.height * configVisual.fontSize);\n if (fontSize < configVisual.fontSizeMin) fontSize = configVisual.fontSizeMin;\n ctx.font = \"\" + fontSize + \"px bold Arial\";\n var offsetTextY = (barWidth <= 3 * fontSize) ? 0 : 2 * fontSize;\n for (var i = 0; i < data.values.length; i++) {\n var xValue, xLabel;\n if (data.values[i] > 0) {\n xValue = originX + fontSize * configVisual.valueMargin;\n xLabel = originX - fontSize * (configVisual.labelMargin + 1);\n } else {\n xValue = originX - fontSize * configVisual.valueMargin - ctx.measureText(\"\"+data.values[i]).width;\n xLabel = originX + fontSize * configVisual.labelMargin;\n }\n var y = marginY + offsetTextY + i * barWidth;\n ctx.fillText(data.values[i], xValue, y);\n ctx.save();\n ctx.translate(xLabel, y);\n ctx.rotate(90 * Math.PI/180);\n ctx.fillText(data.labels[i], 0, 0);\n ctx.restore();\n }\n };\n\n Graph.MakePieChart = function(spreadsheet, range, gview, gtype, helpflag){\n fonc = \"Graph.MakePieChart\";\n var scc = SocialCalc.Constants;\n var str;\n if (helpflag || !range) {\n str = \"<input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\"><br><br>\" + scc.s_graph_help_intro + SocialCalc.GraphTypesInfo[gtype].display + \".<br><br>\" + scc.s_graph_PieChart_help + \"<br><br><input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\">\";\n str = SocialCalc.LocalizeSubstrings(str);\n gview.innerHTML = str;\n return;\n }\n var data = cellRangeToDisplay(range);\n if (!data) {\n gview.innerHTML = scc.s_graph_error_selection;\n return;\n }\n for (var i = 0; i < data.values.length; i++) {\n if (data.values[i] < 0) {\n gview.innerHTML = scc.s_graph_PieChart_error_selection;\n return;\n }\n }\n var graphLimits = document.getElementById(spreadsheet.idPrefix + \"graphLimits\");\n graphLimits.style.display = \"none\";\n\n // Create display\n str = \"<table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" style=\\\"width:100%;\\\"><tr><td><canvas id=\\\"\"+spreadsheet.idPrefix+\"myCanvas\\\" style=\\\"border:1px solid black;\\\"></canvas></td></tr></table>\";\n gview.innerHTML = str;\n var canv = document.getElementById(spreadsheet.idPrefix+\"myCanvas\");\n\n // The canvas must be explicitly resized to fill space\n canv.width = 0 + gview.style.width.replace(\"px\", \"\") - 4;\n canv.height = 0 + gview.style.height.replace(\"px\", \"\") - 4;\n\n var ctx = canv.getContext(\"2d\");\n var configVisual = SocialCalc.GraphTypesInfo.visual;\n var fontSize = Math.floor(canv.height * configVisual.fontSize);\n if (fontSize < configVisual.fontSizeMin) fontSize = configVisual.fontSizeMin;\n ctx.font = \"\" + fontSize + \"px bold Arial\";\n var total = 0;\n for (var i = 0; i < data.values.length; i++) {\n total += data.values[i];\n }\n centerX = canv.width / 2;\n centerY = canv.height / 2;\n var rad = centerY - 50;\n var textRad = rad * 1.1;\n var lastStart = 0;\n for (var i = 0; i < data.values.length; i++) {\n if (Number(data.values[i]) === 0) continue;\n ctx.beginPath();\n ctx.moveTo(centerX, centerY);\n var arcColor = getDrawColor();\n ctx.fillStyle = arcColor;\n var arcRads = 2 * Math.PI * (data.values[i] / total);\n ctx.arc(centerX, centerY, rad, lastStart, lastStart + arcRads, false);\n ctx.closePath();\n ctx.fill();\n ctx.fillStyle = \"black\";\n var centralRad = lastStart + 0.5 * arcRads;\n var leftBias = 0;\n if (centralRad > 1.5 && centralRad < 4.6) {\n leftBias = 55;\n }\n ctx.translate(centerX + Math.cos(centralRad) * textRad - leftBias, centerY + Math.sin(centralRad) * textRad);\n ctx.fillText(data.labels[i] + \" (\" + Math.round(data.values[i] / total * 100) + \"%)\", 0, 0);\n ctx.translate(-1 * centerX - Math.cos(centralRad) * textRad + leftBias, -1 * centerY - Math.sin(centralRad) * textRad);\n ctx.fillRect(1, 1, 1, 1);\n ctx.closePath();\n lastStart += arcRads;\n }\n };\n\n // Extract XY display data from a range of cell\n var cellRangeToDisplay2 = function(range, isResize) {\n var spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n var values = [];\n var labels = [];\n var nitems, byrow;\n if (range.left === range.right) {\n nitems = range.bottom - range.top + 1;\n byrow = true;\n } else {\n nitems = range.right - range.left + 1;\n byrow = false;\n }\n var val = null, minX = null, maxX = null, minval = null, maxval = null;\n if (isResize) {\n try {\n minX = 1 * document.getElementById(spreadsheet.idPrefix+\"graphMinX\").value;\n } catch (e$) {\n e = e$;\n minX = null;\n }\n try {\n maxX = 1 * document.getElementById(spreadsheet.idPrefix+\"graphMaxX\").value;\n } catch (e$) {\n e = e$;\n maxX = null;\n }\n try {\n minval = 1 * document.getElementById(spreadsheet.idPrefix+\"graphMinY\").value;\n } catch (e$) {\n e = e$;\n minval = null;\n }\n try {\n maxval = 1 * document.getElementById(spreadsheet.idPrefix+\"graphMaxY\").value;\n } catch (e$) {\n e = e$;\n maxval = null;\n }\n }\n dotSizes = new Array();\n var evenlySpaced = false;\n for (var i = 0; i < nitems; i++) {\n cr = byrow\n ? SocialCalc.rcColname(range.left) + (i + range.top)\n : SocialCalc.rcColname(i + range.left) + range.top;\n cr1 = byrow\n ? SocialCalc.rcColname(range.left - 1 || 1) + (i + range.top)\n : SocialCalc.rcColname(i + range.left) + (range.top - 1 || 1);\n cr2 = byrow\n ? SocialCalc.rcColname(range.left + 1 || 2) + (i + range.top)\n : SocialCalc.rcColname(i + range.left) + (range.top + 1 || 2);\n cell = spreadsheet.sheet.GetAssuredCell(cr);\n if (cell.valuetype.charAt(0) === \"n\") {\n val = cell.datavalue - 0;\n if ((maxval == null || maxval < val) && !isResize) maxval = val;\n if ((minval == null || minval > val) && !isResize) minval = val;\n values.push(val);\n cell = spreadsheet.sheet.GetAssuredCell(cr1);\n if ((range.right === range.left || range.top === range.bottom) && (cell.valuetype.charAt(0) === \"t\" || cell.valuetype.charAt(0) === \"n\")) {\n labels.push(cell.datavalue + \"\");\n if ((maxX == null || maxX < cell.datavalue) && !isResize) maxX = cell.datavalue;\n if ((minX == null || minX > cell.datavalue) && !isResize) minX = cell.datavalue;\n } else {\n labels.push(cr);\n evenlySpaced = true;\n }\n cell = spreadsheet.sheet.GetAssuredCell(cr2);\n if ((range.right === range.left || range.top === range.bottom) && (cell.valuetype.charAt(0) === \"t\" || cell.valuetype.charAt(0) === \"n\"))\n dotSizes.push(cell.datavalue + \"\");\n else\n dotSizes.push(\"5\");\n }\n }\n if (evenlySpaced) {\n for (var i = 0; i < values.length; i++) {\n labels[i] = i;\n }\n if (!isResize) {\n minX = 0;\n maxX = values.length - 1;\n }\n }\n\n return {values: values, labels: labels, dotSizes: dotSizes, minval: minval, maxval: maxval, minX: minX, maxX: maxX};\n };\n\n Graph.MakeLineChart = function(spreadsheet, range, gview, gtype, helpflag, isResize){\n fonc = \"Graph.MakeLineChart\";\n var scc = SocialCalc.Constants;\n var str;\n if (helpflag || !range) {\n str = \"<input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\"><br><br>\" + scc.s_graph_help_intro + SocialCalc.GraphTypesInfo[gtype].display + \".<br><br>\" + scc.s_graph_LineChart_help + \"<br><br><input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\">\";\n str = SocialCalc.LocalizeSubstrings(str);\n gview.innerHTML = str;\n return;\n }\n var data = cellRangeToDisplay2(range, isResize);\n if (!data) {\n gview.innerHTML = scc.s_graph_error_selection;\n return;\n }\n var graphLimits = document.getElementById(spreadsheet.idPrefix + \"graphLimits\");\n graphLimits.style.display = \"block\";\n\n // Create display\n str = \"<table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" style=\\\"width:100%;\\\"><tr><td><canvas id=\\\"\"+spreadsheet.idPrefix+\"myLineCanvas\\\" style=\\\"border:1px solid black;\\\"></canvas></td></tr></table>\";\n gview.innerHTML = str;\n if (!isResize) {\n document.getElementById(spreadsheet.idPrefix+\"graphMinX\").value = data.minX;\n spreadsheet.graphMinX = minX;\n document.getElementById(spreadsheet.idPrefix+\"graphMaxX\").value = data.maxX;\n spreadsheet.graphMaxX = maxX;\n document.getElementById(spreadsheet.idPrefix+\"graphMinY\").value = data.minval;\n spreadsheet.graphMinY = minval;\n document.getElementById(spreadsheet.idPrefix+\"graphMaxY\").value = data.maxval;\n spreadsheet.graphMaxY = maxval;\n }\n var canv = document.getElementById(spreadsheet.idPrefix+\"myLineCanvas\");\n\n // The canvas must be explicitly resized to fill space\n canv.width = 0 + gview.style.width.replace(\"px\", \"\") - 4;\n canv.height = 0 + gview.style.height.replace(\"px\", \"\") - 4;\n\n var ctx = canv.getContext(\"2d\");\n var minX = data.minX, maxX = data.maxX, minval = data.minval, maxval = data.maxval;\n var scaleFactorX = (canv.width - 40) / (maxX - minX);\n var scaleFactorY = (canv.height - 40) / (maxval - minval);\n var topY = canv.height;\n var colorArray = [];\n for (var i = 0; i < data.values.length; i++) {\n var lastX, lastY, drawColor;\n if ((i > 0) && (data.labels[i] * 1 > data.labels[i - 1] * 1)) {\n ctx.moveTo(lastX, topY - lastY);\n ctx.lineTo(scaleFactorX * (data.labels[i] - minX) + 20, topY - (scaleFactorY * (data.values[i] - minval) + 20));\n ctx.stroke();\n } else {\n ctx.beginPath();\n drawColor = getDrawColor();\n colorArray.push(drawColor.replace(\"#\", \"\"));\n ctx.strokeStyle = drawColor;\n ctx.fillStyle = drawColor;\n }\n lastX = scaleFactorX * (data.labels[i] - minX) + 20;\n lastY = scaleFactorY * (data.values[i] - minval) + 20;\n if ((colorArray.length - 1) % 3 === 0) {\n ctx.fillRect(lastX - 3, topY - lastY - 3, 6, 6);\n } else if ((colorArray.length - 1) % 3 === 1) {\n ctx.beginPath();\n ctx.arc(lastX, topY - lastY, 3, 0, Math.PI * 2, false);\n ctx.fill();\n } else {\n ctx.fillRect(lastX, topY - lastY - 3, 2, 8);\n ctx.fillRect(lastX - 3, topY - lastY, 8, 2);\n }\n }\n ctx.stroke();\n for (var i = 0; i < colorArray.length; i++) {\n if (i % 3 === 0)\n colorArray[i] = \"s,\" + colorArray[i] + \",\" + i + \",-1,6\";\n else if (i % 3 === 1)\n colorArray[i] = \"o,\" + colorArray[i] + \",\" + i + \",-1,6\";\n else\n colorArray[i] = \"c,\" + colorArray[i] + \",\" + i + \",-1,10\";\n }\n if (minval <= 0 && maxval >= 0) {\n ctx.beginPath();\n ctx.strokeStyle = \"#000000\";\n ctx.moveTo(0, canv.height - (scaleFactorY * -1 * minval + 20));\n ctx.lineTo(canv.width, canv.height - (scaleFactorY * -1 * minval + 20));\n ctx.stroke();\n graphPlace = 1 - (canv.height - (scaleFactorY * -1 * minval + 20)) / canv.height;\n }\n if (minX <= 0 && maxX >= 0) {\n ctx.beginPath();\n ctx.strokeStyle = \"#000000\";\n ctx.moveTo(scaleFactorX * -1 * minX + 20, 0);\n ctx.lineTo(scaleFactorX * -1 * minX + 20, canv.height);\n ctx.stroke();\n graphPlace = (scaleFactorX * -1 * minX + 20) / canv.width;\n }\n minX -= (maxX - minX) / 23;\n maxX += (maxX - minX) / 23;\n minval -= (maxval - minval) / 18;\n maxval += (maxval - minval) / 18;\n };\n\n Graph.MakeScatterChart = function(spreadsheet, range, gview, gtype, helpflag, isResize){\n fonc = \"Graph.MakeScatterChart\";\n var scc = SocialCalc.Constants;\n var str;\n if (helpflag || !range) {\n str = \"<input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\"><br><br>\" + scc.s_graph_help_intro + SocialCalc.GraphTypesInfo[gtype].display + \".<br><br>\" + scc.s_graph_ScatterChart_help + \"<br><br><input type=\\\"button\\\" value=\" + scc.s_loc_hide_help + \" onclick=\\\"Graph.DoGraph(false,false);\\\">\";\n str = SocialCalc.LocalizeSubstrings(str);\n gview.innerHTML = str;\n return;\n }\n var data = cellRangeToDisplay2(range, isResize);\n if (!data) {\n gview.innerHTML = scc.s_graph_error_selection;\n return;\n }\n var graphLimits = document.getElementById(spreadsheet.idPrefix + \"graphLimits\");\n graphLimits.style.display = \"block\";\n\n // Create display\n str = \"<table cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" style=\\\"width:100%;\\\"><tr><td><canvas id=\\\"\"+spreadsheet.idPrefix+\"myScatterCanvas\\\" style=\\\"border:1px solid black;\\\"></canvas></td></tr></table>\";\n gview.innerHTML = str;\n if (!isResize) {\n document.getElementById(spreadsheet.idPrefix+\"graphMinX\").value = data.minX;\n spreadsheet.graphMinX = minX;\n document.getElementById(spreadsheet.idPrefix+\"graphMaxX\").value = data.maxX;\n spreadsheet.graphMaxX = maxX;\n document.getElementById(spreadsheet.idPrefix+\"graphMinY\").value = data.minval;\n spreadsheet.graphMinY = minval;\n document.getElementById(spreadsheet.idPrefix+\"graphMaxY\").value = data.maxval;\n spreadsheet.graphMaxY = maxval;\n }\n var canv = document.getElementById(spreadsheet.idPrefix+\"myScatterCanvas\");\n\n // The canvas must be explicitly resized to fill space\n canv.width = 0 + gview.style.width.replace(\"px\", \"\") - 4;\n canv.height = 0 + gview.style.height.replace(\"px\", \"\") - 4;\n\n var ctx = canv.getContext(\"2d\");\n var minX = data.minX, maxX = data.maxX, minval = data.minval, maxval = data.maxval;\n var scaleFactorX = (canv.width - 40) / (maxX - minX);\n var scaleFactorY = (canv.height - 40) / (maxval - minval);\n var topY = canv.height;\n\n lastX = scaleFactorX * (data.labels[0] - minX) + 20;\n lastY = scaleFactorY * (data.values[0] - minval) + 20;\n drawColor = getDrawColor();\n ctx.fillStyle = drawColor;\n ctx.beginPath();\n ctx.arc(lastX, topY - lastY, data.dotSizes[0], 0, 2 * Math.PI, false);\n ctx.fill();\n for (var i = 1; i < data.values.length; i++) {\n ctx.moveTo(lastX, topY - lastY);\n lastX = scaleFactorX * (data.labels[i] - minX) + 20;\n lastY = scaleFactorY * (data.values[i] - minval) + 20;\n ctx.beginPath();\n ctx.arc(lastX, topY - lastY, data.dotSizes[i], 0, 2 * Math.PI, false);\n ctx.fill();\n }\n if (minval <= 0 && maxval >= 0) {\n ctx.beginPath();\n ctx.strokeStyle = \"#000000\";\n ctx.moveTo(0, canv.height - (scaleFactorY * -1 * minval + 20));\n ctx.lineTo(canv.width, canv.height - (scaleFactorY * -1 * minval + 20));\n ctx.stroke();\n graphPlace = 1 - (canv.height - (scaleFactorY * -1 * minval + 20)) / canv.height;\n }\n if (minX <= 0 && maxX >= 0) {\n ctx.beginPath();\n ctx.strokeStyle = \"#000000\";\n ctx.moveTo(scaleFactorX * -1 * minX + 20, 0);\n ctx.lineTo(scaleFactorX * -1 * minX + 20, canv.height);\n ctx.stroke();\n graphPlace = (scaleFactorX * -1 * minX + 20) / canv.width;\n }\n minX -= (maxX - minX) / 23;\n maxX += (maxX - minX) / 23;\n minval -= (maxval - minval) / 18;\n maxval += (maxval - minval) / 18;\n };\n\n exports.Graph = Graph;\n})();"
},
"$:/plugins/rboue/SocialCalc/Lib/socialcalc.css": {
"type": "text/css",
"title": "$:/plugins/rboue/SocialCalc/Lib/socialcalc.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/*\n// The optional default CSS style sheet for the SocialCalc package.\n// SocialCalc can run without a style sheet (the default) or with one.\n//\n// (c) Copyright 2008 Socialtext, Inc.\n// All Rights Reserved.\n//\n// The contents of this file are subject to the Artistic License 2.0; you may not\n// use this file except in compliance with the License. You may obtain a copy of \n// the License at http://socialcalc.org/licenses/al-20/.\n//\n// Some of the other files in the SocialCalc package are licensed under\n// different licenses. Please note the licenses of the modules you use.\n//\n// Code History:\n//\n// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc.\n*/\n\nbody:last-child .defaultPeer {\n border-collapse: separate;\n filter: none;\n}\n\n.defaultPeer {\n box-shadow: inset 0 0 0 2px blue;\n -webkit-box-shadow: inset 0 0 0 2px blue;\n -moz-box-shadow: inset 0 0 0 2px blue;\n *background: white;\n filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=1, OffY=1, Color=#0000ff),\n progid:DXImageTransform.Microsoft.DropShadow(OffX=-1, OffY=1, Color=#0000ff),\n progid:DXImageTransform.Microsoft.DropShadow(OffX=1, OffY=-1, Color=#0000ff),\n progid:DXImageTransform.Microsoft.DropShadow(OffX=-1, OffY=-1, Color=#0000ff),\n progid:DXImageTransform.Microsoft.Chroma(Color=#FFFFFF);\n /*\n * concat peer combinations into multishadows:\n inset 0 0 0 4px orange,\n inset 0 0 0 6px yellow,\n inset 0 0 0 8px lime,\n inset 0 0 0 10px cyan,\n inset 0 0 0 12px blue,\n inset 0 0 0 14px purple; \n */\n}\n.defaultComment {background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);}\n.defaultCommentNoGridStyle {}\n.defaultHighlightTypeCursor {color:#FFF;background-color:#A6A6A6;}\n.defaultHighlightTypeRange {color:#000;background-color:#E5E5E5;}\n.defaultColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;}\n.defaultSelectedColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;}\n.defaultRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;}\n.defaultSelectedRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;}\n.defaultUpperLeft {font-size:small;}\n.defaultSkippedCell {font-size:small;background-color:#CCC;}\n.defaultPaneDivider {font-size:small;background-color:#ECECEC;padding:0px;}\n.cteGriddiv {}\n.defaultInputEcho {background-color:#FFD;border:1px solid #884;\n font-size:small;padding:2px 10px 1px 2px;cursor:default;}\n.TCmain {background-color:#EEE;}\n.TCendcap {background-color:#FFF;}\n.TCpaneslider {background-color:#CCC;}\n.TClessbutton {background-color:#AAA;}\n.TCmorebutton {background-color:#AAA;}\n.TCscrollarea {background-color:#DDD;}\n.TCthumb {background-color:#CCC;}\n.TCPStrackingline {overflow:hidden;position:absolute;z-index:100;}\n.TCTDFSthumbstatus {height:20px;width:auto;border:1px solid black;padding:2px;\n background-color:#FFF;font-size:small;position:absolute;z-index:100;}\n.TDpopupElement {border:1px solid black;padding:1px 2px 2px 2px;text-align:center;background-color:#FFF;\n font-size:7pt;font-family:Verdana,Arial,Helvetica,sans-serif;\n position:absolute;width:auto;z-index:110;}\n\n#te_fullgrid {\n table-layout: fixed;\n}\n\n#te_fullgrid td {\n overflow: hidden;\n word-break: break-all;\n word-wrap: break-word;\n}\n\n#SocialCalc-settings-savecell, #SocialCalc-settings-savesheet {\n background: #AEF;\n font-weight: bold;\n}\n"
},
"$:/plugins/rboue/SocialCalc/config.css": {
"type": "text/css",
"title": "$:/plugins/rboue/SocialCalc/config.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* Root node */\n.SocialCalcWidget {\n font-family: verdana,helvetica,sans-serif;\n font-size: small;\n margin: 0;\n padding: 0;\n padding-bottom: 4px;\n border: none;\n}\n\n/* Toolbars */\n.SocialCalc-toolbar {\n padding: 8px 8px 8px 8px;\n height: 60px;\n}\n\n/* Comment text area */\n.SocialCalc-commenttext {\n width: 500px;\n height: 32px;\n}\n\n/* Function chooser */\n.SocialCalc-functiondialogbody {\n padding: 8px 8px 8px 8px;\n}\n\n/* Status line */\n.SocialCalc-statusline {\n font-size: 10px;\n padding: 3px 0 2px 0;\n}\n\n/* Fix conflicts with TiddlyWiki defaults\n*/\n.SocialCalcWidget {\n line-height: 10pt;\n}\n.SocialCalcWidget table {\n margin: 0;\n padding: 0;\n border: none;\n}\n.SocialCalcWidget table td {\n margin: 0;\n padding: 0;\n border: none;\n}\n.SocialCalcWidget table td p {\n margin: 0;\n}\n.SocialCalcWidget #te_logo div {\n line-height: 3pt;\n}\n#SocialCalc-functiondialog div {\n padding: 4px 4px 4px 8px;\n}\n\n/* Transparent keyboard management (no more dashed border with focus) */\n.SocialCalcWidget :focus {\n outline: none;\n}\n\n/* Fix color pickers */\n.SocialCalc-colorchooser {\n line-height: 1px;\n}\n\n/* Sheet aspect (cf. SocialCalc.ConstantsSetClasses())\n */\n.SocialCalc-defaultComment { /* cells with non-null comments when grid enabled */\n background-repeat: no-repeat;\n background-position: top right;\n}\n.SocialCalc-defaultCommentNoGrid {} /* cells with non-null comments when grid not enabled */\n.SocialCalc-defaultHighlightTypeCursor {\n color: #FFF;\n background-color: #A6A6A6;\n}\n.SocialCalc-defaultHighlightTypeRange {\n color: #000;\n background-color: #E5E5E5;\n}\n.SocialCalc-defaultColname { /* regular column heading letters, needs a cursor property */\n font-size: small;\n text-align: center;\n color: #FFFFFF;\n background-color: #808080;\n cursor: e-resize;\n}\n.SocialCalc-defaultSelectedColname { /* column with selected cell, needs a cursor property */\n font-size: small;\n text-align: center;\n color: #FFFFFF;\n background-color: #404040;\n cursor: e-resize;\n}\n.SocialCalc-defaultRowname { /* regular row heading numbers */\n font-size: small;\n text-align: right;\n color: #FFFFFF;\n background-color: #808080;\n direction: rtl;\n}\n.SocialCalc-defaultSelectedRowname { /* column with selected cell, needs a cursor property */\n font-size: small;\n text-align: right;\n color: #FFFFFF;\n background-color: #404040;\n} \n.SocialCalc-defaultUpperLeft { /* Corner cell in upper left */\n font-size: small;\n}\n.SocialCalc-defaultSkippedCell { /* used if present for spanned cells peeking into a pane */\n font-size: small;\n background-color: #CCC\n}\n.SocialCalc-defaultPaneDivider { /* used if present for the look of the space between panes */\n font-size: small;\n background-color: #C0C0C0;\n padding: 0px;\n}\n.SocialCalc-cteGriddiv {} /* the TableEditor griddiv element */\n.SocialCalc-defaultInputEcho { /* the popup inputEcho div */\n filter: alpha(opacity=90);\n opacity: .9;\n background-color: #FFD;\n border: 1px solid #884;\n}\n.SocialCalc-TCmain { /* pseudo style (text-align is textAlign) for main div of a table control */\n background-color: #EEE;\n}\n.SocialCalc-TCendcap { /* may be used while waiting for image that may not come */\n background-color: #FFF;\n}\n.SocialCalc-TCpaneslider {\n background-color: #CCC;\n}\n.SocialCalc-TClessbutton {\n background-color: #AAA;\n}\n.SocialCalc-TCmorebutton {\n background-color: #AAA;\n}\n.SocialCalc-TCscrollarea {\n background-color: #DDD;\n}\n.SocialCalc-TCthumb {\n background-color: #CCC;\n}\n.SocialCalc-TCPStrackingline { /* pane slider tracking line display in table control */\n overflow: hidden;\n position: absolute;\n z-index: 100;\n}\n.SocialCalc-TCTDFSthumbstatus { /* vertical thumb dragging status display in table control */\n height: 20px;\n width: auto;\n border: 3px solid #808080;\n overflow: hidden;\n background-color: #FFF;\n font-size: small;\n position: absolute;\n z-index:100;\n}\n.SocialCalc-TDpopupElement { /* tooltip display */\n border: 1px solid black;\n padding: 1px 2px 2px 2px;\n text-align: center;\n background-color: #FFF;\n font-size: 7pt;\n font-family: Verdana,Arial,Helvetica,sans-serif;\n position: absolute;\n width: auto;\n z-index: 110;\n}"
},
"$:/plugins/rboue/SocialCalc/LEGAL.txt": {
"type": "text/plain",
"title": "$:/plugins/rboue/SocialCalc/LEGAL.txt",
"text": "SOCIALCALC LEGAL.txt FILE:\n\nLEGAL INFORMATION\n\nThis LEGAL.txt file accompanies the SocialCalc program. It includes notices required by the \nlicenses as well as general legal notices.\n\n=========================================\n COPYRIGHT AND ATTRIBUTION NOTICES\n=========================================\n\nCopyright (C) 2009 Socialtext, Inc. \nAll Rights Reserved.\n\nimage:sc-logo.gif\n\"SocialCalc\"\nhttp://www.socialcalc.org/xoattrib\n\n=========================================\n SOURCE CODE AVAILABILITY NOTICE\n=========================================\n\nThe source code for this product is available from:\nhttp://socialcalc.org/.\n\n=========================================\n GENERAL LEGAL NOTICES\n=========================================\n\nwikiCalc, Garden, and Software Garden are registered trademarks of Software Garden, Inc.\nSocialtext and SocialCalc are registered trademarks of Socialtext, Inc.\nThe Socialtext logo and Dreamcatcher are trademarks of Socialtext, Inc.\n\n=========================================\n LEGAL NOTICES REQUIRED BY THE LICENSE\n=========================================\n\nCHANGES MADE TO THE COVERED CODE (see CPAL Version 1.0 Section 3.3):\n\n2012-04-21:\n Incorporated charting framework from OLPC Sugar into player.coffee.\n\n The pie, line and bar chart tools was developed by Nicholas Doiron,\n an engineering student from Carnegie Mellon University, U.S.A under\n the guidance of Manusheel Gupta.\n\n2008-02-08:\n Original Code started as a translation to JavaScript of code in SocialCalc 1.1.0 plus\n much new code.\n\n Python code for the OLPC XO-1 initially coded by Luke Closs of Socialtext, Inc.\n\n JavaScript initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc.\n Based in part on the SocialCalc 1.1.0 code written in Perl.\n The SocialCalc 1.1.0 code was:\n Portions (c) Copyright 2005, 2006, 2007 Software Garden, Inc.\n All Rights Reserved.\n Portions (c) Copyright 2007 Socialtext, Inc.\n All Rights Reserved.\n The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0.\n wikiCalc 1.0 was written by Software Garden, Inc.\n Unless otherwise specified, referring to \"SocialCalc\" in comments refers to this\n JavaScript version of the code, not the SocialCalc Perl code.\n\n----------\n\n(Documentation of future changes as the result of Modifications, including the date of \nchange, will go here in this LEGAL.txt file. This documentation may be summaries of \nchanges with the more detailed descriptions included in the actual modified files as \nappropriate.)\n\n==========\n\nTHIRD PARTY CLAIMS (see CPAL Version 1.0 Section 3.4(a)):\n\nNone.\n\n[End of LEGAL.txt]\n\n"
},
"$:/plugins/rboue/SocialCalc/LICENSE.txt": {
"type": "text/plain",
"title": "$:/plugins/rboue/SocialCalc/LICENSE.txt",
"text": "SOCIALCALC LICENSE.txt FILE:\n\n=========================================\n ABOUT THIS FILE\n=========================================\n\nThis file includes copies of the Common Public Attribution License (CPAL) and\nthe Artistic License 2.0.\n\nThis product consists of components licensed under different licenses.\nCheck the contents of each file for a statement of the license for that file.\nFiles without license information are licensed under the Artistic License 2.0.\n\n======================================================\n COMMON PUBLIC ATTRIBUTION LICENSE VERSION 1.0 (CPAL)\n======================================================\n\nCommon Public Attribution License Version 1.0 (CPAL)\n\n1. \"Definitions\"\n\n1.0.1 \"Commercial Use\" means distribution or otherwise making the Covered Code \navailable to a third party.\n\n1.1 \"Contributor\" means each entity that creates or contributes to the creation \nof Modifications.\n\n1.2 \"Contributor Version\" means the combination of the Original Code, prior \nModifications used by a Contributor, and the Modifications made by that particular \nContributor.\n\n1.3 \"Covered Code\" means the Original Code or Modifications or the combination of \nthe Original Code and Modifications, in each case including portions thereof.\n\n1.4 \"Electronic Distribution Mechanism\" means a mechanism generally accepted in \nthe software development community for the electronic transfer of data.\n\n1.5 \"Executable\" means Covered Code in any form other than Source Code.\n\n1.6 \"Initial Developer\" means the individual or entity identified as the Initial \nDeveloper in the Source Code notice required by Exhibit A.\n\n1.7 \"Larger Work\" means a work which combines Covered Code or portions thereof with \ncode not governed by the terms of this License.\n\n1.8 \"License\" means this document.\n\n1.8.1 \"Licensable\" means having the right to grant, to the maximum extent possible, \nwhether at the time of the initial grant or subsequently acquired, any and all of \nthe rights conveyed herein.\n\n1.9 \"Modifications\" means any addition to or deletion from the substance or structure \nof either the Original Code or any previous Modifications. When Covered Code is \nreleased as a series of files, a Modification is:\n\nA. Any addition to or deletion from the contents of a file containing Original Code \nor previous Modifications.\n\nB. Any new file that contains any part of the Original Code or previous Modifications.\n\n1.10 \"Original Code\" means Source Code of computer software code which is described in \nthe Source Code notice required by Exhibit A as Original Code, and which, at the time \nof its release under this License is not already Covered Code governed by this License.\n\n1.10.1 \"Patent Claims\" means any patent claim(s), now owned or hereafter acquired, \nincluding without limitation, method, process, and apparatus claims, in any patent \nLicensable by grantor.\n\n1.11 \"Source Code\" means the preferred form of the Covered Code for making modifications \nto it, including all modules it contains, plus any associated interface definition files, \nscripts used to control compilation and installation of an Executable, or source code \ndifferential comparisons against either the Original Code or another well known, \navailable Covered Code of the Contributor�s choice. The Source Code can be in a compressed \nor archival form, provided the appropriate decompression or de-archiving software is \nwidely available for no charge.\n\n1.12 \"You\" (or \"Your\") means an individual or a legal entity exercising rights under, and \ncomplying with all of the terms of, this License or a future version of this License \nissued under Section 6.1. For legal entities, \"You\" includes any entity which controls, \nis controlled by, or is under common control with You. For purposes of this definition, \n\"control\" means (a) the power, direct or indirect, to cause the direction or management \nof such entity, whether by contract or otherwise, or (b) ownership of more than fifty \npercent (50%) of the outstanding shares or beneficial ownership of such entity.\n\n2. Source Code License.\n\n2.1 The Initial Developer Grant.\n\nThe Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive \nlicense, subject to third party intellectual property claims:\n\n(a) under intellectual property rights (other than patent or trademark) Licensable by \nInitial Developer to use, reproduce, modify, display, perform, sublicense and distribute \nthe Original Code (or portions thereof) with or without Modifications, and/or as part \nof a Larger Work; and\n\n(b) under Patents Claims infringed by the making, using or selling of Original Code, to \nmake, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of \nthe Original Code (or portions thereof).\n\n(c) the licenses granted in this Section 2.1(a) and (b) are effective on the date \nInitial Developer first distributes Original Code under the terms of this License.\n\n(d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code \nthat You delete from the Original Code; 2) separate from the Original Code; or 3) for \ninfringements caused by: i) the modification of the Original Code or ii) the combination \nof the Original Code with other software or devices.\n\n2.2 Contributor Grant.\n\nSubject to third party intellectual property claims, each Contributor hereby grants You \na world-wide, royalty-free, non-exclusive license\n\n(a) under intellectual property rights (other than patent or trademark) Licensable by \nContributor, to use, reproduce, modify, display, perform, sublicense and distribute \nthe Modifications created by such Contributor (or portions thereof) either on an \nunmodified basis, with other Modifications, as Covered Code and/or as part of a Larger \nWork; and\n\n(b) under Patent Claims infringed by the making, using, or selling of Modifications \nmade by that Contributor either alone and/or in combination with its Contributor \nVersion (or portions of such combination), to make, use, sell, offer for sale, have \nmade, and/or otherwise dispose of: 1) Modifications made by that Contributor (or \nportions thereof); and 2) the combination of Modifications made by that Contributor \nwith its Contributor Version (or portions of such combination).\n\n(c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date \nContributor first makes Commercial Use of the Covered Code.\n\n(d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code \nthat Contributor has deleted from the Contributor Version; 2) separate from the \nContributor Version; 3) for infringements caused by: i) third party modifications of \nContributor Version or ii) the combination of Modifications made by that Contributor \nwith other software (except as part of the Contributor Version) or other devices; or \n4) under Patent Claims infringed by Covered Code in the absence of Modifications made \nby that Contributor.\n\n3. Distribution Obligations.\n\n3.1 Application of License.\n\nThe Modifications which You create or to which You contribute are governed by the terms \nof this License, including without limitation Section 2.2. The Source Code version of \nCovered Code may be distributed only under the terms of this License or a future version \nof this License released under Section 6.1, and You must include a copy of this License \nwith every copy of the Source Code You distribute. You may not offer or impose any terms \non any Source Code version that alters or restricts the applicable version of this License \nor the recipients� rights hereunder. However, You may include an additional document \noffering the additional rights described in Section 3.5.\n\n3.2 Availability of Source Code.\n\nAny Modification which You create or to which You contribute must be made available in \nSource Code form under the terms of this License either on the same media as an Executable \nversion or via an accepted Electronic Distribution Mechanism to anyone to whom you made \nan Executable version available; and if made available via Electronic Distribution \nMechanism, must remain available for at least twelve (12) months after the date it \ninitially became available, or at least six (6) months after a subsequent version of that \nparticular Modification has been made available to such recipients. You are responsible \nfor ensuring that the Source Code version remains available even if the Electronic \nDistribution Mechanism is maintained by a third party.\n\n3.3 Description of Modifications.\n\nYou must cause all Covered Code to which You contribute to contain a file documenting the \nchanges You made to create that Covered Code and the date of any change. You must include \na prominent statement that the Modification is derived, directly or indirectly, from \nOriginal Code provided by the Initial Developer and including the name of the Initial \nDeveloper in (a) the Source Code, and (b) in any notice in an Executable version or \nrelated documentation in which You describe the origin or ownership of the Covered Code.\n\n3.4 Intellectual Property Matters\n\n(a) Third Party Claims.\n\nIf Contributor has knowledge that a license under a third party�s intellectual property \nrights is required to exercise the rights granted by such Contributor under Sections 2.1 \nor 2.2, Contributor must include a text file with the Source Code distribution titled \"LEGAL\" \nwhich describes the claim and the party making the claim in sufficient detail that a \nrecipient will know whom to contact. If Contributor obtains such knowledge after the \nModification is made available as described in Section 3.2, Contributor shall promptly \nmodify the LEGAL file in all copies Contributor makes available thereafter and shall take \nother steps (such as notifying appropriate mailing lists or newsgroups) reasonably \ncalculated to inform those who received the Covered Code that new knowledge has been obtained.\n\n(b) Contributor APIs.\n\nIf Contributor�s Modifications include an application programming interface and Contributor \nhas knowledge of patent licenses which are reasonably necessary to implement that API, \nContributor must also include this information in the LEGAL file.\n\n(c) Representations.\n\nContributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor \nbelieves that Contributor�s Modifications are Contributor�s original creation(s) and/or \nContributor has sufficient rights to grant the rights conveyed by this License.\n\n3.5 Required Notices.\n\nYou must duplicate the notice in Exhibit A in each file of the Source Code. If it is not \npossible to put such notice in a particular Source Code file due to its structure, then \nYou must include such notice in a location (such as a relevant directory) where a user \nwould be likely to look for such a notice. If You created one or more Modification(s) \nYou may add your name as a Contributor to the notice described in Exhibit A. You must \nalso duplicate this License in any documentation for the Source Code where You describe \nrecipients� rights or ownership rights relating to Covered Code. You may choose to offer, \nand to charge a fee for, warranty, support, indemnity or liability obligations to one or \nmore recipients of Covered Code. However, You may do so only on Your own behalf, and not \non behalf of the Initial Developer or any Contributor. You must make it absolutely clear \nthan any such warranty, support, indemnity or liability obligation is offered by You alone, \nand You hereby agree to indemnify the Initial Developer and every Contributor for any \nliability incurred by the Initial Developer or such Contributor as a result of warranty, \nsupport, indemnity or liability terms You offer.\n\n3.6 Distribution of Executable Versions.\n\nYou may distribute Covered Code in Executable form only if the requirements of Section \n3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the \nSource Code version of the Covered Code is available under the terms of this License, \nincluding a description of how and where You have fulfilled the obligations of Section \n3.2. The notice must be conspicuously included in any notice in an Executable version, \nrelated documentation or collateral in which You describe recipients� rights relating to \nthe Covered Code. You may distribute the Executable version of Covered Code or ownership \nrights under a license of Your choice, which may contain terms different from this License, \nprovided that You are in compliance with the terms of this License and that the license for \nthe Executable version does not attempt to limit or alter the recipient�s rights in the \nSource Code version from the rights set forth in this License. If You distribute the \nExecutable version under a different license You must make it absolutely clear that any \nterms which differ from this License are offered by You alone, not by the Initial Developer, \nOriginal Developer or any Contributor. You hereby agree to indemnify the Initial Developer, \nOriginal Developer and every Contributor for any liability incurred by the Initial Developer, \nOriginal Developer or such Contributor as a result of any such terms You offer.\n\n3.7 Larger Works.\n\nYou may create a Larger Work by combining Covered Code with other code not governed by the \nterms of this License and distribute the Larger Work as a single product. In such a case, You \nmust make sure the requirements of this License are fulfilled for the Covered Code.\n\n4. Inability to Comply Due to Statute or Regulation.\n\nIf it is impossible for You to comply with any of the terms of this License with respect to \nsome or all of the Covered Code due to statute, judicial order, or regulation then You must: \n(a) comply with the terms of this License to the maximum extent possible; and (b) describe the \nlimitations and the code they affect. Such description must be included in the LEGAL file \ndescribed in Section 3.4 and must be included with all distributions of the Source Code. \nExcept to the extent prohibited by statute or regulation, such description must be \nsufficiently detailed for a recipient of ordinary skill to be able to understand it.\n\n5. Application of this License.\n\nThis License applies to code to which the Initial Developer has attached the notice in Exhibit \nA and to related Covered Code.\n\n6. Versions of the License.\n\n6.1 New Versions.\n\nSocialtext, Inc. (\"Socialtext\") may publish revised and/or new versions of the License from \ntime to time. Each version will be given a distinguishing version number.\n\n6.2 Effect of New Versions.\n\nOnce Covered Code has been published under a particular version of the License, You may always \ncontinue to use it under the terms of that version. You may also choose to use such Covered \nCode under the terms of any subsequent version of the License published by Socialtext. No one \nother than Socialtext has the right to modify the terms applicable to Covered Code created \nunder this License.\n\n6.3 Derivative Works.\n\nIf You create or use a modified version of this License (which you may only do in order to \napply it to code which is not already Covered Code governed by this License), You must (a) \nrename Your license so that the phrases \"Socialtext\", \"CPAL\" or any confusingly similar phrase \ndo not appear in your license (except to note that your license differs from this License) and \n(b) otherwise make it clear that Your version of the license contains terms which differ from \nthe CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or \nContributor in the notice described in Exhibit A shall not of themselves be deemed to be \nmodifications of this License.)\n\n7. DISCLAIMER OF WARRANTY.\n\nCOVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, \nEITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS \nFREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK \nAS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE \nDEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER \nCONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER \nOF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS \nAUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.\n\n8. TERMINATION.\n\n8.1 This License and the rights granted hereunder will terminate automatically if You fail to \ncomply with terms herein and fail to cure such breach within 30 days of becoming aware of the \nbreach. All sublicenses to the Covered Code which are properly granted shall survive any \ntermination of this License. Provisions which, by their nature, must remain in effect beyond \nthe termination of this License shall survive.\n\n8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory \njudgment actions) against Initial Developer, Original Developer or a Contributor (the Initial \nDeveloper, Original Developer or Contributor against whom You file such action is referred to \nas \"Participant\") alleging that:\n\n(a) such Participant�s Contributor Version directly or indirectly infringes any patent, then \nany and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this \nLicense shall, upon 60 days notice from Participant terminate prospectively, unless if within \n60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually \nagreeable reasonable royalty for Your past and future use of Modifications made by such \nParticipant, or (ii) withdraw Your litigation claim with respect to the Contributor Version \nagainst such Participant. If within 60 days of notice, a reasonable royalty and payment \narrangement are not mutually agreed upon in writing by the parties or the litigation claim is \nnot withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 \nautomatically terminate at the expiration of the 60 day notice period specified above.\n\n(b) any software, hardware, or device, other than such Participant�s Contributor Version, \ndirectly or indirectly infringes any patent, then any rights granted to You by such Participant \nunder Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, \nsold, distributed, or had made, Modifications made by that Participant.\n\n8.3 If You assert a patent infringement claim against Participant alleging that such \nParticipant�s Contributor Version directly or indirectly infringes any patent where such claim \nis resolved (such as by license or settlement) prior to the initiation of patent infringement \nlitigation, then the reasonable value of the licenses granted by such Participant under Sections \n2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or \nlicense.\n\n8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements \n(excluding distributors and resellers) which have been validly granted by You or any distributor \nhereunder prior to termination shall survive termination.\n\n9. LIMITATION OF LIABILITY.\n\nUNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, \nOR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR \nANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON \nFOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, \nWITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, \nOR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF \nTHE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR \nDEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY�S NEGLIGENCE TO THE EXTENT APPLICABLE LAW \nPROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF \nINCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.\n\n10. U.S. GOVERNMENT END USERS.\n\nThe Covered Code is a \"commercial item,\" as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), \nconsisting of \"commercial computer software\" and \"commercial computer software documentation,\" as \nsuch terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 \nC.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered \nCode with only those rights set forth herein.\n\n11. MISCELLANEOUS.\n\nThis License represents the complete agreement concerning subject matter hereof. If any provision \nof this License is held to be unenforceable, such provision shall be reformed only to the extent \nnecessary to make it enforceable. This License shall be governed by California law provisions \n(except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law \nprovisions. With respect to disputes in which at least one party is a citizen of, or an entity \nchartered or registered to do business in the United States of America, any litigation relating to \nthis License shall be subject to the jurisdiction of the Federal Courts of the Northern District \nof California, with venue lying in Santa Clara County, California, with the losing party \nresponsible for costs, including without limitation, court costs and reasonable attorneys� fees \nand expenses. The application of the United Nations Convention on Contracts for the International \nSale of Goods is expressly excluded. Any law or regulation which provides that the language of a \ncontract shall be construed against the drafter shall not apply to this License.\n\n12. RESPONSIBILITY FOR CLAIMS.\n\nAs between Initial Developer, Original Developer and the Contributors, each party is responsible \nfor claims and damages arising, directly or indirectly, out of its utilization of rights under \nthis License and You agree to work with Initial Developer, Original Developer and Contributors to \ndistribute such responsibility on an equitable basis. Nothing herein is intended or shall be \ndeemed to constitute any admission of liability.\n\n13. MULTIPLE-LICENSED CODE.\n\nInitial Developer may designate portions of the Covered Code as Multiple-Licensed. \nMultiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered \nCode under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial \nDeveloper in the file described in Exhibit A.\n\n14. ADDITIONAL TERM: ATTRIBUTION\n\n(a) As a modest attribution to the organizer of the development of the Original Code (\"Original \nDeveloper\"), in the hope that its promotional value may help justify the time, money and effort \ninvested in writing the Original Code, the Original Developer may include in Exhibit B \n(\"Attribution Information\") a requirement that each time an Executable and Source Code or a Larger \nWork is launched or initially run (which includes initiating a session), a prominent display of \nthe Original Developer�s Attribution Information (as defined below) must occur on the graphic user \ninterface employed by the end user to access such Covered Code (which may include display on a \nsplash screen), if any. The size of the graphic image should be consistent with the size of the \nother elements of the Attribution Information. If the access by the end user to the Executable and \nSource Code does not create a graphic user interface for access to the Covered Code, this \nobligation shall not apply. If the Original Code displays such Attribution Information in a \nparticular form (such as in the form of a splash screen, notice at login, an \"about\" display, or \ndedicated attribution area on user interface screens), continued use of such form for that \nAttribution Information is one way of meeting this requirement for notice.\n\n(b) Attribution information may only include a copyright notice, a brief phrase, graphic image and \na URL (\"Attribution Information\") and is subject to the Attribution Limits as defined below. For \nthese purposes, prominent shall mean display for sufficient duration to give reasonable notice to \nthe user of the identity of the Original Developer and that if You include Attribution Information \nor similar information for other parties, You must ensure that the Attribution Information for the \nOriginal Developer shall be no less prominent than such Attribution Information or similar \ninformation for the other party. For greater certainty, the Original Developer may choose to \nspecify in Exhibit B below that the above attribution requirement only applies to an Executable \nand Source Code resulting from the Original Code or any Modification, but not a Larger Work. The \nintent is to provide for reasonably modest attribution, therefore the Original Developer cannot \nrequire that You display, at any time, more than the following information as Attribution \nInformation: (a) a copyright notice including the name of the Original Developer; (b) a word or \none phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and \n(d) a URL (collectively, the \"Attribution Limits\").\n\n(c) If Exhibit B does not include any Attribution Information, then there are no requirements for \nYou to display any Attribution Information of the Original Developer.\n\n(d) You acknowledge that all trademarks, service marks and/or trade names contained within the \nAttribution Information distributed with the Covered Code are the exclusive property of their \nowners and may only be used with the permission of their owners, or under circumstances otherwise \npermitted by law or as expressly set out in this License.\n\n15. ADDITIONAL TERM: NETWORK USE.\nThe term \"External Deployment\" means the use, distribution, or communication of the Original Code \nor Modifications in any way such that the Original Code or Modifications may be used by anyone \nother than You, whether those works are distributed or communicated to those persons or made \navailable as an application intended for use over a network. As an express condition for the grants \nof license hereunder, You must treat any External Deployment by You of the Original Code or \nModifications as a distribution under section 3.1 and make Source Code available under Section 3.2.\n\nEXHIBIT A. Common Public Attribution License Version 1.0.\n\n\"The contents of this file are subject to the Common Public Attribution License Version 1.0 (the \n\"License\"); you may not use this file except in compliance with the License. You may obtain a copy \nof the License at _____________. The License is based on the Mozilla Public License Version 1.1 but \nSections 14 and 15 have been added to cover use of software over a computer network and provide for \nlimited attribution for the Original Developer. In addition, Exhibit A has been modified to be \nconsistent with Exhibit B.\n\nSoftware distributed under the License is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY \nKIND, either express or implied. See the License for the specific language governing rights and \nlimitations under the License.\n\nThe Original Code is______________________.\n\nThe Original Developer is not the Initial Developer and is __________. If left blank, the Original \nDeveloper is the Initial Developer.\n\nThe Initial Developer of the Original Code is ____________. All portions of the code written by \n___________ are Copyright (c) _____. All Rights Reserved.\n\nContributor ______________________.\n\nAlternatively, the contents of this file may be used under the terms of the _____ license (the \n[___] License), in which case the provisions of [______] License are applicable instead of those \nabove.\n\nIf you wish to allow use of your version of this file only under the terms of the [____] License \nand not to allow others to use your version of this file under the CPAL, indicate your decision by \ndeleting the provisions above and replace them with the notice and other provisions required by \nthe [___] License. If you do not delete the provisions above, a recipient may use your version of \nthis file under either the CPAL or the [___] License.\"\n\n[NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source \nCode files of the Original Code. You should use the text of this Exhibit A rather than the text \nfound in the Original Code Source Code for Your Modifications.]\n\nEXHIBIT B. Attribution Information\n\nWhen the TableEditor is producing and/or controlling the display the Graphic Image must be\ndisplayed on the screen visible to the user in a manner comparable to that in the \nOriginal Code. The Attribution Phrase must be displayed as a \"tooltip\" or \"hover-text\" for\nthat image. The image must be linked to the Attribution URL so as to access that page\nwhen clicked. If the user interface includes a prominent \"about\" display which includes\nfactual prominent attribution in a form similar to that in the \"about\" display included\nwith the Original Code, including Socialtext copyright notices and URLs, then the image\nneed not be linked to the Attribution URL but the \"tool-tip\" is still required.\n\nAttribution Copyright Notice:\n\n Copyright (C) 2009 Socialtext, Inc.\n All Rights Reserved.\n\nAttribution Phrase (not exceeding 10 words): SocialCalc\n\nAttribution URL: http://www.socialcalc.org\n\nGraphic Image: The contents of the sc-logo.gif file in the Original Code or\na suitable replacement from http://www.socialcalc.org/licenses specified as\nbeing for SocialCalc.\n\nDisplay of Attribution Information is required in Larger Works which are defined \nin the CPAL as a work which combines Covered Code or portions thereof with code \nnot governed by the terms of the CPAL.\n\n\n=========================================\n THE ARTISTIC LICENSE 2.0\n=========================================\n\n\t\t The Artistic License 2.0\n\n\t Copyright (c) 2000-2006, The Perl Foundation.\n\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\nPreamble\n\nThis license establishes the terms under which a given free software\nPackage may be copied, modified, distributed, and/or redistributed.\nThe intent is that the Copyright Holder maintains some artistic\ncontrol over the development of that Package while still keeping the\nPackage available as open source and free software.\n\nYou are always permitted to make arrangements wholly outside of this\nlicense directly with the Copyright Holder of a given Package. If the\nterms of this license do not permit the full use that you propose to\nmake of the Package, you should contact the Copyright Holder and seek\na different licensing arrangement. \n\nDefinitions\n\n \"Copyright Holder\" means the individual(s) or organization(s)\n named in the copyright notice for the entire Package.\n\n \"Contributor\" means any party that has contributed code or other\n material to the Package, in accordance with the Copyright Holder's\n procedures.\n\n \"You\" and \"your\" means any person who would like to copy,\n distribute, or modify the Package.\n\n \"Package\" means the collection of files distributed by the\n Copyright Holder, and derivatives of that collection and/or of\n those files. A given Package may consist of either the Standard\n Version, or a Modified Version.\n\n \"Distribute\" means providing a copy of the Package or making it\n accessible to anyone else, or in the case of a company or\n organization, to others outside of your company or organization.\n\n \"Distributor Fee\" means any fee that you charge for Distributing\n this Package or providing support for this Package to another\n party. It does not mean licensing fees.\n\n \"Standard Version\" refers to the Package if it has not been\n modified, or has been modified only in ways explicitly requested\n by the Copyright Holder.\n\n \"Modified Version\" means the Package, if it has been changed, and\n such changes were not explicitly requested by the Copyright\n Holder. \n\n \"Original License\" means this Artistic License as Distributed with\n the Standard Version of the Package, in its current version or as\n it may be modified by The Perl Foundation in the future.\n\n \"Source\" form means the source code, documentation source, and\n configuration files for the Package.\n\n \"Compiled\" form means the compiled bytecode, object code, binary,\n or any other form resulting from mechanical transformation or\n translation of the Source form.\n\n\nPermission for Use and Modification Without Distribution\n\n(1) You are permitted to use the Standard Version and create and use\nModified Versions for any purpose without restriction, provided that\nyou do not Distribute the Modified Version.\n\n\nPermissions for Redistribution of the Standard Version\n\n(2) You may Distribute verbatim copies of the Source form of the\nStandard Version of this Package in any medium without restriction,\neither gratis or for a Distributor Fee, provided that you duplicate\nall of the original copyright notices and associated disclaimers. At\nyour discretion, such verbatim copies may or may not include a\nCompiled form of the Package.\n\n(3) You may apply any bug fixes, portability changes, and other\nmodifications made available from the Copyright Holder. The resulting\nPackage will still be considered the Standard Version, and as such\nwill be subject to the Original License.\n\n\nDistribution of Modified Versions of the Package as Source \n\n(4) You may Distribute your Modified Version as Source (either gratis\nor for a Distributor Fee, and with or without a Compiled form of the\nModified Version) provided that you clearly document how it differs\nfrom the Standard Version, including, but not limited to, documenting\nany non-standard features, executables, or modules, and provided that\nyou do at least ONE of the following:\n\n (a) make the Modified Version available to the Copyright Holder\n of the Standard Version, under the Original License, so that the\n Copyright Holder may include your modifications in the Standard\n Version.\n\n (b) ensure that installation of your Modified Version does not\n prevent the user installing or running the Standard Version. In\n addition, the Modified Version must bear a name that is different\n from the name of the Standard Version.\n\n (c) allow anyone who receives a copy of the Modified Version to\n make the Source form of the Modified Version available to others\n under\n\t\n (i) the Original License or\n\n (ii) a license that permits the licensee to freely copy,\n modify and redistribute the Modified Version using the same\n licensing terms that apply to the copy that the licensee\n received, and requires that the Source form of the Modified\n Version, and of any works derived from it, be made freely\n available in that license fees are prohibited but Distributor\n Fees are allowed.\n\n\nDistribution of Compiled Forms of the Standard Version \nor Modified Versions without the Source\n\n(5) You may Distribute Compiled forms of the Standard Version without\nthe Source, provided that you include complete instructions on how to\nget the Source of the Standard Version. Such instructions must be\nvalid at the time of your distribution. If these instructions, at any\ntime while you are carrying out such distribution, become invalid, you\nmust provide new instructions on demand or cease further distribution.\nIf you provide valid instructions or cease distribution within thirty\ndays after you become aware that the instructions are invalid, then\nyou do not forfeit any of your rights under this license.\n\n(6) You may Distribute a Modified Version in Compiled form without\nthe Source, provided that you comply with Section 4 with respect to\nthe Source of the Modified Version.\n\n\nAggregating or Linking the Package \n\n(7) You may aggregate the Package (either the Standard Version or\nModified Version) with other packages and Distribute the resulting\naggregation provided that you do not charge a licensing fee for the\nPackage. Distributor Fees are permitted, and licensing fees for other\ncomponents in the aggregation are permitted. The terms of this license\napply to the use and Distribution of the Standard or Modified Versions\nas included in the aggregation.\n\n(8) You are permitted to link Modified and Standard Versions with\nother works, to embed the Package in a larger work of your own, or to\nbuild stand-alone binary or bytecode versions of applications that\ninclude the Package, and Distribute the result without restriction,\nprovided the result does not expose a direct interface to the Package.\n\n\nItems That are Not Considered Part of a Modified Version \n\n(9) Works (including, but not limited to, modules and scripts) that\nmerely extend or make use of the Package, do not, by themselves, cause\nthe Package to be a Modified Version. In addition, such works are not\nconsidered parts of the Package itself, and are not subject to the\nterms of this license.\n\n\nGeneral Provisions\n\n(10) Any use, modification, and distribution of the Standard or\nModified Versions is governed by this Artistic License. By using,\nmodifying or distributing the Package, you accept this license. Do not\nuse, modify, or distribute the Package, if you do not accept this\nlicense.\n\n(11) If your Modified Version has been derived from a Modified\nVersion made by someone other than you, you are nevertheless required\nto ensure that your Modified Version complies with the requirements of\nthis license.\n\n(12) This license does not grant you the right to use any trademark,\nservice mark, tradename, or logo of the Copyright Holder.\n\n(13) This license includes the non-exclusive, worldwide,\nfree-of-charge patent license to make, have made, use, offer to sell,\nsell, import and otherwise transfer the Package with respect to any\npatent claims licensable by the Copyright Holder that are necessarily\ninfringed by the Package. If you institute patent litigation\n(including a cross-claim or counterclaim) against any party alleging\nthat the Package constitutes direct or contributory patent\ninfringement, then this Artistic License to you shall terminate on the\ndate that such litigation is filed.\n\n(14) Disclaimer of Warranty:\nTHE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS \"AS\nIS\" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nNON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL\nLAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL\nBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n[End of LICENSE.txt]\n\n\n"
},
"$:/plugins/rboue/SocialCalc/CHANGES.txt": {
"type": "text/plain",
"title": "$:/plugins/rboue/SocialCalc/CHANGES.txt",
"text": "SocialCalc sources modification\n-------------------------------\n\nAll modifications are under if(TiddlyWiki) test or identified with comments (\"*tiddlywiki*\" string).\n\nVersion 1.0.0 : 2015-02-01\n formula1.js :\n Modify Sheet Cache to handle sheet data in tiddlers.\n socialcalc-3.js :\n Add a callback to monitor commands.\n Replace images or icon's url by tiddler images.\n Modify link behaviour to handle specific TiddlyWiki URL's like <tw:a-tiddler-to-get>.\n socialcalcpopup.js :\n Replace images or icon's url by tiddler images.\n socialcalcspreadsheetcontrol.js and socialcalcviewer.js :\n Add a TiddlyWiki interface object.\n Adapt visual interface to tiddler's smallness.\n Replace images or icon's url by tiddler images.\n Add class attribute to essential DOM elements.\n Enhance events and keyboard management : switch between widget's sheet pages.\n socialcalctableeditor.js :\n Implement a copy functionnality (Ctrl-s).\n Enhance events and keyboard management : grid navigation without browser's interception and\n focus management.\n Replace images or icon's url by tiddler images.\n Other :\n Enhance graph visual and behaviour.\n Add an export to tiddler functionality.\n"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/export.png": {
"type": "image/png",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/export.png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADeUExURf///ygoKHx8fDExMTAwMDQ0NCkpKTMzMy0tLSYmJnl5eTIyMv7+/vn5+eTk5Dg4ODs7O+zs7CwsLEZGRsrKyioqKkJCQvv7+/T09P39/XZ2dn5+fnp6evz8/ODg4BsbG2ZmZra2tjU1NcbGxsjIyCIiIsDAwF5eXsPDwzc3NzY2NmJiYmxsbHh4eObm5m9vby8vL+Xl5UFBQaamplBQUG1tbbCwsFtbW7m5ubKyspeXl9/f34uLi5WVlYmJiYiIiJ2dncHBwfb29vHx8Z6eniAgIJGRkVpaWiEhIa6urtMWpG0AAACnSURBVBjThY/lDsJAEISvdnvXQr3F3d3dHd7/hagAIW0C82ey32Y3Mwj9VDSMxHQkiPK5VOLrRuvKcsuibMaftdFkbKuKIgBQMeaS6ZBi0uc5TgKQaDKO0AIT+EggkEUnQwfgdcwwDC8AKVYROljAYXXW67CswZNm3fl0dpbLgReoXWmUXL9S8nglqZGy5/vL7R2uYPpu3nfBFkd7Eyq7XYfQao7+6gkNmwxuhUmepgAAAABJRU5ErkJggg=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-1x1.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-1x1.gif",
"text": "R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAEBMgA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-aligncenter.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-aligncenter.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIdjI+py+0PD5i02hnh3bkb62XbGD4jUJonlbbu+xYAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-alignleft.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-alignleft.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIdjI+py+0PowO02ktlw1jH7oXcCITLaEpklrbumxQAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-alignright.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-alignright.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIejI+py+0PEZi02hlzuFf7030KRwJiRp5OianuC2cFADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-bordersoff.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-bordersoff.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIdjI+pywr4TjSz2YuzxrXDDYai6EnfiKZqUFLnGhYAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-borderson.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-borderson.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIwjI+pywoPowSIHmtw0Lz6+2XhNnbXhD7lCraiS8LmS8d1mrK3bvezz/vhUI2i8VgAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-chooserarrow.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-chooserarrow.gif",
"text": "R0lGODlhBQAKAMQCAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAIALAAAAAAFAAoAAAUTYCCMwieOn4mmYsq6rVqeAk2SIQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-commentbg.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-commentbg.gif",
"text": "R0lGODlhBAAEAJECAP////8CAv///wAAACH5BAEAAAIALAAAAAAEAAQAAAIHRC4WkstQAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-copy.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-copy.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI4jI+pEOytopzwgIvzlWx26HyRiITaY4hksqbNiYIv1YIYa5U092quG9qNhIuer1b7LWAZivM5KQAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-cursorinsertleft.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-cursorinsertleft.gif",
"text": "R0lGODlhBAAEAIAAAP///////yH5BAEAAAEALAAAAAAEAAQAAAIFRB6GelAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-cursorinsertup.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-cursorinsertup.gif",
"text": "R0lGODlhBAAEAIAAAP///////yH5BAEAAAEALAAAAAAEAAQAAAIFRB6GelAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-cut.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-cut.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIujI+pCNvL0oNnGkvDxHln1XBf+DmleUZip6VX5XolQFc15cloq4NwD7pphC5IAQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-defaultcolor.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-defaultcolor.gif",
"text": "R0lGODlhBAAEAIAAAKampv///yH5BAEAAAEALAAAAAAEAAQAAAIFRB6GelAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-deletecol.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-deletecol.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI2jI+pwHzwGjQzVFTz25Rbj3laR37lJabaaJrQxMbp2cHzt94ozbdyGer9fCCdRHRUKJfMZqAAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-delete.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-delete.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIrjI+pywrxIpyy2fTuXBmz3hmgNTYh5V0n550rUn6HO8uOrWq6xKOvDgwCCwA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-deleterow.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-deleterow.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIvjI+pwO3PDlDUTFvpDTtLCYWNR1ZbV05oonIf1mZxidX0LeYvfd6unQLlIL4iqQAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-divider1.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-divider1.gif",
"text": "R0lGODlhAQAUAIAAAJmZmQAAACH5BAAAAAAALAAAAAABABQAAAIEhI+ZBQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-drag-handles.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-drag-handles.gif",
"text": "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"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-drag-handles.png": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-drag-handles.png",
"text": "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"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-endcap-h.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-endcap-h.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAITwBNmSo1UGCpgwILEiQ48J/DhxAjQiwlsaJEihYz/jOlMSPGjhdBVuQoMiLJkg9Poty48uHHlS9RqkQZs+RMmy0d1hR5U+RCgwMZLmQYNCAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-endcap-v.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-endcap-v.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAISgD/CRxIsGDBUqVMmUq4EKHChg8TljJI8aCpihj/KcxYESFHihs/WhRZcCFJgiZPCkyocuXFliFVeoT5UmVKmzVPsmy50+ZEngEBADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-filldown.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-filldown.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAJAjI+pAe3vDECTplola2xPbEUfBx6ZZnUmxJaoeb3dN9eqfKPnmat7C5HxhkKdMUdM/YARZEyZgoU4uCRvgTUUAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-fillright.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-fillright.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI7jI+pwO3fDEDz1HAlnlx7u2GUmJFddZXZClLQ63xiO4MM+akh2413n0qwaCqYUYFMKpMpI2zJhEqnigIAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-formuladialog.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-formuladialog.gif",
"text": "R0lGODlhEgAMAIAAAAQEBP///yH5BAEAAAEALAAAAAASAAwAAAIjjI+pAb3rwJEMUnNrcljlxmXdBI6IyGnndomqlKpyuZnPbRQAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-hidecol.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-hidecol.gif",
"text": "R0lGODlhFAAUAIABAP///wAAACH5BAEAAAEALAAAAAAUABQAAAIyjI+pwHzwGjQzVFTz25Rbj3laR37lJaanaiZj+8YgK6+2S+d3eNfw3JOIhIqi8YgMFAAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-hiderow.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-hiderow.gif",
"text": "R0lGODlhFAAUAIABAP///wAAACH5BAEAAAEALAAAAAAUABQAAAIrjI+pwO3PDlDUTFvpDTtLCYWNR5bm+U0qx64dCsekSH/n9no4itOhDEwUAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-insertcol.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-insertcol.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI7jI+pwGz9GjjzxVpD3td6TXXgx2nOiJZQGnpryZpYG7+0esL4TFKSdAv9YrVcsIckInS05Q24gCqm0wIAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-insertrow.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-insertrow.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAItjI+pwO3fDFD0zHDrkppeCD6dNVaMF4pJCq1sVCJnLJtvi9Fcrn86f8P9hooCADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-hd.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-hd.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIjABNmSpFcCDBgqUEJhQ4ENu1a9gcRpwIUSJEgeHCiROnMSPHjR01iiP4r6TJkyhNJkyJkkzKlSxLkimTcmDMf2Vy1iwVM6dOlDBR+vx5kmTLoTSB8hSK9KUpljNzukRpE6rPmk97ElWZNeZMpzdl7gwbkyDHjGg/nvWYUeBEiW8rRqx48KBChQsNHgwIADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-hh.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-hh.gif",
"text": "R0lGODlhFAAUAKIAANfX1+Li4uHh4djY2KWlpaampv///wAAACH5BAAAAAAALAAAAAAUABQAAANWSFRb3C6qOEC9I+s9XBBg8IljKHyMoa5suypuS7hOvNYtHkd0YS8w2cwF8cmMLMiiR5voXkgWg3f8TZi2Kda6zXZtzRMJRP6UQQqNpbLmaCTTOHyiSAAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-hn.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-hn.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIiQBNlRpYypRBgQUPFiRoCptDh9ciPpSI7VpFg+HEhcvIcaPHjRrDCVxHsqTJkyULojxZqqQ6kgNXpmzJkubKhChjrhRoMKepmwpRjqzJ0+ZMoUV/slR6kmfPpTIXMp35cudTk0NlXi25dSdSmWDXDQSZMWTZsiHFDXzItm3FiQYHxkW4kCFCUwEBADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-vd.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-vd.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIjQBLlTJFcKDBgaYECixoClu4fxAjSpQYDltCbOImaowoDttAjBs3ViR47WHIiRU/mjwZcWTDjCw5WizlUGOZMhpH0oQZ8eZNlB5fSvTpU2JHlRHJkCG6lOO1iyaXLi0jVSnElA0fMiVatCPBmjGvBgUbVifIsP+8CkUb7hpStF5prozpMiFCgnYXKiwYEAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-vh.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-vh.gif",
"text": "R0lGODlhFAAUAKIAANfX1+Hh4eLi4tjY2KWlpaampv///wAAACH5BAAAAAAALAAAAAAUABQAAANjWErFvY0wR4YwOGstgATXJmIBoADBOAoDA6oiywwprAVD89oZ29AiRqxVAGoehQ1OV8MgJZxWJWR4OBQ9UzEUUUSEBlkBVfVOzkmxhdfLTdkk0xuubvJ8W7hhmafnvFZPV2cJADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-vn.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-less-vn.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIlQBLCTRVypRBgQMJFjxYCpu4dRAjRlQnMRw2gg4hUpTIcZ1FgdjCdRzpEVvBjCQ5WsQoMqVEcSZNoXQJEWbBaw85Cuy4UmbLiApLbax5UWZOiAQNEqxYNOQ6igcVGoxo0yjEhVGTQuyZMSlCr0thGpw5dOTHhkdp2iyFk2ZErj9TUhRrqq3bdXSd3l2JsK/UggMBlwoIADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-linkdialog.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-linkdialog.gif",
"text": "R0lGODlhEgAMAIAAAAQEBP///yH5BAEAAAEALAAAAAASAAwAAAIejI+py+0BYkRyGpAwzPcdDVZit3ml9pHpVVGtCTsFADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-linkout.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-linkout.gif",
"text": "R0lGODlhFAALANUCAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAIALAAAAAAUAAsAAAYwQIEQQCwajcLhkRhoOpGCZdHZREqN1KuUGtAen1UvMwzoip/aKJYsVU7N6aS4mAwCADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-lockbg.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-lockbg.gif",
"text": "R0lGODlhBAAEAJECAP////8CAv///wAAACH5BAEAAAIALAAAAAAEAAQAAAIHRC4WkstQAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-lock.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-lock.gif",
"text": "R0lGODlhDQAUAMIGAGFhYbm5ucLCwt3d3fHx8f39/QAAAAAAACH5BAEKAAcALAAAAAANABQAAAMqeLrc/jDKuYq1DyvNSvNfKFYdYZ6mRkTgunFtJx/uNtcHaOfse/0cCiUBADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-logo.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-logo.gif",
"text": "R0lGODlhEAAQANU5AJeXl5qamufn55ubm/X19dbW1q2trYGBgYyMjLe3t8PDw+Dg4IuLi4aGhllZWdvb28LCwmVlZWZmZm1tbW9vb66urubm5sXFxYeHh25ublpaWmlpadra2qKiooCAgGpqanh4eJCQkOvr68zMzHNzc5GRkcfHx9zc3MbGxqSkpGNjY1JSUqysrPT09PLy8vPz89DQ0HZ2dnd3d7i4uM/Pz2BgYKGhoVFRUVBQUP///wAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADkALAAAAAAQABAAAAbEwJyL5prJYghGLDYbWnICBw4HcIk2tZELMHU8bLewLVeo1QI52hRng61nuUGDNCA8cOHZ7HAAqDIQOTkEERMAHgczMS9QeDaPYDgtOS9HBAsDJXCCaR0BBQsyIB81KTQ0nIIwCWYUEmYhNDCpOTAVZhEyARgYF7OpKAMGRjKMCysajIITNwSUMjMINgo3OAYwNBfVCjYMMxzVbCYNCQYBJyx4N9xTN2MQZhVpazYW4QgvZTUJW+2oAjZoKJLhKgY0gKiCAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-main-h.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-main-h.gif",
"text": "R0lGODlhCgAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAACgAUAAAIKgBVuXoFi5UqVaxeufrHsKHDhxAjSpxIsaLFixgzatzIcWKpj6ZKhRwZEAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-main-v.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-main-v.gif",
"text": "R0lGODlhFAAKAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAKAAAINABN/RtIsKBBgqoEHlxY0FUphhD/vVIY8SAsihULssKYcaCqhx0LpgIZcuAqkiVdcez4KiAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-merge.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-merge.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIxjI+pywoBnpQQvobRNbueDmpiRkbmiUZjuWYh6XFwbKV2NzvtK3973phUVEIc8IgoAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-hd.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-hd.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIjgBNlRJoqmCpgQUFIkRoCts1bA4hSpzo8OFBceEyZsQoriNHjBkL/htJsqRJkiJNljlpUuDJMmRYkhz4ssxKmTRVkrEp06VKmzxPpiy5E+jNkjlL2ty5U6ipk0ybCi0FFSjOpz+POq0pc+RQkjG7/jsotqcpjRo7hgOZNuPAiBCvPYw4d+JBgwwXKiQoMCAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-hh.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-hh.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIhQBLmRo4sJRAggYFHjR47Rq2hw8bQnQIEdvAcOIyhtuIcaPGjuEE/htJsqRJkqZKnVR5sqRIky9b/jN4kqDMmSxdKpQ5sGbKnitNBUXoM+jCojBTxiwJVGdTk09HKr25dGTVpDVvWs2pFaopjxnFeewYFqO4gRXTVpSI7dpPgnALJkRYKiAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-hn.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-hn.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIiQBLCSxlimBBggNNHUSIraHDaw6xQYyIrWA4ceIuYrwYTqNHcQrXiRSpbqTJkwRPriul8mRBlS9HljQZ0mXMlilRCjTVct3NkQWDtqwp86BCni5Z6jQKEylNhTltNiWaVOXOnj6V0tSK0ylQrCKpgn2qEWPGjmY3oi0ocSLFiNcmDpxrEGHdugEBADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-vd.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-vd.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIlABNlTJFsNTAgQINClxIEJu4fxAjSpQoDttAbOEmaoxYsWHGjRrDXWv4EOREkRdLmowYDhvJlRJbGnT4r0wZMjZx5rT5r+LMjzdt7uT5T6YpjBGFktFZhqVFU9c+QgwqlOLIUkglCm0a0+VRlUm5UvSaFWZRsmBXGqVptufIo1JhGo3atqdLrHHVXkNY8OBCvwQLBgQAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-vh.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-vh.gif",
"text": "R0lGODlhFAAUAKIAANfX1+Hh4eLi4tjY2KWlpaampv///wAAACH5BAAAAAAALAAAAAAUABQAAANkSEW6vLDANoS5OGcxZNUgxjFfCAYAaZkaqgwB23YELG/01yj8Uxichc3AkxgZl1FtZXDsCBiUMIaJSHAe5sXxywRoAGpmAQoWSjfDd5q+rGvi2+gcl63PWllw2VYPdkYSPkc9CQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-vn.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-more-vn.gif",
"text": "R0lGODlhFAAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAUAAAIjwBLlTIlcCDBggcHGjSFLdy6hxAjRhSHzRRDhxIzPgyHTeA1h+o0SqRIEJs4kRk5CmyIcmTHUixFhoTIseRJhQRzCiS4TiXMk+sWKlS48dpAkxBx6oRIcSXQhxYXRqx5UaLBUhJrwsQY0WJGkqU+tpxa8edYpi9jnlXJ8OlYcUbNnl0HFulctgstHsyp92pAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-movefrom.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-movefrom.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAI7jI+pwO2sDJQHBBstvnUnvIURR5UeMpHcWanhg5ZuS8+2JFK5Xqce2KtdHkThKHNMspLDBvOTehqliQIAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-movefromoff.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-movefromoff.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAIwjI+pEOwNlVyTzXveixRjHVndBZRixqHGeX4UyLGeOscICK/1uOt9Y2p5TD9fEVEAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-moveinsert.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-moveinsert.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAI4jI+pkOAPnWGIqonrPdTi+ARds2WeKILMqJUsWprcuUxgTEt4HcP8LKFlNkKYykdyEXcXVaQXKwAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-moveinsertoff.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-moveinsertoff.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAIzjI+pkOzxmJGqwtlsXvfdf1AaiESfJI4baaFhqgHyDJdLreJ2lXpq3MKYfkEe0WjyHREFADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-movepaste.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-movepaste.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAI2jI+poL0ODYtu0nfxAbx7LiVWM42BKYYI83WnWkbxydLta3uyWK+uOasIc7+hMQVBSVqfjKMAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-movepasteoff.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-movepasteoff.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAIxjI+poL0ODYtu0nfxYTx0a2VT6InNV6ajZHpg2anATGcbya6Ibj8ozurZgLBiTIgoAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-multilinedialog.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-multilinedialog.gif",
"text": "R0lGODlhEgAMAIAAAAQEBP///yH5BAEAAAEALAAAAAASAAwAAAIWjI+JwO0KY3JA2htow/zo30lbSJZBAQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-paneslider-h.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-paneslider-h.gif",
"text": "R0lGODlhCQAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAACQAUAAAIZgBLmRpoSqDBa9gSKiyITZxDceGuDcQW7p/FiKVKXat4UaIpihb/icM2kaNIkh/FhQyHsuFKbAJBWhxZ8JrKmTBThqRZyiVOhiZ5+hR5TaDNnRJ73vzHsuRDljGxXUOYkGBBgxkDAgA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-paneslider-v.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-paneslider-v.gif",
"text": "R0lGODlhFAAJAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAJAAAIWQBNCTRViiDBggUFIkSI7Rq2hw8dQpz4UCA2cRjDaRSncSNGjNgKXvxHsqRJk+GuEcQW7qTLkilLlRr50qU4bBbDfeTIsePOlCshXhsasehEmQcHIjy4MGFAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-pasteformats.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-pasteformats.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI6jI+pwO2tAjAT1ZruuxFH2YHTKIafxCxnmZUe2Z6wtc4HiVNgbO735/EJfyrKJlWUuYaqXHBxfK4UBQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-paste.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-paste.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI7jI+pwO2tAjAT1ZruuxFH2YHTeHjldy7L5lCi+3GZtIG2hXIkQ/OpeVMFXSwbEPgrKnPMWLPDgqCmgQIAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-peerbg.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-peerbg.gif",
"text": "R0lGODlhBAAEAJEAAP////8AAP///wAAACH5BAEAAAIALAAAAAAEAAQAAAIHjHESIMJdAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-range2.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-range2.gif",
"text": "R0lGODlhBAAEAIAAAKampv///yH5BAEAAAEALAAAAAAEAAQAAAIFRB6GelAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-recalc.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-recalc.gif",
"text": "R0lGODlhFAAUAMQBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAUABQAAAU7YCCOZGmeAYCuKaCyKem+byzL7qjW7Sz6uhMPGOP9cLTgigjT5ZpIaFSqrFKFM+MvC9M2mV5T+EpehQAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-redo.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-redo.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIwjI+pyx0Aozuxgmmtq1Qy310fpICJaaDhoj5k+Z5xmskiotnsvLLjPekFhcOikVEAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-scrollarea-h.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-scrollarea-h.gif",
"text": "R0lGODlhCgAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAACgAUAAAIPwBNlTJFcKDAUtiwXUvIMGG4hxDDiXu4rqLFi/8yatzIsaPHjyBDihxJsqTJiyjXSZQ4EaI4hQ0ZXhtI0+DAgAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-scrollarea-v.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-scrollarea-v.gif",
"text": "R0lGODlhFAAKAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAKAAAIUABNYRO37p/BgwgNrguHzZSpawQTSvy38JrDgQUnIlwnDlupUtjCZdSosONHjCQPLmwIUmTKkixDjiS50lSpa+HUvaTIsJTAiC8rngSasmZAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-sumdialog.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-sumdialog.gif",
"text": "R0lGODlhEgAMAIAAAAQEBP///yH5BAEAAAEALAAAAAASAAwAAAIcjI+pwO16nIQRJEsNy3Tzi31aKHpRJj1QqopZAQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-swapcolors.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-swapcolors.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEAAAEALAAAAAAUABQAAAI3jI+py40A3IJQvhiq1YYz32GfeICJaV7USpaZ1L5ORNJuG+PyW+/2o9CJfh3frnjiKW0xi1NSAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-hd.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-hd.gif",
"text": "R0lGODlhDwAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAADwAUAAAIZQBNlRJYaqCpgwcHFvzHsKHDhgIfSmQ48GGZiw8PWiRDJqOpjWU8gny40OHFjg41OiSDMeVHkxxFrmwJ8WXDMixJlrKIUyfPkCl3rszpsORNmhRtMsQJtOZEiRWfukSYkGDVUgEBADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-hh.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-hh.gif",
"text": "R0lGODlhDwAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAADwAUAAAIWQBLmRookKCpggdN/VvIsCHDgw4jLoTYMKFDig8HXlRYUWPHjaUcCtzIMePFkR87lpwYsmEplCZdvtxIkqbMlf9gLhTYMmZGnDpzBg0qMSfOojwTDkz4smBAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-hn.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-hn.gif",
"text": "R0lGODlhDwAUAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAADwAUAAAIkABNCRxYqpTAggdLYVvIsCFDgdjCSZwoUVw4cdgKYrNocaA4i+EymtpYEeFFidggVgxn0NRHiylHXrRosNREcdcgcmQpcGa4nKauUTx4EqMphRRrggxpkKREoiCBRpyplGPMqRehwjxKkubRmRgNXluqtGJKpCBr3rx6MhzRk2x9vnwpleG1hXcbIkyIcK/AgAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-vd.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-vd.gif",
"text": "R0lGODlhFAAPAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAPAAAIWQBNCRRYqtTAgggJmjL4r6HDhxAdCoxIEeLEihgZYqyocWPEi2TKiBw5MqTIhgsblixDxqRIkyhNqSRJk2TDgh4ppswJESfPhzt/oiwl1KHBggsVHlx41GBAADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-vh.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-vh.gif",
"text": "R0lGODlhFAAPAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAPAAAIVgBLmRpYSqCpggILEiRY6p/DhxAjPhQosWLEgRYz/qOoseLBjh5NOVxocODBgw03pkxokqHClB83mjTIEuVIkSAv4sz5ECPPnjt/+vypEuXJozONmgoIADs="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-vn.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-thumb-vn.gif",
"text": "R0lGODlhFAAPAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAFAAPAAAIjgBNCSxVaiBBUwQLIixIENs1bA4fRoToEOK1awixhRMnbqNHjh07bsRWEJvIkyhBiiNZymS4lxtFvlQpDqMplxw/wszZkaSpa+EEGhTKsGA4nxoRKl0odOFRgSaLNp1qqmZDnjNjhhSJDerHkFnBrsw4E+RXjyNL7kR7sqzNiw8vWpxLEeJBhksTKtVrKiAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-trackingline-h.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-trackingline-h.gif",
"text": "R0lGODlhAgAIAJECAKampqWlpf///wAAACH5BAEAAAIALAAAAAACAAgAAAIHjCEpAaZSAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-trackingline-v.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-trackingline-v.gif",
"text": "R0lGODlhCAACAJECAKWlpaampv///wAAACH5BAEAAAIALAAAAAAIAAIAAAIHRCRxYhiACgA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-undo.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-undo.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAIxjI+py30Ao3uxzopBs4YviYCKSGkfNKKpmZDlyXZZq4beu8JMbPNT4PoFL7Wf8WgoAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhidebottom.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhidebottom.gif",
"text": "R0lGODlhDAAJAKEBAMzMzP///////////yH5BAEKAAIALAAAAAAMAAkAAAIUjI8BycvogJzxUKeghAkb/1wiIBQAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhideleft.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhideleft.gif",
"text": "R0lGODlhCQAMAKEBAMzMzP///////////yH5BAEKAAIALAAAAAAJAAwAAAIWRI5niavd3AIU0vrChUomz2ShcJVAAQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhideright.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhideright.gif",
"text": "R0lGODlhCQAMAKEBAMzMzP///////////yH5BAEKAAIALAAAAAAJAAwAAAIWjG+AqMkHWpCx0TphdInCt3BhRUZCAQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhidetop.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-unhidetop.gif",
"text": "R0lGODlhDAAJAKEBAMzMzP///////////yH5BAEKAAIALAAAAAAMAAkAAAIUhI8gwe0BXnSTHdpStmnWt4GYmBUAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-unlock.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-unlock.gif",
"text": "R0lGODlhDQAUAMIGAGFhYbm5ucLCwt3d3fHx8f39/QAAAAAAACH5BAEKAAcALAAAAAANABQAAAMreLrc/jDKU2p9V2VWWp+fFEZjQZzomRGkwmrb92qcWy/yTVMtZf2WiZCRAAA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-unmerge.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-unmerge.gif",
"text": "R0lGODlhFAAUAIABAP///////yH5BAEAAAEALAAAAAAUABQAAAI0jI+pywoBnpQQvobRNbueDmpiRkbmiUYjt3rs14bw/NbuDaa6Smay/cO1eotJRWXsEJeNAgA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-wikiflag.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-wikiflag.gif",
"text": "R0lGODlhDQAMAJEAABrH7P///////wAAACH5BAEAAAIALAAAAAANAAwAAAIijI8hEuD/FAPJ0NWyzZjSfU1aFpJm6Z2SlnJihULQWiFLAQA7"
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-wikilinkflag.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-wikilinkflag.gif",
"text": "R0lGODlhEAAMAJEAABrH7P///////wAAACH5BAEAAAIALAAAAAAQAAwAAAIplIKpagEP4wsNrGWrUxblY3Ve922htGmiQ1LglojluXoufNmVxN/5VQAAOw=="
},
"$:/plugins/rboue/SocialCalc/Lib/Images/sc-save.gif": {
"type": "image/gif",
"title": "$:/plugins/rboue/SocialCalc/Lib/Images/sc-save.gif",
"text": "R0lGODlhFAAUAIAAAP///////yH5BAEKAAEALAAAAAAUABQAAAI2jI+pCw0Lg3tRzWodTnefXk2ixoyiZZgkJTWp+VLdGMvuR8Y6cuM2G1nlSjeV8Xc81ZJAT6IAADs="
},
"$:/plugins/rboue/SocialCalc/config.json": {
"title": "$:/plugins/rboue/SocialCalc/config.json",
"type": "application/json",
"text": "{\n\"\":\"Localisation\",\n \"LANG\": \"en-GB\",\n\n\"\":\"Graphics of the Graph tab. Actually the only choice is \\\"native\\\".\",\n \"graphics\": \"native\",\n\n\"\":\"Visualization mode. \\\"edit\\\" to modify the sheet. \\\"view\\\" to view the sheet in read-only mode.\",\n \"mode\": \"edit\",\n\n\"\":\"Display grid (\\\"yes\\\") or no (\\\"no\\\").\",\n \"displayGrid\": \"yes\",\n\n\"\":\"Height of widget in pixel when in tiddler editor.\",\n \"heightInTiddlerEditor\": \"400\",\n\n\n\"\":\"\"\n}"
},
"$:/plugins/rboue/SocialCalc/edit-socialcalc.js": {
"text": "/*\\\ntitle: $:/plugins/rboue/SocialCalc/edit-socialcalc.js\ntype: application/javascript\nmodule-type: widget\n\nThe edit-socialcalc widget edit a SocialCalc sheet stored in a tiddler.\n\n```\n<$edit-socialcalc tiddler=\"myTiddler\" height=\"400\"/>\n```\n\nThe widget displays a SocialCalc sheet stored in the specified tiddler.\nThe width and height attribute are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\nThe mode attribute defines the type of display : \"edit\" to edit the data (default value), \"view\" to\ndisplay without modification\nThe grid attribute defines the display grid behaviour : \"yes\" to display the grid (default\nvalue), \"no\" otherwise.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CONST_NODE_ID_PREFIX = \"SocialCalcWidget\"; // prefix of root node's id attribute\nvar CONST_NODE_CLASS = \"SocialCalcWidget\"; // class of root node\nvar CONST_MIN_HEIGHT = 300; // root node minimal height\nvar CONST_PLUGIN_PATH = \"$:/plugins/rboue/SocialCalc\";\nvar CONST_CONFIG_TIDDLER = \"$:/config/rboue/SocialCalc\";\nvar CONST_CONFIG_DEFAULT_TIDDLER = CONST_PLUGIN_PATH+\"/config.json\";\nvar CONST_SHEET_TIDDLER_TYPE = \"application/x-socialcalc\"; // type of sheet tiddler\n\n// Get session configuration.\nvar sessionConfig = null;\nvar configTiddler = $tw.wiki.getTiddler(CONST_CONFIG_TIDDLER);\nif ((typeof(configTiddler) != \"undefined\") && configTiddler) {\n sessionConfig = $tw.wiki.getTiddlerData(configTiddler, null)\n}\nif (!sessionConfig) {\n var configTiddlerDefault = $tw.wiki.getTiddler(CONST_CONFIG_DEFAULT_TIDDLER);\n if ((typeof(configTiddlerDefault) != \"undefined\") && configTiddlerDefault) {\n sessionConfig = $tw.wiki.getTiddlerData(configTiddlerDefault, null)\n }\n}\n\n// Create objects\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar SocialCalc = require(\"./Lib/socialcalc-min.js\").SocialCalc;\nvar Graph = require(\"./Lib/graph.js\").Graph;\n Graph.init(SocialCalc, sessionConfig);\nvar TiddlyWiki = require(\"./tiddlywiki.js\").TiddlyWiki;\n TiddlyWiki.init(SocialCalc, sessionConfig);\n\nvar EditSCWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n};\nEditSCWidget.instanceNb = 0; // count class instances\n\n// Inherit from the base widget class\nEditSCWidget.prototype = new Widget();\n\n//=======================================================================================\n\n// Render this widget into the DOM\nEditSCWidget.prototype.render = function(parent, nextSibling) {\n var fonc = \"EditSCWidget.render\";\n var self = this;\n\n // Debug tools\n var hack = {\n flagActiv: true, // Activate the logs\n log: function(mess, flagNoLog, fonc) {\n if (!hack.flagActiv || flagNoLog) return;\n var id = \"[]\";\n var ss = SocialCalc.GetSpreadsheetControlObject();\n if (ss) id = \"[\"+ss.idPrefix+\"]\";\n console.log(id+(fonc ? fonc+\": \" : \"\")+mess);\n },\n // Following are flags activating logs for specific fonctionnalities.\n // Value : false to activate, true to desactivate (no log).\n bug: false, // current bug investigation\n com: true, // command execution\n save: true, // tiddlywiki-save commande\n recalc: true, // recalc\n recalcLink: true, // recalc : page link in formula\n link: true, // page link in formula loaded as tiddler\n url: true, // text-link cell\n filesystem: true, // filesystem\n keyboard: true, // keyboard\n loc: true // localization\n };\n if (!window.hack) window.hack = hack;\n\n this.parentDomNode = parent;\n this.computeAttributes();\n this.flagEditWidget = this.execute();\n\n // Create element and assign attributes\n this.nodeRoot = this.document.createElement(\"div\");\n this.nodeRootId = CONST_NODE_ID_PREFIX + \"-\" + ++EditSCWidget.instanceNb;\n this.nodeRoot.setAttribute(\"id\", this.nodeRootId);\n this.nodeRoot.setAttribute(\"class\", CONST_NODE_CLASS);\n if (this[\"class\"])\n this.nodeRoot.setAttribute(\"class\", CONST_NODE_CLASS + \" \" + this[\"class\"]);\n if (this.width)\n this.nodeRoot.setAttribute(\"width\", \"\"+this.width+\"px\");\n if (this.height)\n this.nodeRoot.setAttribute(\"height\", \"\"+this.height+\"px\");\n\n // Insert element\n parent.insertBefore(this.nodeRoot, nextSibling);\n this.domNodes.push(this.nodeRoot);\n\n // Get data tiddler\n if (!this.tiddler) {\n nodeRoot.innerHTML = \"Error: you must specify a SocialCalc data tiddler\";\n return;\n }\n\n var tiddler = null;\n var tiddler1 = this.wiki.getTiddler(this.tiddler);\n if ((typeof(tiddler1) == \"undefined\") || !tiddler1) {\n this.wiki.addTiddler(new $tw.Tiddler({title: this.tiddler, type: CONST_SHEET_TIDDLER_TYPE, text: \"\"}));\n tiddler = this.wiki.getTiddler(this.tiddler);\n } else\n tiddler = tiddler1;\n\n // Get widget configuration\n this.flagView = false;\n if (this.mode && (this.mode.toLowerCase() == \"view\") ||\n (sessionConfig && sessionConfig.mode && (sessionConfig.mode.toLowerCase() == \"view\")))\n this.flagView = true;\n this.flagDisplayGrid = true;\n if (this.grid && (this.grid.toLowerCase() == \"no\") ||\n (sessionConfig && sessionConfig.grid && (sessionConfig.grid.toLowerCase() == \"no\")))\n this.flagDisplayGrid = false;\n if (sessionConfig && sessionConfig.heightInTiddlerEditor && this.flagEditWidget)\n this.height = sessionConfig.heightInTiddlerEditor;\n \n var widgetConfig = {\n mode: this.flagView ? \"view\" : \"edit\"\n };\n if (sessionConfig && sessionConfig.filesystem) {\n widgetConfig.filesystem = {};\n if (sessionConfig.filesystem.PATH)\n widgetConfig.filesystem.PATH = sessionConfig.filesystem.PATH;\n }\n\n // Get Socialcalc and adapt it to TiddlyWiki\n if (!SocialCalc) {\n this.nodeRoot.innerHTML = \"Error: SocialCalc missing !\";\n return;\n }\n\n // Hack : execution of handlers defined with raw HTML, like onclick=\"SocialCalc.Bazz()\".\n // SocialCalc must be defined at top level.\n if (!window.SocialCalc) window.SocialCalc = SocialCalc;\n // Hack : TiddlyWiki must be defined at top level.\n if (!window.TiddlyWiki) window.TiddlyWiki = TiddlyWiki;\n\n this.tiddlyWiki = new TiddlyWiki(this, this.tiddler, widgetConfig);\n this.setSheetGeometry(this.nodeRoot);\n\n // Activate wiki-text\n if (Document && Document.Parser) {\n SocialCalc.Callbacks.expand_wiki = function(val){\n return \"<div class=\\\"wiki\\\">\" + new Document.Parser.Wikitext().parse(val, new Document.Emitter.HTML()) + \"</div>\";\n };\n }\n\n hack.log(\"tiddler: \"+this.tiddler, hack.com, fonc);\n\n if (!this.flagView) {\n // Edit mode\n\n // Create spreadsheet\n this.spreadsheet = new SocialCalc.SpreadsheetControl(\"SocialCalc-\"+EditSCWidget.instanceNb+\"-\", this.tiddlyWiki);\n\n // Add graph tab\n // Hack : execution of handlers defined with raw HTML, like onclick=\"Graph.Bazz()\".\n // Graph must be defined at top level.\n if (!window.Graph) window.Graph = Graph;\n Graph.addGraphTab(this.spreadsheet);\n \n // Initialise UI\n this.spreadsheet.InitializeSpreadsheetControl(this.nodeRootId, 0, 0, 0);\n this.tiddlyWiki.addImportExportUI(this.spreadsheet);\n \n // Execute initial commands\n this.spreadsheet.ExecuteCommand(\"redisplay\", \"\");\n \n // Load data from tiddler\n this.loadData(tiddler);\n \n // Add new commands\n this.tiddlyWiki.addNewCommands(this.spreadsheet, this.tiddler);\n \n // Start monitoring\n this.tiddlyWiki.monitor(this.spreadsheet);\n\n } else {\n // View mode\n\n // Create spreadsheet\n this.spreadsheet = new SocialCalc.SpreadsheetViewer(\"SocialCalc-\"+EditSCWidget.instanceNb+\"-\", this.tiddlyWiki);\n if (!this.flagDisplayGrid)\n this.spreadsheet.context.showGrid = false;\n\n // Initialise UI\n this.spreadsheet.InitializeSpreadsheetViewer(this.nodeRootId, 0, 0, 0);\n\n // Execute initial commands\n this.spreadsheet.editor.EditorScheduleSheetCommands(\"redisplay\");\n\n // Load data from tiddler\n this.loadData(tiddler); \n }\n};\n \n//=======================================================================================\n\n// Compute the internal state of the widget\nEditSCWidget.prototype.execute = function() {\n var fonc = \"EditSCWidget.execute\";\n\n // Get our parameters\n\n var flagEditWidget = false;\n this.tiddler = this.getAttribute(\"tiddler\", this.getVariable(\"currentTiddler\"));\n var tiddler = this.wiki.getTiddler(this.tiddler);\n if (this.tiddler && tiddler && tiddler.isDraft()) {\n // The tiddler is a draft.\n // We suspect that widget is used as default editor for tiddlers of type application/x-socialcalc.\n flagEditWidget = true;\n }\n\n this.width = this.getAttribute(\"width\");\n this.height = this.getAttribute(\"height\");\n this.mode = this.getAttribute(\"mode\");\n this.grid = this.getAttribute(\"grid\");\n this[\"class\"] = this.getAttribute(\"class\");\n\n return flagEditWidget;\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget or any\n// of its children needed re-rendering\nEditSCWidget.prototype.refresh = function(changedTiddlers) {\n var fonc = \"EditSCWidget.refresh\";\n SocialCalc.SetSpreadsheetControlObject(this.spreadsheet);\n\n // Resize calc sheet\n this.setSheetGeometry(this.nodeRoot);\n SocialCalc.DoOnResize(this.spreadsheet);\n if (this.spreadsheet.currentTab && this.spreadsheet.tabs[this.spreadsheet.currentTab].name == \"graph\")\n Graph.DoGraph(false, false);\n\n var changedAttributes = this.computeAttributes();\n if (changedAttributes.tiddler ||\n changedAttributes.width ||\n changedAttributes.height ||\n changedAttributes.mode ||\n changedAttributes.grid ||\n changedAttributes[\"class\"]) {\n this.refreshSelf();\n return true;\n } else if (changedTiddlers[this.tiddler]) {\n // Remove tiddler from sheet cache to force a reload and a recalc in other pages.\n TiddlyWiki.removeTiddlerFromSheetCache(this.tiddler);\n this.refreshSelf();\n return true;\n } else if (this.spreadsheet.editor.context.sheetobj.attribs.recalc != \"off\") {\n // Recalc to update cells with references to external sheets, if any\n this.spreadsheet.editor.EditorScheduleSheetCommands(\"recalc\");\n return true;\n } else {\n return false;\t\t\n }\n};\n\n// Geometry preparation for sheet display\nEditSCWidget.prototype.setSheetGeometry = function(nodeRoot) {\n var calcWidth = nodeRoot.offsetWidth; // maximal width\n if (this.width && (this.width <= calcWidth))\n calcWidth = this.width;\n var calcHeight = CONST_MIN_HEIGHT;\n if (this.height)\n calcHeight = this.height;\n\n TiddlyWiki.modifyViewport(calcWidth, calcHeight);\n}\n\n// Load sheet\nEditSCWidget.prototype.loadData = function(tiddler) {\n var fonc = \"EditSCWidget.loadData\";\n if (!tiddler) return;\n\n var calcData = tiddler.fields.text;\n var parts = this.spreadsheet.DecodeSpreadsheetSave(calcData);\n if (parts) {\n if (parts.sheet) {\n this.spreadsheet.sheet.ResetSheet();\n this.spreadsheet.sheet.ParseSheetSave(calcData.substring(parts.sheet.start, parts.sheet.end));\n }\n if (parts.edit) {\n this.spreadsheet.editor.LoadEditorSettings(calcData.substring(parts.edit.start, parts.edit.end));\n }\n }\n if (this.spreadsheet.editor.context.sheetobj.attribs.recalc == \"off\")\n this.spreadsheet.editor.ScheduleRender();\n else {\n this.spreadsheet.editor.EditorScheduleSheetCommands(\"recalc\");\n }\n}\n\nexports[\"edit-socialcalc\"] = EditSCWidget;\n\n})();\n",
"title": "$:/plugins/rboue/SocialCalc/edit-socialcalc.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/config/EditorTypeMappings/application/x-socialcalc": {
"title": "$:/config/EditorTypeMappings/application/x-socialcalc",
"text": "socialcalc"
},
"$:/plugins/rboue/SocialCalc/icon": {
"created": "20150122113649353",
"modified": "20150122113650949",
"title": "$:/plugins/rboue/SocialCalc/icon",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI\nWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wMRCAYZvJsQjgAAABl0RVh0Q29tbWVudABDcmVhdGVk\nIHdpdGggR0lNUFeBDhcAABHaSURBVHja7Z15VJNX3se/N7IoWElQgwiEVUBZBJdSSweFEZdaWjew\nIrZqO9O302l9562n9cx5zxydMzOnp6eli+2r09KilipuoxVKlUarUOqGBRcUiBKIiQjGLEAggZD7\n/kHTwRGyB7I837845Fnuc3+f53eX53d/l1BK4UqilOLBgwdob2+HQqGAQqGAUqmEWq2GUDMxPFWe\n22To/CrOvohw7wfCsWPHgs1mw8/PD2w2GwEBAfD39wchxKXqizg7ACqVCiKRCCKRCGKxGMHtm+36\nQGLuRyQ4OBihoaEICQmBr68vA8BISqfTQSQSQSAQoPJ2j9E32t4Sct4jUVFRiIqKAo/HA4vFYgCw\nh1tvampCXV0dvOtyHbrAvfH7SVxcHMLDw52iuXBoANra2nDp0iV4XnveKdupvoRiMnfuXAQEBDAA\nmOVWhUKcO3cOE1t+7xI9VFnY52TevHkICwtjADDk5uvr61FRUYEw2ZuuNTT5RS0T80laWhpiYmIc\npnlwCAAaGxvxww8/uKzhhwIhPT0d06ZNc28A7ty5gxMnToAn/ZNbGP6R55/8IVmyZAmCg4PdC4De\n3l6cOnUKrNpstzT8I5p1hGRkZMDT09P1ARAIBGg6nMwYfghF5VwhkZGRrgmAWq1GSUkJJtzayBjf\ngLpjvyLLli2Dl5fXiNxvRKat2trasL3wdD5jfOPyqV9P//blifD79++7hgeoqalB+4nfMIa3QAFL\nfyRJSUnOCQClFHw+H7rqFYzxrZBnynGSnp5ut3kDuzQBWq0WBw4cYIxvA/VdeJYePHgQWq3WOQDQ\naDQoKioCR/gyY3wbid30Ev3666+h0WgcG4DOzk78vfBkeGDrHxnj21hT7r5G/154Mryzs9MxAVAq\nlTh6dOfPo/193pWVKs9t+kdRZX5HR4djdQK7urpQtWMK89aPJAyv3yPjx48ffQ+gVqvxbtHpcMYk\nI6t3i06Hq9Xq0fUAWq0WRUVFYNr80dG9qZ+SdevWwcPDY+Q9gE6nw6FDhxjjj3LH8PDhw7DmJbbY\nA5SXl4NeXskY3wHkmXKcZGRkjJwHqKmpYYzvQOq78Cytr68fGQDa29uZuX0HVMvROdSSOQKzAOjr\n68MHR6rzmep2TB04cAD9/f326wOUlZVhzJUc5u13YLHmHCWZmZm29wDNzc2M8Z1AuuoV9M6dO7YF\noLe3Fw374xnjO4l2fXslT6fT2a4J4PP56L+0nAFgBNXs/z6ZPn06OBwOfHx80N/fD5VKBbFYDK/r\na43awi+dT5544gnrAWhvb0fNFxEuZ3wx9yPC5XIxbtw4AAMBLDKZDOyml0b1WaW8f5KFCxciICBg\n2HJQSnH16lVyryzVYFlTXhUTNpttHQB79+5FgOQPLgFA57TdJD4+HhEREdRQ0KVUKs2pr68/pKpc\nMqLPHZR1nsTHm97UarVafPPNN2R844tDnqOM/JLk5ORYDsDt27dx6+BMpzd+R1QhycjIeHvixInv\nmNWh0ulQU1NDpOXz7V4HcevrSXBwsNn3+SX0jgwXfRWz9joxtCaRZejCe76vc/qvfNwllSQ7O5ua\na3wAYLFYmD17Nn3qjTa0Bn5it8V8kdm1FhkfAAghWLhwIe2K3jNk+U6dOmWZB6irq4P4eIpTv/0z\nN94iU6bYJk6BUopTp04RW3eGe6YXkeXLl9O+vj6cPHmSnD17Fh0dHQgMDMTSpUuRkmKaDdRqNc5+\nMGnI32Jz60hoaKh5AOzatQvh8i1OC0DyS03+XC5XZuvrlpaWElvmK0h5VUxqa2vxyiuvoLGx8ZHr\nLly4kBQUFCA0NNToPX/88UcyVL9FyvsnWbdunekA3Lp1C7cPJTmt8X9ZYmWX8ut0OhQVFRFbdIxl\nYZ8THx8frF69mhqK+p00aVLOhQsXDkVEGB6N9fT0oOLDyUP+NiPvJgkJCTGtD3D+/Hnn9fuzjjxk\n/I6ODpSXl5Pdu3eTvXv3kjNnzhBrImlYLBZWrVplE7i4XC42bNhw21jIt1QqPfjCCy8Y/e4/btw4\nSAI+HrIvUFVVZVonUCaTYfKd/3Lat3/+/IEee01NDVmxYgXhcrlYvHgx3bhxI33xxRdpeno65XK5\n2LRpExEKhRZ17Hx9feHz1HdWdwq1F5+jCoUiwpRjq6qqKJ/PN3rPwMDAIf/PEb5M5XK5cQCqq6ud\n9uUf++S3xNvbG9u3bydz5syhx44do0PF0nd2dqKwsJBOnz6d7tmzxyJDmto5M6StB6eZde+ysjKj\nxzz22GPD/nb58mXDAPT39zt1oMfcuXOxZcsWsm3bNmrKXLhGo8HGjRvpzp07zYbAy8sLZPa/rPIC\nYrE425zjm5ubjR5jKD6w/9LyR+rlIQAEAoHTvv13p+wgx44dQ35+vlkAU0qxefNmev78ebONGRsb\na1WZvb29D5lzvI+Pj9FjjAWF3Lp1a3gA6urqnBYAHo+HLVu2WHRuX18fXn/9dbODKy2dvNHL3BxB\niYmJxkcWMsMj3xs3bgwNgFarxXBzys4g7cXnaGtrq8Xlr66uNtsLsFgstAfvtLgZ2Lroksnl9fLy\nwpo1awzXgVZr9GPWuJt5dHDU0K8ACIVCOLM+PZdhda+8pKTE7HOMfW0zprS0NJPK/dZbb5GwsDBq\nxL2bdK3BfQmWK7T/ANDQ0GD1NSxpAr29va2655tvvomEhASDhsvJySHbtm2jxiaoLl48/rMp9xxs\n618B4PQc6XJmAGQyWba115BKpSNebu+6XFpWVobt27eT4ODgh0CYOXMmKSwsJMXFxXTMmDEGr3Pp\n0iUSIPlrsin3PCvU5T8EgFKpREfjAafOe+7n53fI2mtwOByzz+np6bG67J+V/hy+detW2tLSQhsb\nG0l1dTWRSCSktraWbtiwgRrLDiIUConi9G9N7k8sUOT8Sb/CmAUMJGx0dg03A2aOwsPDLfE8Vt83\nVZ7b9LcvT0R0dHQ0TZs2jc6ePZtOnTrVJINeuXKFNBYnmN35FYvFrgXA/z5dY/UIJisry6zjKaWY\neu91m4ycUuW5TRd2BkfU1taaFKepUqnw7bffGg0LG04ikejfANy9e9fpAajgFK83NA1qTJGRkSQ9\nPd2symxtbbV5kEjbd0/RP+/67oPKykoilUpzBg/Zent70dTUREpLS8mPHwfA4+oai+FrbW0FABCd\nTofydx5zmaDPJX9WWXTewYMHSXa2ealry8vLiTNPnS/a2klYQ30hclbR5MNk6dKlZr+Vr732mtnG\nV6lUTr9AVqlUgjUaQx97idSsprt378amTZtMgoDFYuGdd94hO3bsMNuQFRUVTr99mFQqhUt5AGAg\n8KGgoADFxcUkLCxsWCMlJSURPp9P3n77bWpuEkaZTPaZK2Q6l8vl8FAoFC4FgE/9elpd/QNZs2YN\nzc7Oxrlz50hFRQXu3r0LFosFHo+HzMxMJCYmWmRAjUaD0tKCuQEuUFcKhQIeSqUSfnAtyfjpVDK1\ngQQFBdHU1FSamppqmz4GpSgpKSEBkr+6RKdZqVSC1d3dDVfU9b0xtL6+3mbttEajwb59+8hjgg0u\nM2JSqVRgCdST8uCiajk6h/70009W50JUKBRNe/bsIZNEr7jUGsmenh6QE//wdflVv21Bf6mZM+eZ\nWdOnTzerw9fV1YUzZ84QZ9230KSRkzsAoJeY+xFJTk5GdHQ0HS7LJqUUYrGYXL9+3S32NHIrAAZr\nQvQa1e2e9PH67/mUUiiVSrfbwcxtAWA0IBZTBQwAjBgAGDEAMHJPAKo4+yKYanBPCTnvEVbEWJmQ\nqQr3lI+PD1imrDdj5MIAWLuyhZHzis1mMwAwADAAuDcAkydPZmrCTcXlchkP4M6aMGECWIQQiLkf\nEaY63Et3p+wgwC8zgcHBwUyNuJn0NmcBA+lVGLmX9EkjGQ/AADCQW66CU7yeqRb3kJDzHvH19f03\nAAAwP8KriKka91BUVNSvf3sM/qfgMlM55qot6P+Iv78//Pz84OHhAS8vL3h7e4PFGni3ent7odVq\nodFooNFoIJPJIJfLRzX2cEgAeDweBIw9DUoZ+SUJDQ0Fj8cDl8vV5+2x0JC/Q3d3N8RiMWlpaUFL\nSwtC7v/3iEAxOGv4Q4smjh07hnE385gg0UHSJR0iCQkJVieFNEUajQY3b94k165dA1f8ql3up4nb\nR5599tmhARAIBGg6nOz2AFRwitfnzY8siomJoXpXPtLq6urCuXPnht0LyGL3P7CXwtAA9Pf3g/+u\nn1sDELjsJ5KQkGD2knF7qbOzE2fOnCGm7BVoijLf7iCDoX4I7zFjxsDj8W/cclr43tRPyW82tyMx\nMdFhjK8fomdlZdHQFdVWF8rriRLynx7tEf+WnJzsdsaXhX1O8vLyqCNHR8XGxtL4FxqsgiApKemR\n/z0CgL+/P+ThBW7jBSZEr1GtXr3aaCZOR1BQUBANee6iRbZRRHxBhkqEOWQPx5Q9Z11FPlFvjPf0\n9HSa8s6YMYO2TMw3G4Inn3xyyP8PCUBYWBiEnPfcwgtER0dTJyyzWceLJn0w5I5hwwIAAOnp6W7h\nAcaOHet0ZdZveG2qDNlyWABiYmLcIlBEKpXOcbYy379/3+RjWwM/IYOnfk0GAAAWLFjg8h7g8lBb\naTmwenp6YE7Gkvnz5xv83SAAkZGRLj8iIDWrqUgkcopnpJSirKzM5LJ2x35FjGVANzrPuXjxYpf3\nAje/nkElEglxdOOfPHmSmLOv06JFi4weYxQADoeDMXOPuXxf4PreGFpbW+uQz9nT04P9+/cTUrPa\nZOP7pfN/DfqwCgB9L9IdIobavnuK/mXX8YgbN244BAgajQZ8Pp9UfDgZE1t+b7Lx70z+kKSkpJjW\nBJqaQ6+5uRkN++Pd5kPR/ZBdZNasWYiOjqaGduO0h+RyOf/atWuZPVVPW1Tfw+0UbhUAAMDn89F/\nabnbfS1Uz/iaxMTEgMfj2eV7AaUU7e3tRCgUoq6uDsHtmy2u43GpZSQtLc30TrA5APT396OgoABh\nsjfd9pNxBad4/bxgFHG5XLDZbLDZbA6bzZZ5eXmZZOiuri4oFAqiUCggl8shkUjg3/w7m9Rne/BO\nkpeXB3O+ZpqdRrW9vR01X0QwUUMGAInwbCvy8vICpRRqtRqhD/5nROrryT+2EnO3zbEoj25DQwOa\n/zWbgcCBFJtbR0JDQ80+z6J4p5iYGKu3TmdkO3mmHLfI+BYDAACZmZnQxO1jIBjtoWLcPmLNhzuL\nASCEICsrC4qILxgIRknKyC9JVlYWrAlhsyrklRCCVatW/brUmNHI6e6UHWTlypWwNn7R6phnDw8P\n5Obmuk0AiSOo2f99kpubC1tMUNkk6N3b2xtr165FW9Bfahjz2Fdn2Ac/WLt2rdXb1ls1DBxOarUa\n+/fvt9l+uoweVmvgJ+T555+3aRSTTQEABmYLjxw5Ar/bmxgIbKiOqEKycuVK2Dp62eYAAANTnqWl\npbDVahZ3V19CMVm2bBnssWDFLgDoITh9+jS0F59jILBCXk+UkAULFsBeq5XsBoBeLS0tqN8Xx0Bg\ngeJfaCBBQUF2vYfdAQCA7u5uHD16FK6275699CD0M7J8+XKMxFK1EQFA3yRcvHgRitO/ZSAwIHbG\nKfL4449jpBaojhgAeonFYpSWliJcvoUBYZCa/d8nzzzzDOzt8kcdAL03uHr1Ku6VpTIQAJjydBVJ\nTEzEaCxLHxUA9Orq6sL3338Pn/r1bglCd+xXZNGiRTAletclAdBLIBDg7NmzI5YkabTVMjGfZGRk\nwNCSLbcCQC+hUIjKykoESP5AXdXwaWlpAwE1DpKFxKEA0EsikaCyshIc4csuAYIs7HMyb948hIWF\nOVzZHBIAvTo7O3H16lV0VSx2ShDGp50kM2fOxHA7lTMAmDFqaGpqQl1dHbzrch26wL3x+0lcXBzC\nw8PhSMmmnBqAwdLpdBCJRBAIBKi83ROeKs9tGtV+C+c9EhUVhaioKPB4PIxWXkG3AeA/pVKpIBKJ\nIBKJIJFIENT2hl0fSBLwMQkKCkJoaChCQkJGdQjHADCMOjo6IJVKoVQqoVAooFAo0N3dDZVKZXSR\nRsvEfOLr6wsfHx/9yh+w2WxMmjQJ5i66cAb9P0ino5gBTAIlAAAAAElFTkSuQmCC\n"
},
"$:/plugins/rboue/SocialCalc/license": {
"title": "$:/plugins/rboue/SocialCalc/license",
"text": "!Plugin license\nCopyright (C) 2015 René Boué (rboue) <rboue01 (at) gmail (dot) com><br>\nAll rights reserved.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n\n!Modification of the ~SocialCalc code\nSee [[CHANGES.txt|$:/plugins/rboue/SocialCalc/CHANGES.txt]] tiddler.\n\n!Traduction française\nMartin Gubri pour [[Framasoft|http://www.framasoft.org/]].\n\n<<<\nJuste pour préciser : j'avais traduit une bonne partie d'Ethercalc, mais\nje m'étais en partie servi de la traduction partielle qu'avait fait le\n[[CRDP de Versailles|http://www.crdp.ac-versailles.fr/]].\n<<<\n\nA voir : [[Framacalc|http://www.framacalc.org]].\n\n!~SocialCalc license\n(c) Copyright 2009 Socialtext, Inc.<br>\nAll Rights Reserved.<br>\n\nOriginal components licensed under different licenses. Some are licensed under the Common Public Attribution License (CPAL) and others under the Artistic License 2.0. Check the contents of each file for a statement of the license for that file. Files without license information (e.g., image files) are licensed under the Artistic License 2.0.<br>\nSee [[LEGAL.txt|$:/plugins/rboue/SocialCalc/LEGAL.txt]] and [[LICENSE.txt|$:/plugins/rboue/SocialCalc/LICENSE.txt]] for details.<br>\n\nThe ~JavaScript ~SocialCalc code was initially coded by Dan Bricklin of Software Garden, Inc., for ~Socialtext, Inc.<br>\nBased in part on the ~SocialCalc 1.1.0 code written in Perl.<br>\nThe ~SocialCalc 1.1.0 code was:<br>\n\n Portions (c) Copyright 2005, 2006, 2007 Software Garden, Inc.\n All Rights Reserved.\n Portions (c) Copyright 2007 Socialtext, Inc.\n All Rights Reserved.<br>\n\nThe Perl ~SocialCalc started as modifications to the wikiCalc(R) program, version 1.0.<br>\nwikiCalc 1.0 was written by Software Garden, Inc.<br>\n\nwikiCalc, Garden, and Software Garden are registered trademarks of Software Garden, Inc.<br>\nSocialtext, ~SocialCalc, and the Socialtext logo and Dreamcatcher are trademarks of Socialtext, Inc.<br>\nDan Bricklin's is a registered trademark of Daniel Bricklin."
},
"$:/plugins/rboue/SocialCalc/parser.js": {
"text": "/*\\\ntitle: $:/plugins/rboue/SocialCalc/parser.js\ntype: application/javascript\nmodule-type: parser\n\nThe SocialCalc parser parses SocialCalc's save format into single text node (like \"text/plain\" parser)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar SocialCalcParser = function(type,text,options) {\n this.tree = [{\n type: \"codeblock\",\n attributes: {\n code: {type: \"string\", value: text},\n language: {type: \"string\", value: type}\n }\n }];\n};\n\nexports[\"application/x-socialcalc\"] = SocialCalcParser;\n\n})();\n\n",
"title": "$:/plugins/rboue/SocialCalc/parser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/plugins/rboue/SocialCalc/readme": {
"title": "$:/plugins/rboue/SocialCalc/readme",
"text": "~SocialCalc for ~TiddlyWiki."
},
"$:/plugins/rboue/SocialCalc/tiddlywiki.js": {
"text": "/*\\\ntitle: $:/plugins/rboue/SocialCalc/tiddlywiki.js\ntype: application/javascript\nmodule-type: library\n\n Adaptation of SocialCalc to TiddlyWiki.\n\n\\*/\n(function() {\n\n // TiddlyWiki environnement for a SocialCalc sheet\n // Manage all interactions and interfaces with TiddlyWiki system.\n //\n var TiddlyWiki = function(widget, tiddlerTitle, widgetConfiguration) {\n this.widget = widget; // widget\n this.tiddlerTitle = tiddlerTitle; // title of the sheet data tiddler\n this.widgetConfiguration = widgetConfiguration; // widget's configuration object\n this.flagView = (this.widgetConfiguration.mode && this.widgetConfiguration.mode == \"view\") ? true : false; // display mode\n\n // Management of notification that sheet needs saving (You ! Your sheet has been modified.\n // Remember to save it !)\n // Notification consists of changing background color of the toobar save button.\n this.saveTodo = {\n flagStart: false, // start monitoring anything related to saving of data\n button: {\n image: TiddlyWiki.pathImages+\"/sc-save.gif\", // image tiddler\n idSuffix: \"button_save\", // suffix of id attribute (prefix is stylesheet.idPrefix)\n index: null, // index of saveButton in SocialCalc.ButtonInfo.registeredElements (read at start)\n normalBackgroundColor: null, // initial background color (read at start)\n needSavingBackgroundColor: \"#0000ff\", // new background when need saving\n style: null, // initial style (read at start)\n needSavingStyle: null // style used when need saving\n }\n }\n\n // Enable/block key events propagation (keyboard share between input box and grid)\n // Allow to forbid tiddler scrolling by the browser when we just want to move current\n // cell in the grid with up and down keys.\n this.inputboxHasKeyboard = false;\n // Callback to monitor commands : function(cmd) {}\n this.monitorCallback = null;\n };\n\n // Static members\n\n // Overall parameters\n TiddlyWiki.pluginPath = \"$:/plugins/rboue/SocialCalc\";\n TiddlyWiki.configTiddler = \"$:/config/rboue/SocialCalc\";\n TiddlyWiki.configDefaultTiddler = TiddlyWiki.pluginPath + \"/config.json\";\n TiddlyWiki.pathImages = TiddlyWiki.pluginPath + \"/Lib/Images\";\n TiddlyWiki.curentLanguageTiddler = \"$:/language\";\n TiddlyWiki.defaultLanguage = \"en-GB\";\n TiddlyWiki.pathLanguages = TiddlyWiki.pluginPath + \"/Languages\";\n TiddlyWiki.saveNotificationTiddlerSuffix = \"--save-notification\";\n TiddlyWiki.saveCommandKeyword = \"tiddlywiki-save\"; // keyword of save command\n TiddlyWiki.exportCommandKeyword = \"tiddlywiki-export\"; // keyword of export command\n TiddlyWiki.importCommandKeyword = \"tiddlywiki-import\"; // keyword of import command\n TiddlyWiki.sheetTiddlerType = \"application/x-socialcalc\"; // type of tiddler with sheet data\n TiddlyWiki.dataTiddlerType = \"text/plain\"; // type of tiddler with import/export data\n\n // Initialized at TiddlyWiki session opening\n TiddlyWiki.sessionConfiguration = null; // Session configuration\n TiddlyWiki.currentLanguage = null; // current language\n\n // Static initialisations\n TiddlyWiki.init = function(sc, sessionConfiguration) {\n TiddlyWiki.sessionConfiguration = sessionConfiguration;\n\n // Normalization of sheet names.\n // Sheet name are tiddler title and therefore could have Uppercase/lowercase characters.\n sc.Callbacks.NormalizeSheetName = function(sheetName) {return sheetName;};\n\n // Add class attribute to DOM nodes pertaining to sheet visual\n sc.ConstantsSetClasses(\"SocialCalc-\");\n\n // Background images redefinition\n sc.Constants.defaultCommentStyle = TiddlyWiki.getModifiedCssImageStyle(sc.Constants.defaultCommentStyle);\n sc.Constants.defaultReadonlyStyle = TiddlyWiki.getModifiedCssImageStyle(sc.Constants.defaultReadonlyStyle);\n sc.Constants.defaultUnhideLeftStyle = TiddlyWiki.getModifiedCssImageStyle(sc.Constants.defaultUnhideLeftStyle);\n sc.Constants.defaultUnhideRightStyle = TiddlyWiki.getModifiedCssImageStyle(sc.Constants.defaultUnhideRightStyle);\n sc.Constants.defaultUnhideTopStyle = TiddlyWiki.getModifiedCssImageStyle(sc.Constants.defaultUnhideTopStyle);\n sc.Constants.defaultUnhideBottomStyle = TiddlyWiki.getModifiedCssImageStyle(sc.Constants.defaultUnhideBottomStyle);\n\n // Management of indirect calc data (data referenced in other sheet).\n // With TiddlyWiki, other sheets are tiddlers with SocialCalc data.\n sc.RecalcInfo.LoadSheet = function(pageName) {\n var spreadsheet = sc.GetSpreadsheetControlObject();\n if (spreadsheet && spreadsheet.tiddlyWiki)\n return spreadsheet.tiddlyWiki.getCalcPage(pageName);\n return false;\n };\n\n // Localization with current langage.\n TiddlyWiki.localize(sc);\n };\n\n // Localization with current langage.\n TiddlyWiki.localize = function(sc) {\n var fonc = \"TiddlyWiki.localize\";\n\n // Get configuration\n var configLang = (TiddlyWiki.sessionConfiguration ? TiddlyWiki.sessionConfiguration.LANG : null);\n\n // Replace all strings in SocialCalc.Constants with a translation of the current language\n // <lang> kept in $<colon>/plugins/SocialCalc/Languages/<lang> tiddler.\n // Current language read in $<colon>/language tiddler.\n // Default language is \"en-GB\". It is statically implemented and don't needs translation.\n\n // Current language\n var language = null;\n if (configLang) {\n language = configLang;\n } else {\n language = $tw.wiki.getTiddlerText(TiddlyWiki.curentLanguageTiddler);\n language = language.replace(/^\\$\\/:languages\\//, \"\");\n }\n TiddlyWiki.currentLanguage = language;\n \n if (language == TiddlyWiki.defaultLanguage) return;\n //console.log(fonc+\":language = \"+language);\n\n // Read translations\n var translations = $tw.wiki.getTiddlerData(TiddlyWiki.pathLanguages + \"/\" + language);\n if (!translations) return;\n for (var trans in translations) {\n //console.log(fonc+\": \"+trans + \" = \"+translations[trans]);\n if (typeof(sc.Constants[trans]) == \"undefined\") continue;\n sc.Constants[trans] = translations[trans];\n }\n };\n\n // Redefine viewport geometry (now a tiddler)\n TiddlyWiki.modifyViewport = function(width, height) {\n // Ugly hack...\n SocialCalc.GetViewportInfo = function () {\n return {\n width: width,\n height: height,\n horizontalScrol: null,\n verticalScroll: null\n };\n }\n };\n\n // Modify CSS style of image with tiddler raw image syntax\n TiddlyWiki.getModifiedCssImageStyle = function(style) {\n var pattern = \".*?url(.+).*\";\n var regexp = \".*?url[(][\\\"]?.*?images/\\(.+?\\)[\\\"]?[)].*$\";\n\n if (!style) return false;\n if (!style.match(pattern)) return false;\n // File image extraction\n var reg = new RegExp(regexp, \"\");\n var tab = reg.exec(style);\n if (! tab || tab.length < 2) return false;\n // Get tiddler\n var tiddlerName = TiddlyWiki.pathImages+\"/\"+tab[1];\n var src = TiddlyWiki.getRawTiddlerImage(tiddlerName);\n if (!src) return false;\n var newStyle = style.replace(/url[(].+?[)]/, \"url(\"+src+\")\");\n \n return(newStyle);\n };\n\n // Modify \"src\" attribute of <img> node with tiddler raw image data\n TiddlyWiki.getModifiedImgSrc = function(src) {\n var regexp = \".*images/\\(.+?\\)$\";\n\n if (!src) return false;\n // File image extraction\n var reg = new RegExp(regexp, \"\");\n var tab = reg.exec(src);\n if (! tab || tab.length < 2) return false;\n // Get tiddler\n var tiddlerName = TiddlyWiki.pathImages+\"/\"+tab[1];\n var newSrc = TiddlyWiki.getRawTiddlerImage(tiddlerName);\n if (!newSrc) return false;\n\n return newSrc;\n };\n\n // Get CSS raw source of a tiddler image\n TiddlyWiki.getRawTiddlerImage = function(tiddlerName) {\n if (!$tw || !$tw.wiki) return false;\n // Check if it is an image tiddler\n if (!$tw.wiki.isImageTiddler(tiddlerName)) return false;\n var tiddler = $tw.wiki.getTiddler(tiddlerName);\n if ((typeof(tiddler) == \"undefined\") || !tiddler) return false;\n var text = tiddler.fields.text;\n if (!text) return false;\n var type = tiddler.fields.type;\n // Render the appropriate element for the image type\n var src = \"\";\n switch(type) {\n case \"image/svg+xml\":\n src = \"data:image/svg+xml,\" + encodeURIComponent(text);\n break;\n default:\n src = \"data:\" + type + \";base64,\" + text;\n break;\n }\n\n return src;\n }; \n\n // Execute extension command\n TiddlyWiki.executeExtensionCmd = function(spreadsheet, com) {\n spreadsheet.editor.EditorScheduleSheetCommands(\"startcmdextension \"+com);\n };\n\n // Remove tiddler from sheet cache\n TiddlyWiki.removeTiddlerFromSheetCache = function(tiddlerTitle) {\n var fonc = \"TiddlyWiki.removeTiddlerFromSheetCache\";\n var sfsc = SocialCalc.Formula.SheetCache;\n if (sfsc.tiddlersToSheets[tiddlerTitle])\n sfsc.tiddlersToSheets[tiddlerTitle] = undefined;\n for (var sheetname in sfsc.sheets) {\n if (sfsc.sheets[sheetname].tiddlerTitle == tiddlerTitle) {\n delete sfsc.sheets[sheetname];\n sfsc.sheets[sheetname] = undefined;\n }\n }\n hack.log(\"Tiddler removed from cache: \"+tiddlerTitle, hack.recalcLink, fonc);\n };\n\n // Navigate to a tiddler.\n // Called by cell's link (cf. SocialCalc.expand_text_link()).\n TiddlyWiki.navigateToTiddler = function(tiddlerTitle) {\n var fonc = \"TiddlyWiki.navigateToTiddler\";\n var spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n\n // Send a \"tm-navigate\" event from widget to tiddler\n var bounds = spreadsheet.tiddlyWiki.widget.domNodes[0].getBoundingClientRect();\n spreadsheet.tiddlyWiki.widget.dispatchEvent({\n type: \"tm-navigate\",\n navigateTo: tiddlerTitle,\n navigateFromTitle: spreadsheet.tiddlyWiki.tiddlerTitle,\n navigateFromNode: spreadsheet.tiddlyWiki.widget,\n navigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height},\n navigateSuppressNavigation: false\n });\n };\n\n // Instance members\n\n TiddlyWiki.prototype = {\n\n // Resolve file path.\n //\n // Following behaviour apply only if SocialCalc's configuration's object property \"filesystem\"\n // is defined. If not, file is assumed to be a tiddler's title.\n //\n // File path resolution is inspired by Unix.\n // We make assumption that tiddler title follows classical Unix Path pattern\n // like : /dir1/dir2/ ... /dir/file. If not the case, file should be\n // in the directories of the PATH (see below), or completely out of path convention.\n // There is no notion of curent directory (if any).\n //\n // Unlike Unix, there is no notion of root directory or \"/\". TiddlyWiki has no\n // real filesystem so we can't rely on a root node. Relative versus absolute\n // path is deduced from the following. If the first caracter of a file\n // path is \"/\", and there is no more \"/\" after that, then the path is absolute.\n // In that case, the behavior is identical to Unix. A file path beginning with a \"/\"\n // will be directly converted in a tiddler title.\n // By default (and unlike Unix), malformed path like multiple \"/\" instead of one\n // are not accepted. For example \"//\" is not reduced to \"/\" and treated like a\n // path separator. It is the responsibility of the user to be clear about the significance of\n // it's file reference, path-like name or tiddler title.\n // With optionnal <flagNormalize> parameter set, malformed path are normalized like\n // Unix does.\n //\n // A file is searched under a collection of path directories, pre-defined in the PATH\n // variable. Those directories are absolute.\n // Syntax of the PATH variable :\n // <path1>';'<path2>';' ... ';'<pathN>\n // The PATH is defined in the widget's configuration object, under filesystem.PATH property.\n // The widget's configuration object is searched first in $:/config/SocialCalc tiddler of\n // \"application/json\" type, then in $:/plugins/SocialCalc/config-defaults tiddler.\n //\n // Search algorithm :\n // <file> : input file path.\n // PATH <- value of a \"path\"\n // if <PATH> exists then\n // for all <dir> in <PATH>\n // if tiddler <dir>/<file> found then return <dir>/<file>\n // end for\n // end if\n // if tiddler <file> found then return file\n //\n resolvePath: function(file, flagNormalize) {\n var fonc = \"TiddlyWiki.resolvePath\";\n\n hack.log(\"==<<== file = \"+file, hack.filesystem, fonc);\n\n if (!file) return null;\n var tiddlerTitle = \"\";\n var tiddler = false;\n if (!this.widgetConfiguration || !this.widgetConfiguration.filesystem) {\n hack.log(\"no filesystem in widget's configuration !\", hack.filesystem, fonc);\n return(file);\n }\n\n // Get PATH\n var tabPath = null;\n if (this.widgetConfiguration.filesystem.PATH && this.widgetConfiguration.filesystem.PATH != \"\")\n tabPath = this.widgetConfiguration.filesystem.PATH.split(/[\\s]*;[\\s]*/);\n hack.log(\"tabPath = \"+(tabPath ? tabPath.join(\" | \"): tabPath), hack.filesystem, fonc);\n\n var flagFind = false;\n \n if (!flagFind && tabPath) {\n // Search under PATH directories\n for (var i = 0; i < tabPath.length; i++) {\n var file1 = tabPath[i] + \"/\" + file;\n if (flagNormalize) {\n // File normalization\n file1 = file.replace(/[\\/][\\/]+/g, \"/\").replace(/\\/\\.\\//g, \"/\");\n }\n tiddlerTitle = file1;\n var tiddler2 = $tw.wiki.getTiddler(tiddlerTitle);\n if ((typeof(tiddler2) != \"undefined\") && tiddler2) {\n flagFind = true;\n break;\n }\n }\n }\n \n // Maybe a tiddler already\n if (!flagFind) {\n if (flagNormalize) {\n // File normalization\n file = file.replace(/[\\/][\\/]+/g, \"/\").replace(/\\/\\.\\//g, \"/\");\n }\n tiddlerTitle = file;\n }\n\n hack.log(\"==>>== tiddler = \"+tiddlerTitle, hack.filesystem, fonc);\n return tiddlerTitle;\n },\n\n // Get a tiddler calc page referenced in a page\n //\n // Status :\n // True if page found and loaded, false otherwise.\n //\n // A page reference appears in formulae to access data on other pages.\n // Exemple :\n // =\"My root calc data page\"!C3 aims to access C3 cell in a page named\n // \"My root calc data page\".\n // If widget's configuration object property \"filesystem\" is defined this page name is\n // a file path. Otherwise this is a tiddler's title.\n //\n getCalcPage: function(pageName) {\n var fonc = \"TiddlyWiki.getCalcPage\";\n\n hack.log(\"==<<== pageName = \"+pageName, hack.link, fonc);\n\n var spreadsheet = SocialCalc.GetSpreadsheetControlObject();\n var tiddlerTitle = this.resolvePath(pageName);\n hack.log(\"tiddlerTitle = \"+tiddlerTitle, hack.link, fonc);\n\n // Is the tiddler already referenced in cache ?\n if (SocialCalc.Formula.SheetCache.tiddlersToSheets[tiddlerTitle]) {\n // We just add the page to the cache\n SocialCalc.Formula.AddSheetToCache(pageName, null, null, tiddlerTitle);\n // Fake call to continue recalc\n SocialCalc.RecalcLoadedSheet(pageName, null, false, null, tiddlerTitle);\n hack.log(\"Sheet already in cache, tiddler not loaded: \"+tiddlerTitle, hack.recalcLink, fonc);\n } else {\n // We read the tiddler\n var tiddler = $tw.wiki.getTiddler(tiddlerTitle);\n if ((typeof(tiddler) == \"undefined\") || !tiddler) return false;\n hack.log(\"checked tiddler\", hack.link, fonc);\n var calcData = tiddler.fields.text;\n if (!calcData) return false;\n hack.log(\"checked calcData\", hack.link, fonc);\n var parts = spreadsheet.DecodeSpreadsheetSave(calcData);\n if (!parts) return false;\n hack.log(\"checked parts\", hack.link, fonc);\n var page = calcData.substring(parts.sheet.start, parts.sheet.end);\n \n // Tell Socialcalc to load this sheet page and recalc\n SocialCalc.RecalcLoadedSheet(pageName, page, true, null, tiddlerTitle);\n hack.log(\"Tiddler loaded: \"+tiddlerTitle, hack.recalcLink, fonc);\n }\n return true;\n },\n\n // Add UI for extension commands.\n addExtensionCmdUI: function(spreadsheet) {\n // Save command button\n // First button on the left in the toobar.\n var scc = SocialCalc.Constants;\n var SCLoc = SocialCalc.LocalizeString;\n \n var divToolbar = null;\n var tabDiv = spreadsheet.spreadsheetDiv.getElementsByTagName(\"div\");\n if (!tabDiv || tabDiv.length == 0) return;\n for (var i = 0; i < tabDiv.length; i++) {\n if (tabDiv[i].getAttribute(\"id\") == spreadsheet.idPrefix+\"edittools\") {\n divToolbar = tabDiv[i];\n break;\n }\n }\n if (!divToolbar) return;\n var saveButton = document.createElement(\"img\");\n if (!saveButton) return;\n saveButton.id = spreadsheet.idPrefix + this.saveTodo.button.id;\n saveButton.style = \"vertical-align: bottom; border: 1px solid rgb(64, 64, 64); background-color: rgb(64, 64, 64); margin-right: 8px;\";\n saveButton.src = TiddlyWiki.getRawTiddlerImage(this.saveTodo.button.image);\n divToolbar.insertBefore(saveButton, divToolbar.getElementsByTagName(\"img\")[0]);\n var saveButtonStyle = {\n name: \"saveButton\",\n normalstyle: \"border:1px solid \"+scc.ISCButtonBorderNormal+\";background-color:\"+scc.ISCButtonBorderNormal+\";\",\n hoverstyle: \"border:1px solid \"+scc.ISCButtonBorderHover+\";background-color:\"+scc.ISCButtonBorderNormal+\";\",\n downstyle: \"border:1px solid \"+scc.ISCButtonBorderDown+\";background-color:\"+scc.ISCButtonDownBackground+\";\"\n };\n var saveButtonNeedSavingStyle = {\n name: \"saveButton\",\n normalstyle: \"border:1px solid \"+scc.ISCButtonBorderNormal+\";background-color:\"+this.saveTodo.button.needSavingBackgroundColor+\";\",\n hoverstyle: \"border:1px solid \"+scc.ISCButtonBorderHover+\";background-color:\"+this.saveTodo.button.needSavingBackgroundColor+\";\",\n downstyle: \"border:1px solid \"+scc.ISCButtonBorderDown+\";background-color:\"+this.saveTodo.button.needSavingBackgroundColor+\";\"\n };\n SocialCalc.TooltipRegister(saveButton, SCLoc(\"Save changes\"), {}, spreadsheet.spreadsheetDiv);\n var self = this;\n SocialCalc.ButtonRegister(spreadsheet.editor, saveButton, saveButtonStyle, {\n MouseDown: function() {\n TiddlyWiki.executeExtensionCmd(spreadsheet, TiddlyWiki.saveCommandKeyword);\n },\n Disabled: function() {}\n });\n\n // Remember initial style data\n this.saveTodo.button.index = SocialCalc.ButtonInfo.registeredElements.length - 1;\n this.saveTodo.button.style = saveButtonStyle;\n this.saveTodo.button.normalBackgroundColor = saveButton.style.backgroundColor;\n\n // Remember need saving style\n this.saveTodo.button.needSavingStyle = saveButtonNeedSavingStyle;\n },\n\n // Change the save button visual\n changeSaveButtonVisual: function(flagNeedSavingStyle) {\n // Get registered button element\n if (!SocialCalc.ButtonInfo.registeredElements || this.saveTodo.button.index == null) return;\n var elem = SocialCalc.ButtonInfo.registeredElements[this.saveTodo.button.index];\n if (elem.name != \"saveButton\") return;\n // Change style\n if (flagNeedSavingStyle) {\n elem.element.style.backgroundColor = this.saveTodo.button.needSavingBackgroundColor;\n elem.normalstyle = this.saveTodo.button.needSavingStyle.normalstyle;\n elem.hoverstyle = this.saveTodo.button.needSavingStyle.hoverstyle;\n elem.downstyle = this.saveTodo.button.needSavingStyle.downstyle;\n } else {\n elem.element.style.backgroundColor = this.saveTodo.button.normalBackgroundColor;\n elem.normalstyle = this.saveTodo.button.style.normalstyle;\n elem.hoverstyle = this.saveTodo.button.style.hoverstyle;\n elem.downstyle = this.saveTodo.button.style.downstyle;\n this.saveTodo.flagStart = false;\n }\n },\n\n // Add UI for import/export (cf. Clipboard tab).\n addImportExportUI: function(spreadsheet) {\n // The UI skeleton is defined in HTML. See SocialCalc.SpreadsheetControl(), clipboard tab.\n \n if (!spreadsheet.importExport) spreadsheet.importExport = {};\n\n // Populate format selection\n var select = document.getElementById(spreadsheet.idPrefix+\"clipboard-export-select-format\");\n if (!select) return;\n var tabFormat = [\"Tab-delimited\", \"CSV\", \"SocialCalc-save\"];\n select.length = 0;\n for (i=0; i < tabFormat.length; i++) {\n var name = tabFormat[i];\n select.options[i] = new Option(name, name);\n }\n select.options[0].selected = true;\n\n // Click on Export button\n var buttonExport = document.getElementById(spreadsheet.idPrefix+\"clipboard-export\");\n if (!buttonExport) return;\n buttonExport.addEventListener(\"click\", function() {\n TiddlyWiki.executeExtensionCmd(spreadsheet, TiddlyWiki.exportCommandKeyword);\n }, false);\n\n // Click on Import button \n var buttonImport = document.getElementById(spreadsheet.idPrefix+\"clipboard-import\");\n if (!buttonImport) return;\n buttonImport.addEventListener(\"DOMNodeRemoved\", function() {\n TiddlyWiki.executeExtensionCmd(spreadsheet, TiddlyWiki.importCommandKeyword);\n }, false);\n },\n\n // Tab click management for import/export (cf. Clipboard tab).\n clickImportExportUI: function(spreadsheet) {\n // Refresh export selection\n var tabNames = [];\n var select = document.getElementById(spreadsheet.idPrefix+\"clipboard-export-select-source\");\n if (!select) return;\n for (name in spreadsheet.sheet.names) {\n tabNames.push(name);\n }\n tabNames.sort();\n select.length = 0;\n select.options[0] = new Option(SocialCalc.LocalizeString(\"[Clipboard]\"));\n for (i=0; i < tabNames.length; i++) {\n var name = tabNames[i];\n select.options[i+1] = new Option(name, name);\n }\n select.options[0].selected = true;\n },\n\n // Add new commands\n addNewCommands: function(spreadsheet, sheetTiddlerTitle) {\n var self = this;\n\n // Extension commands callback\n var comTiddlywiki = function(cmdname, data, sheet, cmd, saveundo) {\n var fonc = \"addNewCommands/comTiddlywiki\";\n if (!cmdname || !sheet) return;\n\n if (cmdname == TiddlyWiki.saveCommandKeyword) {\n // SAVE SHEET TO TIDDLER\n // Activated by Ctrl-S or the toolbar save button.\n\n // Serialize sheet data\n var calcData = SocialCalc.SpreadsheetControlCreateSpreadsheetSave(spreadsheet);\n\n // Save data to tiddler\n if (!sheetTiddlerTitle) return;\n var tiddler = $tw.wiki.getTiddler(sheetTiddlerTitle);\n if (typeof(tiddler) == \"undefined\" || !tiddler) return;\n $tw.wiki.addTiddler(new $tw.Tiddler(tiddler, {type: TiddlyWiki.sheetTiddlerType, text: calcData}));\n \n // Remove tiddler from sheet cache to force a reload, then a recalc of all\n // sheets in SocialCalc widgets with references to this sheet.\n TiddlyWiki.removeTiddlerFromSheetCache(sheetTiddlerTitle);\n \n // Notification\n var language = TiddlyWiki.currentLanguage ? TiddlyWiki.currentLanguage : \"en-GB\";\n var tiddlerTitle = TiddlyWiki.pathLanguages + \"/\" + language + TiddlyWiki.saveNotificationTiddlerSuffix;\n var tiddlerNotification = $tw.wiki.getTiddler(tiddlerTitle);\n if ($tw.notifier) {\n if (typeof(tiddlerNotification) != \"undefined\" && tiddlerNotification)\n $tw.notifier.display(tiddlerTitle);\n else {\n // Try with default language\n tiddlerTitle = TiddlyWiki.pathLanguages + \"/\" + TiddlyWiki.defaultLanguage + TiddlyWiki.saveNotificationTiddlerSuffix;\n var tiddlerNotification1 = $tw.wiki.getTiddler(tiddlerTitle);\n if (typeof(tiddlerNotification1) != \"undefined\" && tiddlerNotification1)\n $tw.notifier.display(tiddlerTitle);\n }\n }\n\n // Give the save button it's normal aspect\n spreadsheet.tiddlyWiki.changeSaveButtonVisual(false);\n\n } else if (cmdname == TiddlyWiki.exportCommandKeyword) {\n // EXPORT DATA TO TIDDLER\n // Set type to \"text/plain\" and \"format\" field to \"tab\", \"csv\" or \"scsave\".\n\n var inputTiddler = document.getElementById(spreadsheet.idPrefix+\"clipboard-tiddler\");\n if (!inputTiddler) return;\n var tiddlerTitle = self.resolvePath(inputTiddler.value);\n if (!tiddlerTitle) return;\n\n // Choosen format\n var select = document.getElementById(spreadsheet.idPrefix+\"clipboard-export-select-format\");\n if (!select) return;\n var format = select.options[select.selectedIndex >= 0 ? select.selectedIndex : 0].text;\n if (format == \"Tab-delimited\") format = \"tab\";\n else if (format == \"CSV\") format = \"csv\";\n else format = \"scsave\";\n\n // Read and format data\n var data = \"\";\n select = document.getElementById(spreadsheet.idPrefix+\"clipboard-export-select-source\");\n if (!select) return;\n if (select.selectedIndex <= 0) {\n // Clipboard\n data = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, format);\n } else {\n // Named selection\n var name = spreadsheet.sheet.names[select.options[select.selectedIndex].text.toUpperCase()];\n if (!name || !name.definition) return;\n var sel = name.definition;\n var data = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(spreadsheet.editor.context.sheetobj, sel), format);\n }\n\n // Save data to tiddler\n var tiddler = $tw.wiki.getTiddler(tiddlerTitle);\n if (typeof(tiddler) != \"undefined\" && tiddler) {\n // Ask confirmation before smashing tiddler\n spreadsheet.tiddlyWiki.createDialog(spreadsheet, SocialCalc.Constants.s_clipboard_export_error_tiddler_exists + \" : <b>\"+tiddlerTitle+\"</b>.<br>\" + SocialCalc.Constants.s_clipboard_export_error_tiddler_overwrite, true, function() {\n $tw.wiki.addTiddler(new $tw.Tiddler({title: tiddlerTitle, type: TiddlyWiki.dataTiddlerType, text: data, format: format}));\n });\n } else\n $tw.wiki.addTiddler(new $tw.Tiddler({title: tiddlerTitle, type: TiddlyWiki.dataTiddlerType, text: data, format: format}));\n\n } else if (cmdname == TiddlyWiki.importCommandKeyword) {\n // IMPORT DATA TIDDLER TO CLIPBOARD\n // Expect \"format\" field to be \"tab\", \"csv\" or \"scsave\". If no format field, assume\n // Tab-delimited format.\n // Don't check tiddler's type.\n\n var inputTiddler = document.getElementById(spreadsheet.idPrefix+\"clipboard-tiddler\");\n if (!inputTiddler) return;\n var tiddlerTitle = self.resolvePath(inputTiddler.value);\n if (!tiddlerTitle) return;\n var tiddler = $tw.wiki.getTiddler(tiddlerTitle);\n if (typeof(tiddler) == \"undefined\" || !tiddler) return;\n var format = null;\n if (tiddler.fields)\n var format = tiddler.fields.format;\n if (format && (format != \"tab\") && (format != \"csv\") && (format != \"scsave\")) {\n alert(SocialCalc.Constants.s_clipboard_import_error_tiddler_format);\n return;\n }\n if (!format) format = \"tab\";\n var data = tiddler.fields.text;\n\n // Fill clipboard area with data\n var radioTab = document.getElementById(spreadsheet.idPrefix+\"clipboardformat-tab\");\n radioTab.click();\n SocialCalc.Clipboard.clipboard = SocialCalc.ConvertOtherFormatToSave(data, format) ;\n SocialCalc.SpreadsheetControlClipboardFormat(\"tab\");\n }\n };\n if (!spreadsheet.sheet || !spreadsheet.sheet.sci) return;\n spreadsheet.sheet.sci.CmdExtensionCallbacks[TiddlyWiki.saveCommandKeyword] = {func:comTiddlywiki, data:null};\n spreadsheet.sheet.sci.CmdExtensionCallbacks[TiddlyWiki.exportCommandKeyword] = {func:comTiddlywiki, data:null};\n spreadsheet.sheet.sci.CmdExtensionCallbacks[TiddlyWiki.importCommandKeyword] = {func:comTiddlywiki, data:null};\n \n // Add UI for the commands (buttons in the toolbar)\n this.addExtensionCmdUI(spreadsheet);\n },\n\n // Create a simple modal dialog to query a OK or Cancel answer and do something if OK\n createDialog: function(spreadsheet, mess, flagDoIfOK, func) {\n // (Inspired by SocialCalc.SpreadsheetControl.DoFunctionList())\n\n self = this;\n var scc = SocialCalc.Constants;\n var idp = spreadsheet.idPrefix+\"dialog\";\n\n // Visual\n var win = document.createElement(\"div\");\n win.id = idp;\n win.style.position = \"absolute\";\n var vp = SocialCalc.GetViewportInfo();\n var pos = SocialCalc.GetElementPositionWithScroll(spreadsheet.spreadsheetDiv);\n win.style.top = ((vp.height/2)-pos.top)+\"px\";\n win.style.left = ((vp.width/2)-pos.left)+\"px\";\n win.style.zIndex = 100;\n win.style.backgroundColor = \"#FFF\";\n win.style.border = \"1px solid black\";\n\n var str =\n '<div class=\"SocialCalc-dialog\" style=\"width:100%;background-color:#DDD;\">'+\n ' <table>'+\n ' <tr>'+\n ' <td>'+\n ' <div style=\"padding:6px 6px 6px 6px;font-size:small;\">'+ mess + '</div>'+\n ' </td>'+\n ' </tr>'+\n ' <tr>'+\n ' <td>'+\n ' <div style=\"text-align:right;padding:12px 6px 6px 6px;font-size:small;\">'+\n ' <input type=\"button\" value=\"%loc!OK!\" id=\"'+idp+'-ok\" style=\"font-size:smaller;\"> '+\n ' <input type=\"button\" value=\"%loc!Cancel!\" id=\"'+idp+'-cancel\" style=\"font-size:smaller;\">'+\n ' </div>'+\n ' </td>'+\n ' </tr>'+\n ' </table>'+\n '</div>';\n\n win.innerHTML = SocialCalc.LocalizeSubstrings(str);\n spreadsheet.spreadsheetDiv.appendChild(win);\n\n // Buttons behaviour\n var deleteWin = function() {\n if (win.parentNode)\n win.parentNode.removeChild(win);\n SocialCalc.KeyboardFocus();\n };\n var buttonOK = document.getElementById(idp+\"-ok\");\n buttonOK.addEventListener(\"click\", function() {\n if (flagDoIfOK && func) func();\n deleteWin();\n }, false);\n var buttonCancel = document.getElementById(idp+\"-cancel\");\n buttonCancel.addEventListener(\"click\", function() {\n deleteWin();\n }, false);\n },\n\n // Monitoring\n monitor: function(spreadsheet) {\n var self = this;\n\n // Register an editor callback (called at almost every steps)\n this.monitorCallback = function(cmdComplete) {\n //console.log(\"TiddlyWiki.monitorCallback: cmd = \"+cmdComplete);\n var tabTokens = cmdComplete.toLowerCase().split(/[\\s]+/);\n var cmd = tabTokens[0];\n var doChange = function(tab) {\n var tabCmdNoChange = [\"copy\", \"cut\", \"clearclipboard\", \"recalc\", \"redisplay\"];\n var cmd = tab[0];\n for (var i = 0; i < tabCmdNoChange.length; i++) {\n if (cmd == tabCmdNoChange[i]) return false;\n }\n if (cmd == \"loadclipboard\" && tabTokens.length == 1) return false;\n return true;\n };\n\n // Change button color when need saving\n if (self.saveTodo.flagStart && doChange(tabTokens)) {\n self.changeSaveButtonVisual(true);\n }\n }\n }\n\n };\n\n exports.TiddlyWiki = TiddlyWiki;\n\n})();",
"title": "$:/plugins/rboue/SocialCalc/tiddlywiki.js",
"type": "application/javascript",
"module-type": "library"
}
}
}
{
"tiddlers": {
"$:/plugins/rboue/Three.js/Lib/three-min.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/three-min.js",
"module-type": "library",
"text": "(function(){\nvar THREE={REVISION:\"68\"};TiddlyWiki||\"object\"!==typeof module||(module.exports=THREE);THREE.CullFaceNone=0;THREE.CullFaceBack=1;THREE.CullFaceFront=2;THREE.CullFaceFrontBack=3;THREE.FrontFaceDirectionCW=0;THREE.FrontFaceDirectionCCW=1;THREE.BasicShadowMap=0;THREE.PCFShadowMap=1;THREE.PCFSoftShadowMap=2;THREE.FrontSide=0;THREE.BackSide=1;THREE.DoubleSide=2;THREE.NoShading=0;THREE.FlatShading=1;THREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;\nTHREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.CustomBlending=5;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;THREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;\nTHREE.SrcAlphaSaturateFactor=210;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.AddOperation=2;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};THREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=1E3;THREE.ClampToEdgeWrapping=1001;THREE.MirroredRepeatWrapping=1002;THREE.NearestFilter=1003;THREE.NearestMipMapNearestFilter=1004;THREE.NearestMipMapLinearFilter=1005;\nTHREE.LinearFilter=1006;THREE.LinearMipMapNearestFilter=1007;THREE.LinearMipMapLinearFilter=1008;THREE.UnsignedByteType=1009;THREE.ByteType=1010;THREE.ShortType=1011;THREE.UnsignedShortType=1012;THREE.IntType=1013;THREE.UnsignedIntType=1014;THREE.FloatType=1015;THREE.UnsignedShort4444Type=1016;THREE.UnsignedShort5551Type=1017;THREE.UnsignedShort565Type=1018;THREE.AlphaFormat=1019;THREE.RGBFormat=1020;THREE.RGBAFormat=1021;THREE.LuminanceFormat=1022;THREE.LuminanceAlphaFormat=1023;\nTHREE.RGB_S3TC_DXT1_Format=2001;THREE.RGBA_S3TC_DXT1_Format=2002;THREE.RGBA_S3TC_DXT3_Format=2003;THREE.RGBA_S3TC_DXT5_Format=2004;THREE.Color=function(a){return 3===arguments.length?this.setRGB(arguments[0],arguments[1],arguments[2]):this.set(a)};\nTHREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,set:function(a){a instanceof THREE.Color?this.copy(a):\"number\"===typeof a?this.setHex(a):\"string\"===typeof a&&this.setStyle(a);return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(a,b,c){if(0===b)this.r=this.g=this.b=c;else{var d=function(a,b,c){0>c&&(c+=1);1<c&&--c;return c<1/6?a+6*(b-a)*c:\n.5>c?b:c<2/3?a+6*(b-a)*(2/3-c):a};b=.5>=c?c*(1+b):c+b-c*b;c=2*c-b;this.r=d(c,b,a+1/3);this.g=d(c,b,a);this.b=d(c,b,a-1/3)}return this},setStyle:function(a){if(/^rgb\\((\\d+), ?(\\d+), ?(\\d+)\\)$/i.test(a))return a=/^rgb\\((\\d+), ?(\\d+), ?(\\d+)\\)$/i.exec(a),this.r=Math.min(255,parseInt(a[1],10))/255,this.g=Math.min(255,parseInt(a[2],10))/255,this.b=Math.min(255,parseInt(a[3],10))/255,this;if(/^rgb\\((\\d+)\\%, ?(\\d+)\\%, ?(\\d+)\\%\\)$/i.test(a))return a=/^rgb\\((\\d+)\\%, ?(\\d+)\\%, ?(\\d+)\\%\\)$/i.exec(a),this.r=\nMath.min(100,parseInt(a[1],10))/100,this.g=Math.min(100,parseInt(a[2],10))/100,this.b=Math.min(100,parseInt(a[3],10))/100,this;if(/^\\#([0-9a-f]{6})$/i.test(a))return a=/^\\#([0-9a-f]{6})$/i.exec(a),this.setHex(parseInt(a[1],16)),this;if(/^\\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(a))return a=/^\\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a),this.setHex(parseInt(a[1]+a[1]+a[2]+a[2]+a[3]+a[3],16)),this;if(/^(\\w+)$/i.test(a))return this.setHex(THREE.ColorKeywords[a]),this},copy:function(a){this.r=a.r;this.g=\na.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<\n8^255*this.b<<0},getHexString:function(){return(\"000000\"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return\"rgb(\"+(255*this.r|0)+\",\"+(255*this.g|0)+\",\"+(255*this.b|0)+\")\"},offsetHSL:function(a,\nb,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;\nthis.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a){this.r=a[0];this.g=a[1];this.b=a[2];return this},toArray:function(){return[this.r,this.g,this.b]},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};\nTHREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,\ndarkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,\ngrey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,\nlime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,\npalegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,\ntomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};THREE.Quaternion=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1};\nTHREE.Quaternion.prototype={constructor:THREE.Quaternion,_x:0,_y:0,_z:0,_w:0,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get w(){return this._w},set w(a){this._w=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;\nthis._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!1===a instanceof THREE.Euler)throw Error(\"THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.\");var c=Math.cos(a._x/2),d=Math.cos(a._y/2),e=Math.cos(a._z/2),f=Math.sin(a._x/2),g=Math.sin(a._y/2),h=Math.sin(a._z/2);\"XYZ\"===a.order?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):\"YXZ\"===a.order?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=\nc*d*h-f*g*e,this._w=c*d*e+f*g*h):\"ZXY\"===a.order?(this._x=f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):\"ZYX\"===a.order?(this._x=f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):\"YZX\"===a.order?(this._x=f*d*e+c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e-f*g*h):\"XZY\"===a.order&&(this._x=f*d*e-c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e+f*g*h);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,\nb){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],l=c+f+b;0<l?(c=.5/Math.sqrt(l+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=\n.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector3);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;this.normalize();return this}}(),inverse:function(){this.conjugate().normalize();return this},conjugate:function(){this._x*=\n-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},\nmultiply:function(a,b){return void 0!==b?(console.warn(\"THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.\"),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,k=b._z,l=b._w;this._x=c*l+f*g+d*k-e*h;this._y=d*l+f*h+e*g-c*k;this._z=e*l+f*k+c*h-d*g;this._w=f*l-c*g-d*h-e*k;this.onChangeCallback();return this},multiplyVector3:function(a){console.warn(\"THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.\");\nreturn a.applyQuaternion(this)},slerp:function(a,b){var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.acos(g),k=Math.sqrt(1-g*g);if(.001>Math.abs(k))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;g=Math.sin((1-b)*h)/k;h=Math.sin(b*h)/k;this._w=f*g+this._w*h;this._x=c*g+\nthis._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];this._w=a[3];this.onChangeCallback();return this},toArray:function(){return[this._x,this._y,this._z,this._w]},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){},clone:function(){return new THREE.Quaternion(this._x,this._y,\nthis._z,this._w)}};THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};\nTHREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error(\"index is out of range: \"+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error(\"index is out of range: \"+a);}},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,\nb){if(void 0!==b)return console.warn(\"THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},\nsubVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){0!==a?(a=1/a,this.x*=a,this.y*=a):this.y=this.x=0;return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);return this},max:function(a){this.x<a.x&&(this.x=a.x);this.y<a.y&&(this.y=a.y);return this},clamp:function(a,\nb){this.x<a.x?this.x=a.x:this.x>b.x&&(this.x=b.x);this.y<a.y?this.y=a.y:this.y>b.y&&(this.y=b.y);return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector2,b=new THREE.Vector2);a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},\nroundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=\nthis.x-a.x;a=this.y-a.y;return b*b+a*a},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a){this.x=a[0];this.y=a[1];return this},toArray:function(){return[this.x,this.y]},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};\nTHREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error(\"index is out of range: \"+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error(\"index is out of range: \"+\na);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),\nthis.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.\"),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=\na.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a;return function(b){!1===b instanceof THREE.Euler&&console.error(\"THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.\");void 0===a&&(a=new THREE.Quaternion);this.applyQuaternion(a.setFromEuler(b));return this}}(),applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new THREE.Quaternion);this.applyQuaternion(a.setFromAxisAngle(b,c));return this}}(),applyMatrix3:function(a){var b=this.x,\nc=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];return this},applyProjection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=\n(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,l=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-l*-f;this.y=k*a+b*-f+l*-e-h*-g;this.z=l*a+b*-g+h*-f-k*-e;return this},transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;this.normalize();return this},divide:function(a){this.x/=a.x;\nthis.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){0!==a?(a=1/a,this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);return this},max:function(a){this.x<a.x&&(this.x=a.x);this.y<a.y&&(this.y=a.y);this.z<a.z&&(this.z=a.z);return this},clamp:function(a,b){this.x<a.x?this.x=a.x:this.x>b.x&&(this.x=b.x);this.y<a.y?this.y=a.y:this.y>b.y&&(this.y=b.y);this.z<a.z?this.z=a.z:this.z>b.z&&(this.z=\nb.z);return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector3,b=new THREE.Vector3);a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=\n0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+\nMath.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},cross:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.\"),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=\ne*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(){var a,b;return function(c){void 0===a&&(a=new THREE.Vector3);a.copy(c).normalize();b=this.dot(a);return this.copy(a).multiplyScalar(b)}}(),projectOnPlane:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0===\na&&(a=new THREE.Vector3);return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/(this.length()*a.length());return Math.acos(THREE.Math.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},setEulerFromRotationMatrix:function(a,b){console.error(\"THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.\")},\nsetEulerFromQuaternion:function(a,b){console.error(\"THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.\")},getPositionFromMatrix:function(a){console.warn(\"THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().\");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn(\"THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().\");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,\nb){console.warn(\"THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().\");return this.setFromMatrixColumn(a,b)},setFromMatrixPosition:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},setFromMatrixScale:function(a){var b=this.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length();a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=\na;return this},setFromMatrixColumn:function(a,b){var c=4*a,d=b.elements;this.x=d[c];this.y=d[c+1];this.z=d[c+2];return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a){this.x=a[0];this.y=a[1];this.z=a[2];return this},toArray:function(){return[this.x,this.y,this.z]},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1};\nTHREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error(\"index is out of range: \"+a);}},getComponent:function(a){switch(a){case 0:return this.x;\ncase 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(\"index is out of range: \"+a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},\naddVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=\nthis.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){0!==a?(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a):(this.z=this.y=this.x=0,this.w=1);return this},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},\nsetAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var l=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+l-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;l=(l+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>l?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>l?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),\nb=d/c,d=k/c):.01>l?(c=b=.707106781,d=0):(d=Math.sqrt(l),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+l-1)/2);return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);this.w>a.w&&(this.w=a.w);return this},max:function(a){this.x<a.x&&(this.x=a.x);this.y<a.y&&(this.y=a.y);this.z<a.z&&(this.z=a.z);this.w<a.w&&(this.w=a.w);\nreturn this},clamp:function(a,b){this.x<a.x?this.x=a.x:this.x>b.x&&(this.x=b.x);this.y<a.y?this.y=a.y:this.y>b.y&&(this.y=b.y);this.z<a.z?this.z=a.z:this.z>b.z&&(this.z=b.z);this.w<a.w?this.w=a.w:this.w>b.w&&(this.w=b.w);return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector4,b=new THREE.Vector4);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);\nreturn this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);\nreturn this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},\nsetLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a){this.x=a[0];this.y=a[1];this.z=a[2];this.w=a[3];return this},toArray:function(){return[this.x,this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,\nthis.w)}};THREE.Euler=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||THREE.Euler.DefaultOrder};THREE.Euler.RotationOrders=\"XYZ YZX ZXY XZY YXZ ZYX\".split(\" \");THREE.Euler.DefaultOrder=\"XYZ\";\nTHREE.Euler.prototype={constructor:THREE.Euler,_x:0,_y:0,_z:0,_order:THREE.Euler.DefaultOrder,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order},set order(a){this._order=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},copy:function(a){this._x=\na._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b){var c=THREE.Math.clamp,d=a.elements,e=d[0],f=d[4],g=d[8],h=d[1],k=d[5],l=d[9],n=d[2],q=d[6],d=d[10];b=b||this._order;\"XYZ\"===b?(this._y=Math.asin(c(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-f,e)):(this._x=Math.atan2(q,k),this._z=0)):\"YXZ\"===b?(this._x=Math.asin(-c(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(g,d),this._z=Math.atan2(h,k)):(this._y=\nMath.atan2(-n,e),this._z=0)):\"ZXY\"===b?(this._x=Math.asin(c(q,-1,1)),.99999>Math.abs(q)?(this._y=Math.atan2(-n,d),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,e))):\"ZYX\"===b?(this._y=Math.asin(-c(n,-1,1)),.99999>Math.abs(n)?(this._x=Math.atan2(q,d),this._z=Math.atan2(h,e)):(this._x=0,this._z=Math.atan2(-f,k))):\"YZX\"===b?(this._z=Math.asin(c(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-l,k),this._y=Math.atan2(-n,e)):(this._x=0,this._y=Math.atan2(g,d))):\"XZY\"===b?(this._z=Math.asin(-c(f,\n-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(q,k),this._y=Math.atan2(g,e)):(this._x=Math.atan2(-l,d),this._y=0)):console.warn(\"THREE.Euler: .setFromRotationMatrix() given unsupported order: \"+b);this._order=b;this.onChangeCallback();return this},setFromQuaternion:function(a,b,c){var d=THREE.Math.clamp,e=a.x*a.x,f=a.y*a.y,g=a.z*a.z,h=a.w*a.w;b=b||this._order;\"XYZ\"===b?(this._x=Math.atan2(2*(a.x*a.w-a.y*a.z),h-e-f+g),this._y=Math.asin(d(2*(a.x*a.z+a.y*a.w),-1,1)),this._z=Math.atan2(2*(a.z*a.w-a.x*\na.y),h+e-f-g)):\"YXZ\"===b?(this._x=Math.asin(d(2*(a.x*a.w-a.y*a.z),-1,1)),this._y=Math.atan2(2*(a.x*a.z+a.y*a.w),h-e-f+g),this._z=Math.atan2(2*(a.x*a.y+a.z*a.w),h-e+f-g)):\"ZXY\"===b?(this._x=Math.asin(d(2*(a.x*a.w+a.y*a.z),-1,1)),this._y=Math.atan2(2*(a.y*a.w-a.z*a.x),h-e-f+g),this._z=Math.atan2(2*(a.z*a.w-a.x*a.y),h-e+f-g)):\"ZYX\"===b?(this._x=Math.atan2(2*(a.x*a.w+a.z*a.y),h-e-f+g),this._y=Math.asin(d(2*(a.y*a.w-a.x*a.z),-1,1)),this._z=Math.atan2(2*(a.x*a.y+a.z*a.w),h+e-f-g)):\"YZX\"===b?(this._x=Math.atan2(2*\n(a.x*a.w-a.z*a.y),h-e+f-g),this._y=Math.atan2(2*(a.y*a.w-a.x*a.z),h+e-f-g),this._z=Math.asin(d(2*(a.x*a.y+a.z*a.w),-1,1))):\"XZY\"===b?(this._x=Math.atan2(2*(a.x*a.w+a.y*a.z),h-e+f-g),this._y=Math.atan2(2*(a.x*a.z+a.y*a.w),h+e-f-g),this._z=Math.asin(d(2*(a.z*a.w-a.x*a.y),-1,1))):console.warn(\"THREE.Euler: .setFromQuaternion() given unsupported order: \"+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},reorder:function(){var a=new THREE.Quaternion;return function(b){a.setFromEuler(this);\nthis.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(){return[this._x,this._y,this._z,this._order]},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){},clone:function(){return new THREE.Euler(this._x,this._y,this._z,this._order)}};\nTHREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3};\nTHREE.Line3.prototype={constructor:THREE.Line3,set:function(a,b){this.start.copy(a);this.end.copy(b);return this},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},center:function(a){return(a||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,\nb){var c=b||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=THREE.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);\nthis.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)},clone:function(){return(new THREE.Line3).copy(this)}};THREE.Box2=function(a,b){this.min=void 0!==a?a:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector2(-Infinity,-Infinity)};\nTHREE.Box2.prototype={constructor:THREE.Box2,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new THREE.Vector2;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=\nthis.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},center:function(a){return(a||new THREE.Vector2).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(a){return(a||new THREE.Vector2).subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);\nthis.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a,b){return(b||new THREE.Vector2).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>\nthis.max.y?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector2).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector2;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&\na.max.equals(this.max)},clone:function(){return(new THREE.Box2).copy(this)}};THREE.Box3=function(a,b){this.min=void 0!==a?a:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector3(-Infinity,-Infinity,-Infinity)};\nTHREE.Box3.prototype={constructor:THREE.Box3,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new THREE.Vector3;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(){var a=new THREE.Vector3;return function(b){var c=this;b.updateMatrixWorld(!0);\nthis.makeEmpty();b.traverse(function(b){if(void 0!==b.geometry&&void 0!==b.geometry.vertices)for(var e=b.geometry.vertices,f=0,g=e.length;f<g;f++)a.copy(e[f]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)});return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},\ncenter:function(a){return(a||new THREE.Vector3).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(a){return(a||new THREE.Vector3).subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<\nthis.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a,b){return(b||new THREE.Vector3).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<\nthis.min.z||a.min.z>this.max.z?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector3).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new THREE.Vector3;return function(b){b=b||new THREE.Sphere;b.center=this.center();b.radius=.5*this.size(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);\nthis.max.max(a.max);return this},applyMatrix4:function(){var a=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(b){a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);\na[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.makeEmpty();this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box3).copy(this)}};\nTHREE.Matrix3=function(a,b,c,d,e,f,g,h,k){var l=this.elements=new Float32Array(9);l[0]=void 0!==a?a:1;l[3]=b||0;l[6]=c||0;l[1]=d||0;l[4]=void 0!==e?e:1;l[7]=f||0;l[2]=g||0;l[5]=h||0;l[8]=void 0!==k?k:1};\nTHREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(a,b,c,d,e,f,g,h,k){var l=this.elements;l[0]=a;l[3]=b;l[6]=c;l[1]=d;l[4]=e;l[7]=f;l[2]=g;l[5]=h;l[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},multiplyVector3:function(a){console.warn(\"THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.\");return a.applyMatrix3(this)},\nmultiplyVector3Array:function(a){console.warn(\"THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.\");return this.applyToVector3Array(a)},applyToVector3Array:function(){var a=new THREE.Vector3;return function(b,c,d){void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.x=b[c],a.y=b[c+1],a.z=b[c+2],a.applyMatrix3(this),b[c]=a.x,b[c+1]=a.y,b[c+2]=a.z;return b}}(),multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=\na;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){var c=a.elements,d=this.elements;d[0]=c[10]*c[5]-c[6]*c[9];d[1]=-c[10]*c[1]+c[2]*c[9];d[2]=c[6]*c[1]-c[2]*c[5];d[3]=-c[10]*c[4]+c[6]*c[8];d[4]=c[10]*c[0]-c[2]*c[8];d[5]=-c[6]*c[0]+c[2]*c[4];d[6]=c[9]*c[4]-c[5]*c[8];d[7]=-c[9]*c[0]+c[1]*c[8];d[8]=c[5]*c[0]-c[1]*c[4];\nc=c[0]*d[0]+c[1]*d[3]+c[2]*d[6];if(0===c){if(b)throw Error(\"Matrix3.getInverse(): can't invert matrix, determinant is 0\");console.warn(\"Matrix3.getInverse(): can't invert matrix, determinant is 0\");this.identity();return this}this.multiplyScalar(1/c);return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];\na[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a},getNormalMatrix:function(a){this.getInverse(a).transpose();return this},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},fromArray:function(a){this.elements.set(a);return this},toArray:function(){var a=this.elements;return[a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]]},clone:function(){var a=this.elements;return new THREE.Matrix3(a[0],a[3],\na[6],a[1],a[4],a[7],a[2],a[5],a[8])}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,k,l,n,q,r,t,s,p){var v=this.elements=new Float32Array(16);v[0]=void 0!==a?a:1;v[4]=b||0;v[8]=c||0;v[12]=d||0;v[1]=e||0;v[5]=void 0!==f?f:1;v[9]=g||0;v[13]=h||0;v[2]=k||0;v[6]=l||0;v[10]=void 0!==n?n:1;v[14]=q||0;v[3]=r||0;v[7]=t||0;v[11]=s||0;v[15]=void 0!==p?p:1};\nTHREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,k,l,n,q,r,t,s,p){var v=this.elements;v[0]=a;v[4]=b;v[8]=c;v[12]=d;v[1]=e;v[5]=f;v[9]=g;v[13]=h;v[2]=k;v[6]=l;v[10]=n;v[14]=q;v[3]=r;v[7]=t;v[11]=s;v[15]=p;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){this.elements.set(a.elements);return this},extractPosition:function(a){console.warn(\"THREEMatrix4: .extractPosition() has been renamed to .copyPosition().\");return this.copyPosition(a)},\ncopyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(){var a=new THREE.Vector3;return function(b){var c=this.elements;b=b.elements;var d=1/a.set(b[0],b[1],b[2]).length(),e=1/a.set(b[4],b[5],b[6]).length(),f=1/a.set(b[8],b[9],b[10]).length();c[0]=b[0]*d;c[1]=b[1]*d;c[2]=b[2]*d;c[4]=b[4]*e;c[5]=b[5]*e;c[6]=b[6]*e;c[8]=b[8]*f;c[9]=b[9]*f;c[10]=b[10]*f;return this}}(),makeRotationFromEuler:function(a){!1===a instanceof THREE.Euler&&\nconsole.error(\"THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.\");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if(\"XYZ\"===a.order){a=f*h;var k=f*e,l=c*h,n=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+l*d;b[5]=a-n*d;b[9]=-c*g;b[2]=n-a*d;b[6]=l+k*d;b[10]=f*g}else\"YXZ\"===a.order?(a=g*h,k=g*e,l=d*h,n=d*e,b[0]=a+n*c,b[4]=l*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-l,b[6]=n+a*c,\nb[10]=f*g):\"ZXY\"===a.order?(a=g*h,k=g*e,l=d*h,n=d*e,b[0]=a-n*c,b[4]=-f*e,b[8]=l+k*c,b[1]=k+l*c,b[5]=f*h,b[9]=n-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):\"ZYX\"===a.order?(a=f*h,k=f*e,l=c*h,n=c*e,b[0]=g*h,b[4]=l*d-k,b[8]=a*d+n,b[1]=g*e,b[5]=n*d+a,b[9]=k*d-l,b[2]=-d,b[6]=c*g,b[10]=f*g):\"YZX\"===a.order?(a=f*g,k=f*d,l=c*g,n=c*d,b[0]=g*h,b[4]=n-a*e,b[8]=l*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+l,b[10]=a-n*e):\"XZY\"===a.order&&(a=f*g,k=f*d,l=c*g,n=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+n,b[5]=f*h,b[9]=k*\ne-l,b[2]=l*e-k,b[6]=c*h,b[10]=n*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},setRotationFromQuaternion:function(a){console.warn(\"THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().\");return this.makeRotationFromQuaternion(a)},makeRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,k=e+e;a=c*g;var l=c*h,c=c*k,n=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(n+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-\n(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+n);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(d,e,f){var g=this.elements;c.subVectors(d,e).normalize();0===c.length()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.length()&&(c.x+=1E-4,a.crossVectors(f,c).normalize());b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),\nmultiply:function(a,b){return void 0!==b?(console.warn(\"THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.\"),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],l=c[1],n=c[5],q=c[9],r=c[13],t=c[2],s=c[6],p=c[10],v=c[14],w=c[3],u=c[7],D=c[11],c=c[15],A=d[0],x=d[4],C=d[8],I=d[12],z=d[1],y=d[5],K=d[9],N=d[13],ba=d[2],P=d[6],O=d[10],J=d[14],E=d[3],\nQ=d[7],L=d[11],d=d[15];e[0]=f*A+g*z+h*ba+k*E;e[4]=f*x+g*y+h*P+k*Q;e[8]=f*C+g*K+h*O+k*L;e[12]=f*I+g*N+h*J+k*d;e[1]=l*A+n*z+q*ba+r*E;e[5]=l*x+n*y+q*P+r*Q;e[9]=l*C+n*K+q*O+r*L;e[13]=l*I+n*N+q*J+r*d;e[2]=t*A+s*z+p*ba+v*E;e[6]=t*x+s*y+p*P+v*Q;e[10]=t*C+s*K+p*O+v*L;e[14]=t*I+s*N+p*J+v*d;e[3]=w*A+u*z+D*ba+c*E;e[7]=w*x+u*y+D*P+c*Q;e[11]=w*C+u*K+D*O+c*L;e[15]=w*I+u*N+D*J+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];\nc[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},multiplyVector3:function(a){console.warn(\"THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.\");\nreturn a.applyProjection(this)},multiplyVector4:function(a){console.warn(\"THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn(\"THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.\");return this.applyToVector3Array(a)},applyToVector3Array:function(){var a=new THREE.Vector3;return function(b,c,d){void 0===c&&(c=0);void 0===d&&(d=\nb.length);for(var e=0;e<d;e+=3,c+=3)a.x=b[c],a.y=b[c+1],a.z=b[c+2],a.applyMatrix4(this),b[c]=a.x,b[c+1]=a.y,b[c+2]=a.z;return b}}(),rotateAxis:function(a){console.warn(\"THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.\");a.transformDirection(this)},crossVector:function(a){console.warn(\"THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return a.applyMatrix4(this)},determinant:function(){var a=this.elements,b=\na[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],k=a[13],l=a[2],n=a[6],q=a[10],r=a[14];return a[3]*(+e*h*n-d*k*n-e*g*q+c*k*q+d*g*r-c*h*r)+a[7]*(+b*h*r-b*k*q+e*f*q-d*f*r+d*k*l-e*h*l)+a[11]*(+b*k*n-b*g*r-e*f*n+c*f*r+e*g*l-c*k*l)+a[15]*(-d*g*l-b*h*n+b*g*q+d*f*n-c*f*q+c*h*l)},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArrayOffset:function(a,\nb){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=new THREE.Vector3;return function(){console.warn(\"THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.\");var b=this.elements;return a.set(b[12],b[13],b[14])}}(),setPosition:function(a){var b=\nthis.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements,e=d[0],f=d[4],g=d[8],h=d[12],k=d[1],l=d[5],n=d[9],q=d[13],r=d[2],t=d[6],s=d[10],p=d[14],v=d[3],w=d[7],u=d[11],d=d[15];c[0]=n*p*w-q*s*w+q*t*u-l*p*u-n*t*d+l*s*d;c[4]=h*s*w-g*p*w-h*t*u+f*p*u+g*t*d-f*s*d;c[8]=g*q*w-h*n*w+h*l*u-f*q*u-g*l*d+f*n*d;c[12]=h*n*t-g*q*t-h*l*s+f*q*s+g*l*p-f*n*p;c[1]=q*s*v-n*p*v-q*r*u+k*p*u+n*r*d-k*s*d;c[5]=g*p*v-h*s*v+h*r*u-e*p*u-g*r*d+e*s*d;c[9]=h*n*v-g*q*v-h*k*\nu+e*q*u+g*k*d-e*n*d;c[13]=g*q*r-h*n*r+h*k*s-e*q*s-g*k*p+e*n*p;c[2]=l*p*v-q*t*v+q*r*w-k*p*w-l*r*d+k*t*d;c[6]=h*t*v-f*p*v-h*r*w+e*p*w+f*r*d-e*t*d;c[10]=f*q*v-h*l*v+h*k*w-e*q*w-f*k*d+e*l*d;c[14]=h*l*r-f*q*r-h*k*t+e*q*t+f*k*p-e*l*p;c[3]=n*t*v-l*s*v-n*r*w+k*s*w+l*r*u-k*t*u;c[7]=f*s*v-g*t*v+g*r*w-e*s*w-f*r*u+e*t*u;c[11]=g*l*v-f*n*v-g*k*w+e*n*w+f*k*u-e*l*u;c[15]=f*n*r-g*l*r+g*k*t-e*n*t-f*k*s+e*l*s;c=e*c[0]+k*c[4]+r*c[8]+v*c[12];if(0==c){if(b)throw Error(\"Matrix4.getInverse(): can't invert matrix, determinant is 0\");\nconsole.warn(\"Matrix4.getInverse(): can't invert matrix, determinant is 0\");this.identity();return this}this.multiplyScalar(1/c);return this},translate:function(a){console.warn(\"THREE.Matrix4: .translate() has been removed.\")},rotateX:function(a){console.warn(\"THREE.Matrix4: .rotateX() has been removed.\")},rotateY:function(a){console.warn(\"THREE.Matrix4: .rotateY() has been removed.\")},rotateZ:function(a){console.warn(\"THREE.Matrix4: .rotateZ() has been removed.\")},rotateByAxis:function(a,b){console.warn(\"THREE.Matrix4: .rotateByAxis() has been removed.\")},\nscale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,\n0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,k=e*f,l=e*g;this.set(k*f+c,k*g-d*h,k*h+d*g,0,k*g+d*h,l*g+c,l*h-d*f,0,k*h-d*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,\n0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new THREE.Vector3,b=new THREE.Matrix4;return function(c,d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.elements.set(this.elements);c=1/g;var f=1/h,l=1/k;b.elements[0]*=c;b.elements[1]*=\nc;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=l;b.elements[9]*=l;b.elements[10]*=l;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){a=c*Math.tan(THREE.Math.degToRad(.5*a));\nvar e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=b-a,k=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/k;g[9]=0;g[13]=-((c+d)/k);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},fromArray:function(a){this.elements.set(a);return this},toArray:function(){var a=this.elements;return[a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]]},clone:function(){var a=\nthis.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Ray=function(a,b){this.origin=void 0!==a?a:new THREE.Vector3;this.direction=void 0!==b?b:new THREE.Vector3};\nTHREE.Ray.prototype={constructor:THREE.Ray,set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new THREE.Vector3).copy(this.direction).multiplyScalar(a).add(this.origin)},recast:function(){var a=new THREE.Vector3;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new THREE.Vector3;c.subVectors(a,this.origin);\nvar d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceTo(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceTo(b)}}(),distanceSqToSegment:function(a,b,c,d){var e=a.clone().add(b).multiplyScalar(.5),f=b.clone().sub(a).normalize(),g=.5*a.distanceTo(b),h=\nthis.origin.clone().sub(e);a=-this.direction.dot(f);b=h.dot(this.direction);var k=-h.dot(f),l=h.lengthSq(),n=Math.abs(1-a*a),q,r;0<=n?(h=a*k-b,q=a*b-k,r=g*n,0<=h?q>=-r?q<=r?(g=1/n,h*=g,q*=g,a=h*(h+a*q+2*b)+q*(a*h+q+2*k)+l):(q=g,h=Math.max(0,-(a*q+b)),a=-h*h+q*(q+2*k)+l):(q=-g,h=Math.max(0,-(a*q+b)),a=-h*h+q*(q+2*k)+l):q<=-r?(h=Math.max(0,-(-a*g+b)),q=0<h?-g:Math.min(Math.max(-g,-k),g),a=-h*h+q*(q+2*k)+l):q<=r?(h=0,q=Math.min(Math.max(-g,-k),g),a=q*(q+2*k)+l):(h=Math.max(0,-(a*g+b)),q=0<h?g:Math.min(Math.max(-g,\n-k),g),a=-h*h+q*(q+2*k)+l)):(q=0<a?-g:g,h=Math.max(0,-(a*q+b)),a=-h*h+q*(q+2*k)+l);c&&c.copy(this.direction.clone().multiplyScalar(h).add(this.origin));d&&d.copy(f.clone().multiplyScalar(q).add(e));return a},isIntersectionSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},intersectSphere:function(){var a=new THREE.Vector3;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,f=b.radius*b.radius;if(e>f)return null;f=Math.sqrt(f-e);e=d-f;\nd+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),isIntersectionPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0==b)return 0==a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},isIntersectionBox:function(){var a=new THREE.Vector3;\nreturn function(b){return null!==this.intersectBox(b,a)}}(),intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;0<=g?(e=(a.min.z-h.z)*g,g*=a.max.z-h.z):(e=(a.max.z-h.z)*g,g*=a.min.z-h.z);if(c>g||e>d)return null;if(e>c||c!==\nc)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectTriangle:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3,d=new THREE.Vector3;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;\ne=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a);this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)},clone:function(){return(new THREE.Ray).copy(this)}};THREE.Sphere=function(a,b){this.center=void 0!==a?a:new THREE.Vector3;this.radius=void 0!==b?b:0};\nTHREE.Sphere.prototype={constructor:THREE.Sphere,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new THREE.Box3;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).center(d);for(var e=0,f=0,g=b.length;f<g;f++)e=Math.max(e,d.distanceToSquared(b[f]));this.radius=Math.sqrt(e);return this}}(),copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=\nthis.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new THREE.Vector3;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new THREE.Box3;a.set(this.center,this.center);a.expandByScalar(this.radius);\nreturn a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius},clone:function(){return(new THREE.Sphere).copy(this)}};\nTHREE.Frustum=function(a,b,c,d,e,f){this.planes=[void 0!==a?a:new THREE.Plane,void 0!==b?b:new THREE.Plane,void 0!==c?c:new THREE.Plane,void 0!==d?d:new THREE.Plane,void 0!==e?e:new THREE.Plane,void 0!==f?f:new THREE.Plane]};\nTHREE.Frustum.prototype={constructor:THREE.Frustum,set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],l=c[7],n=c[8],q=c[9],r=c[10],t=c[11],s=c[12],p=c[13],v=c[14],c=c[15];b[0].setComponents(f-a,l-g,t-n,c-s).normalize();b[1].setComponents(f+\na,l+g,t+n,c+s).normalize();b[2].setComponents(f+d,l+h,t+q,c+p).normalize();b[3].setComponents(f-d,l-h,t-q,c-p).normalize();b[4].setComponents(f-e,l-k,t-r,c-v).normalize();b[5].setComponents(f+e,l+k,t+r,c+v).normalize();return this},intersectsObject:function(){var a=new THREE.Sphere;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere);a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,\nc=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),\ncontainsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0},clone:function(){return(new THREE.Frustum).copy(this)}};THREE.Plane=function(a,b){this.normal=void 0!==a?a:new THREE.Vector3(1,0,0);this.constant=void 0!==b?b:0};\nTHREE.Plane.prototype={constructor:THREE.Plane,set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,\nc);return this}}(),copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,\nb){var c=this.distanceToPoint(a);return(b||new THREE.Vector3).copy(this.normal).multiplyScalar(c)},isIntersectionLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectLine:function(){var a=new THREE.Vector3;return function(b,c){var d=c||new THREE.Vector3,e=b.delta(a),f=this.normal.dot(e);if(0==f){if(0==this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/f,0>f||1<f?void 0:d.copy(e).multiplyScalar(f).add(b.start)}}(),\ncoplanarPoint:function(a){return(a||new THREE.Vector3).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Matrix3;return function(d,e){var f=e||c.getNormalMatrix(d),f=a.copy(this.normal).applyMatrix3(f),g=this.coplanarPoint(b);g.applyMatrix4(d);this.setFromNormalAndCoplanarPoint(f,g);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&\na.constant==this.constant},clone:function(){return(new THREE.Plane).copy(this)}};\nTHREE.Math={generateUUID:function(){var a=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\".split(\"\"),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8==e||13==e||18==e||23==e?b[e]=\"-\":14==e?b[e]=\"4\":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19==e?d&3|8:d]);return b.join(\"\")}}(),clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},smoothstep:function(a,b,c){if(a<=\nb)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},sign:function(a){return 0>a?-1:0<a?1:0},degToRad:function(){var a=Math.PI/180;return function(b){return b*\na}}(),radToDeg:function(){var a=180/Math.PI;return function(b){return b*a}}(),isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a}};\nTHREE.Spline=function(a){function b(a,b,c,d,e,f,g){a=.5*(c-a);d=.5*(d-b);return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,k,l,n,q,r;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=0===f?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:f+\n2;l=this.points[c[0]];n=this.points[c[1]];q=this.points[c[2]];r=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,n.x,q.x,r.x,g,h,k);d.y=b(l.y,n.y,q.y,r.y,g,h,k);d.z=b(l.z,n.z,q.z,r.z,g,h,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++)b=this.points[a],d[a]=[b.x,b.y,b.z];return d};this.getLength=function(a){var b,c,d,e=b=b=0,f=new THREE.Vector3,g=new THREE.Vector3,h=[],k=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++)b=\na/c,d=this.getPoint(b),g.copy(d),k+=g.distanceTo(f),f.copy(d),b*=this.points.length-1,b=Math.floor(b),b!=e&&(h[b]=k,e=b);h[h.length]=k;return{chunks:h,total:k}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],k=new THREE.Vector3,l=this.getLength();h.push(k.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=l.chunks[b]-l.chunks[b-1];g=Math.ceil(a*c/l.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++)d=e+1/g*c*(f-e),d=this.getPoint(d),h.push(k.copy(d).clone());\nh.push(k.copy(this.points[b]).clone())}this.points=h}};THREE.Triangle=function(a,b,c){this.a=void 0!==a?a:new THREE.Vector3;this.b=void 0!==b?b:new THREE.Vector3;this.c=void 0!==c?c:new THREE.Vector3};THREE.Triangle.normal=function(){var a=new THREE.Vector3;return function(b,c,d,e){e=e||new THREE.Vector3;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}();\nTHREE.Triangle.barycoordFromPoint=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var l=d*k-e*e;h=h||new THREE.Vector3;if(0==l)return h.set(-2,-1,-1);l=1/l;k=(k*f-e*g)*l;d=(d*g-e*f)*l;return h.set(1-k-d,d,k)}}();\nTHREE.Triangle.containsPoint=function(){var a=new THREE.Vector3;return function(b,c,d,e){b=THREE.Triangle.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}();\nTHREE.Triangle.prototype={constructor:THREE.Triangle,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||\nnew THREE.Vector3).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return THREE.Triangle.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new THREE.Plane).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return THREE.Triangle.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return THREE.Triangle.containsPoint(a,this.a,this.b,this.c)},equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)},\nclone:function(){return(new THREE.Triangle).copy(this)}};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1};\nTHREE.Clock.prototype={constructor:THREE.Clock,start:function(){this.oldTime=this.startTime=void 0!==self.performance&&void 0!==self.performance.now?self.performance.now():Date.now();this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=void 0!==self.performance&&void 0!==self.performance.now?self.performance.now():Date.now(),\na=.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a}};THREE.EventDispatcher=function(){};\nTHREE.EventDispatcher.prototype={constructor:THREE.EventDispatcher,apply:function(a){a.addEventListener=THREE.EventDispatcher.prototype.addEventListener;a.hasEventListener=THREE.EventDispatcher.prototype.hasEventListener;a.removeEventListener=THREE.EventDispatcher.prototype.removeEventListener;a.dispatchEvent=THREE.EventDispatcher.prototype.dispatchEvent},addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&\nc[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)?!0:!1},removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var c=[],d=b.length,e=0;e<d;e++)c[e]=b[e];for(e=0;e<d;e++)c[e].call(this,a)}}}};\n(function(a){a.Raycaster=function(b,c,f,g){this.ray=new a.Ray(b,c);this.near=f||0;this.far=g||Infinity;this.params={Sprite:{},Mesh:{},PointCloud:{threshold:1},LOD:{},Line:{}}};var b=function(a,b){return a.distance-b.distance},c=function(a,b,f,g){a.raycast(b,f);if(!0===g){a=a.children;g=0;for(var h=a.length;g<h;g++)c(a[g],b,f,!0)}};a.Raycaster.prototype={constructor:a.Raycaster,precision:1E-4,linePrecision:1,set:function(a,b){this.ray.set(a,b)},intersectObject:function(a,e){var f=[];c(a,this,f,e);\nf.sort(b);return f},intersectObjects:function(a,e){for(var f=[],g=0,h=a.length;g<h;g++)c(a[g],this,f,e);f.sort(b);return f}}})(THREE);\nTHREE.Object3D=function(){this.id=THREE.Object3DIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.parent=void 0;this.children=[];this.up=THREE.Object3D.DefaultUp.clone();var a=new THREE.Vector3,b=new THREE.Euler,c=new THREE.Quaternion,d=new THREE.Vector3(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},\nscale:{enumerable:!0,value:d}});this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixAutoUpdate=!0;this.matrixWorldNeedsUpdate=!1;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.userData={}};THREE.Object3D.DefaultUp=new THREE.Vector3(0,1,0);\nTHREE.Object3D.prototype={constructor:THREE.Object3D,get eulerOrder(){console.warn(\"THREE.Object3D: .eulerOrder has been moved to .rotation.order.\");return this.rotation.order},set eulerOrder(a){console.warn(\"THREE.Object3D: .eulerOrder has been moved to .rotation.order.\");this.rotation.order=a},get useQuaternion(){console.warn(\"THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.\")},set useQuaternion(a){console.warn(\"THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.\")},\napplyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new THREE.Quaternion;return function(b,c){a.setFromAxisAngle(b,\nc);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new THREE.Vector3(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=new THREE.Vector3(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new THREE.Vector3(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new THREE.Vector3;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));\nreturn this}}(),translate:function(a,b){console.warn(\"THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.\");return this.translateOnAxis(b,a)},translateX:function(){var a=new THREE.Vector3(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new THREE.Vector3(0,1,0);return function(b){return this.translateOnAxis(a,b)}}(),translateZ:function(){var a=new THREE.Vector3(0,0,1);return function(b){return this.translateOnAxis(a,\nb)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new THREE.Matrix4;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new THREE.Matrix4;return function(b){a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error(\"THREE.Object3D.add:\",\na,\"can't be added as a child of itself.\"),this;if(a instanceof THREE.Object3D){void 0!==a.parent&&a.parent.remove(a);a.parent=this;a.dispatchEvent({type:\"added\"});this.children.push(a);for(b=this;void 0!==b.parent;)b=b.parent;void 0!==b&&b instanceof THREE.Scene&&b.__addObject(a)}else console.error(\"THREE.Object3D.add:\",a,\"is not an instance of THREE.Object3D.\");return this},remove:function(a){if(1<arguments.length)for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);b=this.children.indexOf(a);\nif(-1!==b){a.parent=void 0;a.dispatchEvent({type:\"removed\"});this.children.splice(b,1);for(b=this;void 0!==b.parent;)b=b.parent;void 0!==b&&b instanceof THREE.Scene&&b.__removeObject(a)}},raycast:function(){},traverse:function(a){a(this);for(var b=0,c=this.children.length;b<c;b++)this.children[b].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=0,c=this.children.length;b<c;b++)this.children[b].traverseVisible(a)}},getObjectById:function(a,b){for(var c=0,d=this.children.length;c<\nd;c++){var e=this.children[c];if(e.id===a||!0===b&&(e=e.getObjectById(a,b),void 0!==e))return e}},getObjectByName:function(a,b){for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c];if(e.name===a||!0===b&&(e=e.getObjectByName(a,b),void 0!==e))return e}},getChildByName:function(a,b){console.warn(\"THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().\");return this.getObjectByName(a,b)},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);\nthis.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){!0===this.matrixAutoUpdate&&this.updateMatrix();if(!0===this.matrixWorldNeedsUpdate||!0===a)void 0===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)},clone:function(a,b){void 0===a&&(a=new THREE.Object3D);void 0===b&&(b=!0);a.name=this.name;a.up.copy(this.up);\na.position.copy(this.position);a.quaternion.copy(this.quaternion);a.scale.copy(this.scale);a.renderDepth=this.renderDepth;a.rotationAutoUpdate=this.rotationAutoUpdate;a.matrix.copy(this.matrix);a.matrixWorld.copy(this.matrixWorld);a.matrixAutoUpdate=this.matrixAutoUpdate;a.matrixWorldNeedsUpdate=this.matrixWorldNeedsUpdate;a.visible=this.visible;a.castShadow=this.castShadow;a.receiveShadow=this.receiveShadow;a.frustumCulled=this.frustumCulled;a.userData=JSON.parse(JSON.stringify(this.userData));if(!0===\nb)for(var c=0;c<this.children.length;c++)a.add(this.children[c].clone());return a}};THREE.EventDispatcher.prototype.apply(THREE.Object3D.prototype);THREE.Object3DIdCount=0;\nTHREE.Projector=function(){function a(){if(q===t){var a=new THREE.RenderableVertex;r.push(a);t++;q++;return a}return r[q++]}function b(){if(p===w){var a=new THREE.RenderableFace;v.push(a);w++;p++;return a}return v[p++]}function c(){if(D===x){var a=new THREE.RenderableLine;A.push(a);x++;D++;return a}return A[D++]}function d(){if(I===y){var a=new THREE.RenderableSprite;z.push(a);y++;I++;return a}return z[I++]}function e(a,b){return a.z!==b.z?b.z-a.z:a.id!==b.id?a.id-b.id:0}function f(a,b){var c=0,d=\n1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(0<=e&&0<=f&&0<=g&&0<=h)return!0;if(0>e&&0>f||0>g&&0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(d<c)return!1;a.lerp(b,c);b.lerp(a,1-d);return!0}var g,h,k=[],l=0,n,q,r=[],t=0,s,p,v=[],w=0,u,D,A=[],x=0,C,I,z=[],y=0,K={objects:[],lights:[],elements:[]},N=new THREE.Vector3,ba=new THREE.Vector3,P=new THREE.Vector3,O=new THREE.Vector3,J=new THREE.Vector4,E=new THREE.Box3(new THREE.Vector3(-1,\n-1,-1),new THREE.Vector3(1,1,1)),Q=new THREE.Box3,L=Array(3),R=new THREE.Matrix4,B=new THREE.Matrix4,S,V=new THREE.Matrix4,W=new THREE.Matrix3,H=new THREE.Frustum,oa=new THREE.Vector4,$=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);B.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);return a.applyProjection(B)};this.unprojectVector=function(){var a=new THREE.Matrix4;return function(b,c){a.getInverse(c.projectionMatrix);B.multiplyMatrices(c.matrixWorld,\na);return b.applyProjection(B)}}();this.pickingRay=function(a,b){a.z=-1;var c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.sub(a).normalize();return new THREE.Raycaster(a,c)};var X=new function(){var d=[],e=[],f=null,g=null,h=new THREE.Matrix3,k=function(a){var b=a.positionWorld,c=a.positionScreen;b.copy(a.position).applyMatrix4(S);c.copy(b).applyMatrix4(B);b=1/c.w;c.x*=b;c.y*=b;c.z*=b;a.visible=-1<=c.x&&1>=c.x&&-1<=c.y&&1>=c.y&&-1<=c.z&&1>=c.z},l=function(a,\nb,c){if(!0===a.visible||!0===b.visible||!0===c.visible)return!0;L[0]=a.positionScreen;L[1]=b.positionScreen;L[2]=c.positionScreen;return E.isIntersectionBox(Q.setFromPoints(L))},q=function(a,b,c){return 0>(c.positionScreen.x-a.positionScreen.x)*(b.positionScreen.y-a.positionScreen.y)-(c.positionScreen.y-a.positionScreen.y)*(b.positionScreen.x-a.positionScreen.x)};return{setObject:function(a){f=a;g=f.material;h.getNormalMatrix(f.matrixWorld);d.length=0;e.length=0},projectVertex:k,checkTriangleVisibility:l,\ncheckBackfaceCulling:q,pushVertex:function(b,c,d){n=a();n.position.set(b,c,d);k(n)},pushNormal:function(a,b,c){d.push(a,b,c)},pushUv:function(a,b){e.push(a,b)},pushLine:function(a,b){var d=r[a],e=r[b];u=c();u.id=f.id;u.v1.copy(d);u.v2.copy(e);u.z=(d.positionScreen.z+e.positionScreen.z)/2;u.material=f.material;K.elements.push(u)},pushTriangle:function(a,c,k){var n=r[a],p=r[c],t=r[k];if(!1!==l(n,p,t)&&(g.side===THREE.DoubleSide||!0===q(n,p,t))){s=b();s.id=f.id;s.v1.copy(n);s.v2.copy(p);s.v3.copy(t);\ns.z=(n.positionScreen.z+p.positionScreen.z+t.positionScreen.z)/3;for(n=0;3>n;n++)p=3*arguments[n],t=s.vertexNormalsModel[n],t.set(d[p],d[p+1],d[p+2]),t.applyMatrix3(h).normalize(),p=2*arguments[n],s.uvs[n].set(e[p],e[p+1]);s.vertexNormalsLength=3;s.material=f.material;K.elements.push(s)}}}};this.projectScene=function(n,t,w,v){I=D=p=0;K.elements.length=0;!0===n.autoUpdate&&n.updateMatrixWorld();void 0===t.parent&&t.updateMatrixWorld();R.copy(t.matrixWorldInverse.getInverse(t.matrixWorld));B.multiplyMatrices(t.projectionMatrix,\nR);H.setFromMatrix(B);h=0;K.objects.length=0;K.lights.length=0;n.traverseVisible(function(a){if(a instanceof THREE.Light)K.lights.push(a);else if(a instanceof THREE.Mesh||a instanceof THREE.Line||a instanceof THREE.Sprite)if(!1===a.frustumCulled||!0===H.intersectsObject(a)){if(h===l){var b=new THREE.RenderableObject;k.push(b);l++;h++;g=b}else g=k[h++];g.id=a.id;g.object=a;null!==a.renderDepth?g.z=a.renderDepth:(O.setFromMatrixPosition(a.matrixWorld),O.applyProjection(B),g.z=O.z);K.objects.push(g)}});\n!0===w&&K.objects.sort(e);n=0;for(w=K.objects.length;n<w;n++){var A=K.objects[n].object,x=A.geometry;X.setObject(A);S=A.matrixWorld;q=0;if(A instanceof THREE.Mesh)if(x instanceof THREE.BufferGeometry){var z=x.attributes,A=x.offsets;if(void 0!==z.position){for(var G=z.position.array,x=0,y=G.length;x<y;x+=3)X.pushVertex(G[x],G[x+1],G[x+2]);if(void 0!==z.normal)for(var L=z.normal.array,x=0,y=L.length;x<y;x+=3)X.pushNormal(L[x],L[x+1],L[x+2]);if(void 0!==z.uv)for(L=z.uv.array,x=0,y=L.length;x<y;x+=2)X.pushUv(L[x],\nL[x+1]);if(void 0!==z.index)if(z=z.index.array,0<A.length)for(n=0;n<A.length;n++)for(y=A[n],G=y.index,x=y.start,y=y.start+y.count;x<y;x+=3)X.pushTriangle(z[x]+G,z[x+1]+G,z[x+2]+G);else for(x=0,y=z.length;x<y;x+=3)X.pushTriangle(z[x],z[x+1],z[x+2]);else for(x=0,y=G.length/3;x<y;x+=3)X.pushTriangle(x,x+1,x+2)}}else{if(x instanceof THREE.Geometry){var Q=x.vertices,y=x.faces,z=x.faceVertexUvs[0];W.getNormalMatrix(S);for(var G=A.material instanceof THREE.MeshFaceMaterial,L=!0===G?A.material:null,E=0,ca=\nQ.length;E<ca;E++){var la=Q[E];X.pushVertex(la.x,la.y,la.z)}Q=0;for(E=y.length;Q<E;Q++){var ca=y[Q],qa=!0===G?L.materials[ca.materialIndex]:A.material;if(void 0!==qa){var ua=qa.side,la=r[ca.a],ja=r[ca.b],Fa=r[ca.c];if(!0===qa.morphTargets){var va=x.morphTargets,Ka=A.morphTargetInfluences,aa=la.position,ra=ja.position,Da=Fa.position;N.set(0,0,0);ba.set(0,0,0);P.set(0,0,0);for(var Qa=0,cb=va.length;Qa<cb;Qa++){var Ga=Ka[Qa];if(0!==Ga){var xa=va[Qa].vertices;N.x+=(xa[ca.a].x-aa.x)*Ga;N.y+=(xa[ca.a].y-\naa.y)*Ga;N.z+=(xa[ca.a].z-aa.z)*Ga;ba.x+=(xa[ca.b].x-ra.x)*Ga;ba.y+=(xa[ca.b].y-ra.y)*Ga;ba.z+=(xa[ca.b].z-ra.z)*Ga;P.x+=(xa[ca.c].x-Da.x)*Ga;P.y+=(xa[ca.c].y-Da.y)*Ga;P.z+=(xa[ca.c].z-Da.z)*Ga}}la.position.add(N);ja.position.add(ba);Fa.position.add(P);X.projectVertex(la);X.projectVertex(ja);X.projectVertex(Fa)}if(!1!==X.checkTriangleVisibility(la,ja,Fa)){va=X.checkBackfaceCulling(la,ja,Fa);if(ua!==THREE.DoubleSide){if(ua===THREE.FrontSide&&!1===va)continue;if(ua===THREE.BackSide&&!0===va)continue}s=\nb();s.id=A.id;s.v1.copy(la);s.v2.copy(ja);s.v3.copy(Fa);s.normalModel.copy(ca.normal);!1!==va||ua!==THREE.BackSide&&ua!==THREE.DoubleSide||s.normalModel.negate();s.normalModel.applyMatrix3(W).normalize();Ka=ca.vertexNormals;aa=0;for(ra=Math.min(Ka.length,3);aa<ra;aa++)Da=s.vertexNormalsModel[aa],Da.copy(Ka[aa]),!1!==va||ua!==THREE.BackSide&&ua!==THREE.DoubleSide||Da.negate(),Da.applyMatrix3(W).normalize();s.vertexNormalsLength=Ka.length;ua=z[Q];if(void 0!==ua)for(va=0;3>va;va++)s.uvs[va].copy(ua[va]);\ns.color=ca.color;s.material=qa;s.z=(la.positionScreen.z+ja.positionScreen.z+Fa.positionScreen.z)/3;K.elements.push(s)}}}}}else if(A instanceof THREE.Line)if(x instanceof THREE.BufferGeometry){if(z=x.attributes,void 0!==z.position){G=z.position.array;x=0;for(y=G.length;x<y;x+=3)X.pushVertex(G[x],G[x+1],G[x+2]);if(void 0!==z.index)for(z=z.index.array,x=0,y=z.length;x<y;x+=2)X.pushLine(z[x],z[x+1]);else for(z=A.type===THREE.LinePieces?2:1,x=0,y=G.length/3-1;x<y;x+=z)X.pushLine(x,x+1)}}else{if(x instanceof\nTHREE.Geometry&&(V.multiplyMatrices(B,S),Q=A.geometry.vertices,0!==Q.length))for(la=a(),la.positionScreen.copy(Q[0]).applyMatrix4(V),z=A.type===THREE.LinePieces?2:1,E=1,ca=Q.length;E<ca;E++)la=a(),la.positionScreen.copy(Q[E]).applyMatrix4(V),0<(E+1)%z||(ja=r[q-2],oa.copy(la.positionScreen),$.copy(ja.positionScreen),!0===f(oa,$)&&(oa.multiplyScalar(1/oa.w),$.multiplyScalar(1/$.w),u=c(),u.id=A.id,u.v1.positionScreen.copy(oa),u.v2.positionScreen.copy($),u.z=Math.max(oa.z,$.z),u.material=A.material,A.material.vertexColors===\nTHREE.VertexColors&&(u.vertexColors[0].copy(A.geometry.colors[E]),u.vertexColors[1].copy(A.geometry.colors[E-1])),K.elements.push(u)))}else A instanceof THREE.Sprite&&(J.set(S.elements[12],S.elements[13],S.elements[14],1),J.applyMatrix4(B),x=1/J.w,J.z*=x,-1<=J.z&&1>=J.z&&(C=d(),C.id=A.id,C.x=J.x*x,C.y=J.y*x,C.z=J.z,C.object=A,C.rotation=A.rotation,C.scale.x=A.scale.x*Math.abs(C.x-(J.x+t.projectionMatrix.elements[0])/(J.w+t.projectionMatrix.elements[12])),C.scale.y=A.scale.y*Math.abs(C.y-(J.y+t.projectionMatrix.elements[5])/\n(J.w+t.projectionMatrix.elements[13])),C.material=A.material,K.elements.push(C)))}!0===v&&K.elements.sort(e);return K}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0};\nTHREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.materialIndex=this.materialIndex;for(var b=0,c=this.vertexNormals.length;b<c;b++)a.vertexNormals[b]=this.vertexNormals[b].clone();b=0;for(c=this.vertexColors.length;b<c;b++)a.vertexColors[b]=this.vertexColors[b].clone();b=0;for(c=this.vertexTangents.length;b<c;b++)a.vertexTangents[b]=this.vertexTangents[b].clone();return a}};\nTHREE.Face4=function(a,b,c,d,e,f,g){console.warn(\"THREE.Face4 has been removed. A THREE.Face3 will be created instead.\");return new THREE.Face3(a,b,c,e,f,g)};THREE.BufferAttribute=function(a,b){this.array=a;this.itemSize=b};\nTHREE.BufferAttribute.prototype={constructor:THREE.BufferAttribute,get length(){return this.array.length},set:function(a){this.array.set(a);return this},setX:function(a,b){this.array[a*this.itemSize]=b;return this},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a]=b;this.array[a+1]=\nc;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this}};THREE.Int8Attribute=function(a,b){console.warn(\"THREE.Int8Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};\nTHREE.Uint8Attribute=function(a,b){console.warn(\"THREE.Uint8Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};THREE.Uint8ClampedAttribute=function(a,b){console.warn(\"THREE.Uint8ClampedAttribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};\nTHREE.Int16Attribute=function(a,b){console.warn(\"THREE.Int16Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};THREE.Uint16Attribute=function(a,b){console.warn(\"THREE.Uint16Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};\nTHREE.Int32Attribute=function(a,b){console.warn(\"THREE.Int32Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};THREE.Uint32Attribute=function(a,b){console.warn(\"THREE.Uint32Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};\nTHREE.Float32Attribute=function(a,b){console.warn(\"THREE.Float32Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};THREE.Float64Attribute=function(a,b){console.warn(\"THREE.Float64Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead.\");return new THREE.BufferAttribute(a,b)};\nTHREE.BufferGeometry=function(){this.id=THREE.GeometryIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.attributes={};this.offsets=this.drawcalls=[];this.boundingSphere=this.boundingBox=null};\nTHREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,addAttribute:function(a,b,c){!1===b instanceof THREE.BufferAttribute?(console.warn(\"THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).\"),this.attributes[a]={array:b,itemSize:c}):this.attributes[a]=b},getAttribute:function(a){return this.attributes[a]},addDrawCall:function(a,b,c){this.drawcalls.push({start:a,count:b,index:void 0!==c?c:0})},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToVector3Array(b.array),\nb.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new THREE.Matrix3).getNormalMatrix(a).applyToVector3Array(b.array),b.needsUpdate=!0)},fromGeometry:function(a,b){b=b||{vertexColors:THREE.NoColors};var c=a.vertices,d=a.faces,e=a.faceVertexUvs,f=b.vertexColors,g=0<e[0].length,h=3==d[0].vertexNormals.length,k=new Float32Array(9*d.length);this.addAttribute(\"position\",new THREE.BufferAttribute(k,3));var l=new Float32Array(9*d.length);this.addAttribute(\"normal\",new THREE.BufferAttribute(l,3));if(f!==\nTHREE.NoColors){var n=new Float32Array(9*d.length);this.addAttribute(\"color\",new THREE.BufferAttribute(n,3))}if(!0===g){var q=new Float32Array(6*d.length);this.addAttribute(\"uvs\",new THREE.BufferAttribute(q,2))}for(var r=0,t=0,s=0;r<d.length;r++,t+=6,s+=9){var p=d[r],v=c[p.a],w=c[p.b],u=c[p.c];k[s]=v.x;k[s+1]=v.y;k[s+2]=v.z;k[s+3]=w.x;k[s+4]=w.y;k[s+5]=w.z;k[s+6]=u.x;k[s+7]=u.y;k[s+8]=u.z;!0===h?(v=p.vertexNormals[0],w=p.vertexNormals[1],u=p.vertexNormals[2],l[s]=v.x,l[s+1]=v.y,l[s+2]=v.z,l[s+3]=\nw.x,l[s+4]=w.y,l[s+5]=w.z,l[s+6]=u.x,l[s+7]=u.y,l[s+8]=u.z):(v=p.normal,l[s]=v.x,l[s+1]=v.y,l[s+2]=v.z,l[s+3]=v.x,l[s+4]=v.y,l[s+5]=v.z,l[s+6]=v.x,l[s+7]=v.y,l[s+8]=v.z);f===THREE.FaceColors?(p=p.color,n[s]=p.r,n[s+1]=p.g,n[s+2]=p.b,n[s+3]=p.r,n[s+4]=p.g,n[s+5]=p.b,n[s+6]=p.r,n[s+7]=p.g,n[s+8]=p.b):f===THREE.VertexColors&&(v=p.vertexColors[0],w=p.vertexColors[1],p=p.vertexColors[2],n[s]=v.r,n[s+1]=v.g,n[s+2]=v.b,n[s+3]=w.r,n[s+4]=w.g,n[s+5]=w.b,n[s+6]=p.r,n[s+7]=p.g,n[s+8]=p.b);!0===g&&(p=e[0][r][0],\nv=e[0][r][1],w=e[0][r][2],q[t]=p.x,q[t+1]=p.y,q[t+2]=v.x,q[t+3]=v.y,q[t+4]=w.x,q[t+5]=w.y)}this.computeBoundingSphere();return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var a=this.attributes.position.array;if(a){var b=this.boundingBox;3<=a.length&&(b.min.x=b.max.x=a[0],b.min.y=b.max.y=a[1],b.min.z=b.max.z=a[2]);for(var c=3,d=a.length;c<d;c+=3){var e=a[c],f=a[c+1],g=a[c+2];e<b.min.x?b.min.x=e:e>b.max.x&&(b.max.x=e);f<b.min.y?b.min.y=f:f>b.max.y&&\n(b.max.y=f);g<b.min.z?b.min.z=g:g>b.max.z&&(b.max.z=g)}}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0);(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.')},computeBoundingSphere:function(){var a=new THREE.Box3,b=new THREE.Vector3;return function(){null===this.boundingSphere&&\n(this.boundingSphere=new THREE.Sphere);var c=this.attributes.position.array;if(c){a.makeEmpty();for(var d=this.boundingSphere.center,e=0,f=c.length;e<f;e+=3)b.set(c[e],c[e+1],c[e+2]),a.expandByPoint(b);a.center(d);for(var g=0,e=0,f=c.length;e<f;e+=3)b.set(c[e],c[e+1],c[e+2]),g=Math.max(g,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(g);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.')}}}(),\ncomputeFaceNormals:function(){},computeVertexNormals:function(){if(this.attributes.position){var a,b,c,d;a=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(a)};else for(a=0,b=this.attributes.normal.array.length;a<b;a++)this.attributes.normal.array[a]=0;var e=this.attributes.position.array,f=this.attributes.normal.array,g,h,k,l,n,q,r=new THREE.Vector3,t=new THREE.Vector3,s=new THREE.Vector3,p=new THREE.Vector3,v=new THREE.Vector3;\nif(this.attributes.index){var w=this.attributes.index.array,u=0<this.offsets.length?this.offsets:[{start:0,count:w.length,index:0}];c=0;for(d=u.length;c<d;++c){b=u[c].start;g=u[c].count;var D=u[c].index;a=b;for(b+=g;a<b;a+=3)g=D+w[a],h=D+w[a+1],k=D+w[a+2],l=e[3*g],n=e[3*g+1],q=e[3*g+2],r.set(l,n,q),l=e[3*h],n=e[3*h+1],q=e[3*h+2],t.set(l,n,q),l=e[3*k],n=e[3*k+1],q=e[3*k+2],s.set(l,n,q),p.subVectors(s,t),v.subVectors(r,t),p.cross(v),f[3*g]+=p.x,f[3*g+1]+=p.y,f[3*g+2]+=p.z,f[3*h]+=p.x,f[3*h+1]+=p.y,\nf[3*h+2]+=p.z,f[3*k]+=p.x,f[3*k+1]+=p.y,f[3*k+2]+=p.z}}else for(a=0,b=e.length;a<b;a+=9)l=e[a],n=e[a+1],q=e[a+2],r.set(l,n,q),l=e[a+3],n=e[a+4],q=e[a+5],t.set(l,n,q),l=e[a+6],n=e[a+7],q=e[a+8],s.set(l,n,q),p.subVectors(s,t),v.subVectors(r,t),p.cross(v),f[a]=p.x,f[a+1]=p.y,f[a+2]=p.z,f[a+3]=p.x,f[a+4]=p.y,f[a+5]=p.z,f[a+6]=p.x,f[a+7]=p.y,f[a+8]=p.z;this.normalizeNormals();this.normalsNeedUpdate=!0}},computeTangents:function(){function a(a,b,c){q=d[3*a];r=d[3*a+1];t=d[3*a+2];s=d[3*b];p=d[3*b+1];v=d[3*\nb+2];w=d[3*c];u=d[3*c+1];D=d[3*c+2];A=f[2*a];x=f[2*a+1];C=f[2*b];I=f[2*b+1];z=f[2*c];y=f[2*c+1];K=s-q;N=w-q;ba=p-r;P=u-r;O=v-t;J=D-t;E=C-A;Q=z-A;L=I-x;R=y-x;B=1/(E*R-Q*L);S.set((R*K-L*N)*B,(R*ba-L*P)*B,(R*O-L*J)*B);V.set((E*N-Q*K)*B,(E*P-Q*ba)*B,(E*J-Q*O)*B);k[a].add(S);k[b].add(S);k[c].add(S);l[a].add(V);l[b].add(V);l[c].add(V)}function b(a){za.x=e[3*a];za.y=e[3*a+1];za.z=e[3*a+2];Oa.copy(za);G=k[a];Ea.copy(G);Ea.sub(za.multiplyScalar(za.dot(G))).normalize();Aa.crossVectors(Oa,G);Ba=Aa.dot(l[a]);\nPa=0>Ba?-1:1;h[4*a]=Ea.x;h[4*a+1]=Ea.y;h[4*a+2]=Ea.z;h[4*a+3]=Pa}if(void 0===this.attributes.index||void 0===this.attributes.position||void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn(\"Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()\");else{var c=this.attributes.index.array,d=this.attributes.position.array,e=this.attributes.normal.array,f=this.attributes.uv.array,g=d.length/3;void 0===this.attributes.tangent&&(this.attributes.tangent=\n{itemSize:4,array:new Float32Array(4*g)});for(var h=this.attributes.tangent.array,k=[],l=[],n=0;n<g;n++)k[n]=new THREE.Vector3,l[n]=new THREE.Vector3;var q,r,t,s,p,v,w,u,D,A,x,C,I,z,y,K,N,ba,P,O,J,E,Q,L,R,B,S=new THREE.Vector3,V=new THREE.Vector3,W,H,oa,$,X,T=this.offsets,n=0;for(H=T.length;n<H;++n){W=T[n].start;oa=T[n].count;var ya=T[n].index,g=W;for(W+=oa;g<W;g+=3)oa=ya+c[g],$=ya+c[g+1],X=ya+c[g+2],a(oa,$,X)}var Ea=new THREE.Vector3,Aa=new THREE.Vector3,za=new THREE.Vector3,Oa=new THREE.Vector3,\nPa,G,Ba,n=0;for(H=T.length;n<H;++n)for(W=T[n].start,oa=T[n].count,ya=T[n].index,g=W,W+=oa;g<W;g+=3)oa=ya+c[g],$=ya+c[g+1],X=ya+c[g+2],b(oa),b($),b(X)}},computeOffsets:function(a){var b=a;void 0===a&&(b=65535);Date.now();a=this.attributes.index.array;for(var c=this.attributes.position.array,d=a.length/3,e=new Uint16Array(a.length),f=0,g=0,h=[{start:0,count:0,index:0}],k=h[0],l=0,n=0,q=new Int32Array(6),r=new Int32Array(c.length),t=new Int32Array(c.length),s=0;s<c.length;s++)r[s]=-1,t[s]=-1;for(c=0;c<\nd;c++){for(var p=n=0;3>p;p++)s=a[3*c+p],-1==r[s]?(q[2*p]=s,q[2*p+1]=-1,n++):r[s]<k.index?(q[2*p]=s,q[2*p+1]=-1,l++):(q[2*p]=s,q[2*p+1]=r[s]);if(g+n>k.index+b)for(k={start:f,count:0,index:g},h.push(k),n=0;6>n;n+=2)p=q[n+1],-1<p&&p<k.index&&(q[n+1]=-1);for(n=0;6>n;n+=2)s=q[n],p=q[n+1],-1===p&&(p=g++),r[s]=p,t[p]=s,e[f++]=p-k.index,k.count++}this.reorderBuffers(e,t,g);return this.offsets=h},merge:function(){console.log(\"BufferGeometry.merge(): TODO\")},normalizeNormals:function(){for(var a=this.attributes.normal.array,\nb,c,d,e=0,f=a.length;e<f;e+=3)b=a[e],c=a[e+1],d=a[e+2],b=1/Math.sqrt(b*b+c*c+d*d),a[e]*=b,a[e+1]*=b,a[e+2]*=b},reorderBuffers:function(a,b,c){var d={},e=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],f;for(f in this.attributes)if(\"index\"!=f)for(var g=this.attributes[f].array,h=0,k=e.length;h<k;h++){var l=e[h];if(g instanceof l){d[f]=new l(this.attributes[f].itemSize*c);break}}for(e=0;e<c;e++)for(f in g=b[e],this.attributes)if(\"index\"!=\nf)for(var h=this.attributes[f].array,k=this.attributes[f].itemSize,l=d[f],n=0;n<k;n++)l[e*k+n]=h[g*k+n];this.attributes.index.array=a;for(f in this.attributes)\"index\"!=f&&(this.attributes[f].array=d[f],this.attributes[f].numItems=this.attributes[f].itemSize*c)},clone:function(){var a=new THREE.BufferGeometry,b=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],c;for(c in this.attributes){for(var d=this.attributes[c],e=d.array,f={itemSize:d.itemSize,\narray:null},d=0,g=b.length;d<g;d++){var h=b[d];if(e instanceof h){f.array=new h(e);break}}a.attributes[c]=f}d=0;for(g=this.offsets.length;d<g;d++)b=this.offsets[d],a.offsets.push({start:b.start,index:b.index,count:b.count});return a},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype);\nTHREE.Geometry=function(){this.id=THREE.GeometryIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.hasTangents=!1;this.dynamic=!0;this.groupsNeedUpdate=this.buffersNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.tangentsNeedUpdate=this.normalsNeedUpdate=\nthis.uvsNeedUpdate=this.elementsNeedUpdate=this.verticesNeedUpdate=!1};\nTHREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){for(var b=(new THREE.Matrix3).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}this.boundingBox instanceof THREE.Box3&&this.computeBoundingBox();this.boundingSphere instanceof THREE.Sphere&&this.computeBoundingSphere()},\ncenter:function(){this.computeBoundingBox();var a=new THREE.Vector3;a.addVectors(this.boundingBox.min,this.boundingBox.max);a.multiplyScalar(-.5);this.applyMatrix((new THREE.Matrix4).makeTranslation(a.x,a.y,a.z));this.computeBoundingBox();return a},computeFaceNormals:function(){for(var a=new THREE.Vector3,b=new THREE.Vector3,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},\ncomputeVertexNormals:function(a){var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new THREE.Vector3;if(a){var e,f,g,h=new THREE.Vector3,k=new THREE.Vector3;new THREE.Vector3;new THREE.Vector3;new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],f=this.vertices[c.b],g=this.vertices[c.c],h.subVectors(g,f),k.subVectors(e,f),h.cross(k),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(a=0,b=this.faces.length;a<b;a++)c=this.faces[a],\nd[c.a].add(c.normal),d[c.b].add(c.normal),d[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],c.vertexNormals[0]=d[c.a].clone(),c.vertexNormals[1]=d[c.b].clone(),c.vertexNormals[2]=d[c.c].clone()},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||\n(e.__originalVertexNormals=[]),a=0,b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone();var f=new THREE.Geometry;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=[];e=this.morphNormals[a].faceNormals;var g=this.morphNormals[a].vertexNormals,h,k;c=\n0;for(d=this.faces.length;c<d;c++)h=new THREE.Vector3,k={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3},e.push(h),g.push(k)}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(e.normal),k.a.copy(e.vertexNormals[0]),k.b.copy(e.vertexNormals[1]),k.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=\ne.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeTangents:function(){var a,b,c,d,e,f,g,h,k,l,n,q,r,t,s,p,v,w=[],u=[];c=new THREE.Vector3;var D=new THREE.Vector3,A=new THREE.Vector3,x=new THREE.Vector3,C=new THREE.Vector3;a=0;for(b=this.vertices.length;a<b;a++)w[a]=new THREE.Vector3,u[a]=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++)e=this.faces[a],f=this.faceVertexUvs[0][a],d=e.a,v=e.b,e=e.c,g=this.vertices[d],h=this.vertices[v],k=this.vertices[e],l=f[0],n=f[1],q=f[2],\nf=h.x-g.x,r=k.x-g.x,t=h.y-g.y,s=k.y-g.y,h=h.z-g.z,g=k.z-g.z,k=n.x-l.x,p=q.x-l.x,n=n.y-l.y,l=q.y-l.y,q=1/(k*l-p*n),c.set((l*f-n*r)*q,(l*t-n*s)*q,(l*h-n*g)*q),D.set((k*r-p*f)*q,(k*s-p*t)*q,(k*g-p*h)*q),w[d].add(c),w[v].add(c),w[e].add(c),u[d].add(D),u[v].add(D),u[e].add(D);D=[\"a\",\"b\",\"c\",\"d\"];a=0;for(b=this.faces.length;a<b;a++)for(e=this.faces[a],c=0;c<Math.min(e.vertexNormals.length,3);c++)C.copy(e.vertexNormals[c]),d=e[D[c]],v=w[d],A.copy(v),A.sub(C.multiplyScalar(C.dot(v))).normalize(),x.crossVectors(e.vertexNormals[c],\nv),d=x.dot(u[d]),d=0>d?-1:1,e.vertexTangents[c]=new THREE.Vector4(A.x,A.y,A.z,d);this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);this.boundingSphere.setFromPoints(this.vertices)},\nmerge:function(a,b,c){if(!1===a instanceof THREE.Geometry)console.error(\"THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.\",a);else{var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,l=this.faceVertexUvs[0];a=a.faceVertexUvs[0];void 0===c&&(c=0);void 0!==b&&(d=(new THREE.Matrix3).getNormalMatrix(b));for(var n=0,q=g.length;n<q;n++){var r=g[n].clone();void 0!==b&&r.applyMatrix4(b);f.push(r)}n=0;for(q=k.length;n<q;n++){var g=k[n],t,s=g.vertexNormals,p=\ng.vertexColors,r=new THREE.Face3(g.a+e,g.b+e,g.c+e);r.normal.copy(g.normal);void 0!==d&&r.normal.applyMatrix3(d).normalize();b=0;for(f=s.length;b<f;b++)t=s[b].clone(),void 0!==d&&t.applyMatrix3(d).normalize(),r.vertexNormals.push(t);r.color.copy(g.color);b=0;for(f=p.length;b<f;b++)t=p[b],r.vertexColors.push(t.clone());r.materialIndex=g.materialIndex+c;h.push(r)}n=0;for(q=a.length;n<q;n++)if(c=a[n],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(new THREE.Vector2(c[b].x,c[b].y));l.push(d)}}},mergeVertices:function(){var a=\n{},b=[],c=[],d,e=Math.pow(10,4),f,g;f=0;for(g=this.vertices.length;f<g;f++)d=this.vertices[f],d=Math.round(d.x*e)+\"_\"+Math.round(d.y*e)+\"_\"+Math.round(d.z*e),void 0===a[d]?(a[d]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[d]];a=[];f=0;for(g=this.faces.length;f<g;f++)for(e=this.faces[f],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]==e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c<g;c++)this.faceVertexUvs[c].splice(e,\n1);f=this.vertices.length-b.length;this.vertices=b;return f},makeGroups:function(){var a=0;return function(b,c){var d,e,f,g,h={},k,l=this.morphTargets.length,n=this.morphNormals.length;this.geometryGroups={};this.geometryGroupsList=[];d=0;for(e=this.faces.length;d<e;d++)f=this.faces[d],f=b?f.materialIndex:0,f in h||(h[f]={hash:f,counter:0}),g=h[f].hash+\"_\"+h[f].counter,g in this.geometryGroups||(k={id:a++,faces3:[],materialIndex:f,vertices:0,numMorphTargets:l,numMorphNormals:n},this.geometryGroups[g]=\nk,this.geometryGroupsList.push(k)),this.geometryGroups[g].vertices+3>c&&(h[f].counter+=1,g=h[f].hash+\"_\"+h[f].counter,g in this.geometryGroups||(k={id:a++,faces3:[],materialIndex:f,vertices:0,numMorphTargets:l,numMorphNormals:n},this.geometryGroups[g]=k,this.geometryGroupsList.push(k))),this.geometryGroups[g].faces3.push(d),this.geometryGroups[g].vertices+=3}}(),clone:function(){for(var a=new THREE.Geometry,b=this.vertices,c=0,d=b.length;c<d;c++)a.vertices.push(b[c].clone());b=this.faces;c=0;for(d=\nb.length;c<d;c++)a.faces.push(b[c].clone());b=this.faceVertexUvs[0];c=0;for(d=b.length;c<d;c++){for(var e=b[c],f=[],g=0,h=e.length;g<h;g++)f.push(new THREE.Vector2(e[g].x,e[g].y));a.faceVertexUvs[0].push(f)}return a},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype);THREE.GeometryIdCount=0;THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4};\nTHREE.Camera.prototype=Object.create(THREE.Object3D.prototype);THREE.Camera.prototype.lookAt=function(){var a=new THREE.Matrix4;return function(b){a.lookAt(this.position,b,this.up);this.quaternion.setFromRotationMatrix(a)}}();THREE.Camera.prototype.clone=function(a){void 0===a&&(a=new THREE.Camera);THREE.Object3D.prototype.clone.call(this,a);a.matrixWorldInverse.copy(this.matrixWorldInverse);a.projectionMatrix.copy(this.projectionMatrix);return a};\nTHREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90,\n1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var k=new THREE.PerspectiveCamera(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new THREE.Vector3(0,0,-1));this.add(k);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,r=c.generateMipmaps;c.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=\n2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=r;c.activeCubeFace=5;a.render(b,k,c)}};THREE.CubeCamera.prototype=Object.create(THREE.Object3D.prototype);THREE.OrthographicCamera=function(a,b,c,d,e,f){THREE.Camera.call(this);this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=Object.create(THREE.Camera.prototype);\nTHREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};THREE.OrthographicCamera.prototype.clone=function(){var a=new THREE.OrthographicCamera;THREE.Camera.prototype.clone.call(this,a);a.left=this.left;a.right=this.right;a.top=this.top;a.bottom=this.bottom;a.near=this.near;a.far=this.far;return a};\nTHREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.fov=void 0!==a?a:50;this.aspect=void 0!==b?b:1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=Object.create(THREE.Camera.prototype);THREE.PerspectiveCamera.prototype.setLens=function(a,b){void 0===b&&(b=24);this.fov=2*THREE.Math.radToDeg(Math.atan(b/(2*a)));this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,f){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=f;this.updateProjectionMatrix()};\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var a=this.fullWidth/this.fullHeight,b=Math.tan(THREE.Math.degToRad(.5*this.fov))*this.near,c=-b,d=a*c,a=Math.abs(a*b-d),c=Math.abs(b-c);this.projectionMatrix.makeFrustum(d+this.x*a/this.fullWidth,d+(this.x+this.width)*a/this.fullWidth,b-(this.y+this.height)*c/this.fullHeight,b-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};\nTHREE.PerspectiveCamera.prototype.clone=function(){var a=new THREE.PerspectiveCamera;THREE.Camera.prototype.clone.call(this,a);a.fov=this.fov;a.aspect=this.aspect;a.near=this.near;a.far=this.far;return a};THREE.Light=function(a){THREE.Object3D.call(this);this.color=new THREE.Color(a)};THREE.Light.prototype=Object.create(THREE.Object3D.prototype);THREE.Light.prototype.clone=function(a){void 0===a&&(a=new THREE.Light);THREE.Object3D.prototype.clone.call(this,a);a.color.copy(this.color);return a};\nTHREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=Object.create(THREE.Light.prototype);THREE.AmbientLight.prototype.clone=function(){var a=new THREE.AmbientLight;THREE.Light.prototype.clone.call(this,a);return a};\nTHREE.AreaLight=function(a,b){THREE.Light.call(this,a);this.normal=new THREE.Vector3(0,-1,0);this.right=new THREE.Vector3(1,0,0);this.intensity=void 0!==b?b:1;this.height=this.width=1;this.constantAttenuation=1.5;this.linearAttenuation=.5;this.quadraticAttenuation=.1};THREE.AreaLight.prototype=Object.create(THREE.Light.prototype);\nTHREE.DirectionalLight=function(a,b){THREE.Light.call(this,a);this.position.set(0,1,0);this.target=new THREE.Object3D;this.intensity=void 0!==b?b:1;this.onlyShadow=this.castShadow=!1;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=!1;this.shadowBias=0;this.shadowDarkness=.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowCascade=!1;this.shadowCascadeOffset=new THREE.Vector3(0,\n0,-1E3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,.99,.998];this.shadowCascadeFarZ=[.99,.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=Object.create(THREE.Light.prototype);\nTHREE.DirectionalLight.prototype.clone=function(){var a=new THREE.DirectionalLight;THREE.Light.prototype.clone.call(this,a);a.target=this.target.clone();a.intensity=this.intensity;a.castShadow=this.castShadow;a.onlyShadow=this.onlyShadow;a.shadowCameraNear=this.shadowCameraNear;a.shadowCameraFar=this.shadowCameraFar;a.shadowCameraLeft=this.shadowCameraLeft;a.shadowCameraRight=this.shadowCameraRight;a.shadowCameraTop=this.shadowCameraTop;a.shadowCameraBottom=this.shadowCameraBottom;a.shadowCameraVisible=\nthis.shadowCameraVisible;a.shadowBias=this.shadowBias;a.shadowDarkness=this.shadowDarkness;a.shadowMapWidth=this.shadowMapWidth;a.shadowMapHeight=this.shadowMapHeight;a.shadowCascade=this.shadowCascade;a.shadowCascadeOffset.copy(this.shadowCascadeOffset);a.shadowCascadeCount=this.shadowCascadeCount;a.shadowCascadeBias=this.shadowCascadeBias.slice(0);a.shadowCascadeWidth=this.shadowCascadeWidth.slice(0);a.shadowCascadeHeight=this.shadowCascadeHeight.slice(0);a.shadowCascadeNearZ=this.shadowCascadeNearZ.slice(0);\na.shadowCascadeFarZ=this.shadowCascadeFarZ.slice(0);return a};THREE.HemisphereLight=function(a,b,c){THREE.Light.call(this,a);this.position.set(0,100,0);this.groundColor=new THREE.Color(b);this.intensity=void 0!==c?c:1};THREE.HemisphereLight.prototype=Object.create(THREE.Light.prototype);THREE.HemisphereLight.prototype.clone=function(){var a=new THREE.HemisphereLight;THREE.Light.prototype.clone.call(this,a);a.groundColor.copy(this.groundColor);a.intensity=this.intensity;return a};\nTHREE.PointLight=function(a,b,c){THREE.Light.call(this,a);this.intensity=void 0!==b?b:1;this.distance=void 0!==c?c:0};THREE.PointLight.prototype=Object.create(THREE.Light.prototype);THREE.PointLight.prototype.clone=function(){var a=new THREE.PointLight;THREE.Light.prototype.clone.call(this,a);a.intensity=this.intensity;a.distance=this.distance;return a};\nTHREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position.set(0,1,0);this.target=new THREE.Object3D;this.intensity=void 0!==b?b:1;this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.exponent=void 0!==e?e:10;this.onlyShadow=this.castShadow=!1;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=!1;this.shadowBias=0;this.shadowDarkness=.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=this.shadowCamera=this.shadowMapSize=\nthis.shadowMap=null};THREE.SpotLight.prototype=Object.create(THREE.Light.prototype);\nTHREE.SpotLight.prototype.clone=function(){var a=new THREE.SpotLight;THREE.Light.prototype.clone.call(this,a);a.target=this.target.clone();a.intensity=this.intensity;a.distance=this.distance;a.angle=this.angle;a.exponent=this.exponent;a.castShadow=this.castShadow;a.onlyShadow=this.onlyShadow;a.shadowCameraNear=this.shadowCameraNear;a.shadowCameraFar=this.shadowCameraFar;a.shadowCameraFov=this.shadowCameraFov;a.shadowCameraVisible=this.shadowCameraVisible;a.shadowBias=this.shadowBias;a.shadowDarkness=\nthis.shadowDarkness;a.shadowMapWidth=this.shadowMapWidth;a.shadowMapHeight=this.shadowMapHeight;return a};THREE.Cache=function(){this.files={}};THREE.Cache.prototype={constructor:THREE.Cache,add:function(a,b){this.files[a]=b},get:function(a){return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}};\nTHREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.imageLoader=new THREE.ImageLoader;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};\nTHREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:void 0,addStatusElement:function(){var a=document.createElement(\"div\");a.style.position=\"absolute\";a.style.right=\"0px\";a.style.top=\"0px\";a.style.fontSize=\"0.8em\";a.style.textAlign=\"left\";a.style.background=\"rgba(0,0,0,0.25)\";a.style.color=\"#fff\";a.style.width=\"120px\";a.style.padding=\"0.5em 0.5em 0.5em 0.5em\";a.style.zIndex=1E3;a.innerHTML=\"Loading ...\";return a},updateProgress:function(a){var b=\"Loaded \",b=a.total?b+((100*a.loaded/a.total).toFixed(0)+\n\"%\"):b+((a.loaded/1024).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split(\"/\");if(1===a.length)return\"./\";a.pop();return a.join(\"/\")+\"/\"},initMaterials:function(a,b){for(var c=[],d=0;d<a.length;++d)c[d]=this.createMaterial(a[d],b);return c},needsTangents:function(a){for(var b=0,c=a.length;b<c;b++)if(a[b]instanceof THREE.ShaderMaterial)return!0;return!1},createMaterial:function(a,b){function c(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))}function d(a,\nd,e,g,h,k,p){var v=b+e,w,u=THREE.Loader.Handlers.get(v);null!==u?w=u.load(v):(w=new THREE.Texture,u=f.imageLoader,u.crossOrigin=f.crossOrigin,u.load(v,function(a){if(!1===THREE.Math.isPowerOfTwo(a.width)||!1===THREE.Math.isPowerOfTwo(a.height)){var b=c(a.width),d=c(a.height),e=document.createElement(\"canvas\");e.width=b;e.height=d;e.getContext(\"2d\").drawImage(a,0,0,b,d);w.image=e}else w.image=a;w.needsUpdate=!0}));w.sourceFile=e;g&&(w.repeat.set(g[0],g[1]),1!==g[0]&&(w.wrapS=THREE.RepeatWrapping),\n1!==g[1]&&(w.wrapT=THREE.RepeatWrapping));h&&w.offset.set(h[0],h[1]);k&&(e={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping},void 0!==e[k[0]]&&(w.wrapS=e[k[0]]),void 0!==e[k[1]]&&(w.wrapT=e[k[1]]));p&&(w.anisotropy=p);a[d]=w}function e(a){return(255*a[0]<<16)+(255*a[1]<<8)+255*a[2]}var f=this,g=\"MeshLambertMaterial\",h={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,bumpMap:null,wireframe:!1};if(a.shading){var k=a.shading.toLowerCase();\"phong\"===k?g=\"MeshPhongMaterial\":\n\"basic\"===k&&(g=\"MeshBasicMaterial\")}void 0!==a.blending&&void 0!==THREE[a.blending]&&(h.blending=THREE[a.blending]);if(void 0!==a.transparent||1>a.opacity)h.transparent=a.transparent;void 0!==a.depthTest&&(h.depthTest=a.depthTest);void 0!==a.depthWrite&&(h.depthWrite=a.depthWrite);void 0!==a.visible&&(h.visible=a.visible);void 0!==a.flipSided&&(h.side=THREE.BackSide);void 0!==a.doubleSided&&(h.side=THREE.DoubleSide);void 0!==a.wireframe&&(h.wireframe=a.wireframe);void 0!==a.vertexColors&&(\"face\"===\na.vertexColors?h.vertexColors=THREE.FaceColors:a.vertexColors&&(h.vertexColors=THREE.VertexColors));a.colorDiffuse?h.color=e(a.colorDiffuse):a.DbgColor&&(h.color=a.DbgColor);a.colorSpecular&&(h.specular=e(a.colorSpecular));a.colorAmbient&&(h.ambient=e(a.colorAmbient));a.colorEmissive&&(h.emissive=e(a.colorEmissive));a.transparency&&(h.opacity=a.transparency);a.specularCoef&&(h.shininess=a.specularCoef);a.mapDiffuse&&b&&d(h,\"map\",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,\na.mapDiffuseAnisotropy);a.mapLight&&b&&d(h,\"lightMap\",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&d(h,\"bumpMap\",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&d(h,\"normalMap\",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&d(h,\"specularMap\",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap,a.mapSpecularAnisotropy);a.mapAlpha&&\nb&&d(h,\"alphaMap\",a.mapAlpha,a.mapAlphaRepeat,a.mapAlphaOffset,a.mapAlphaWrap,a.mapAlphaAnisotropy);a.mapBumpScale&&(h.bumpScale=a.mapBumpScale);a.mapNormal?(g=THREE.ShaderLib.normalmap,k=THREE.UniformsUtils.clone(g.uniforms),k.tNormal.value=h.normalMap,a.mapNormalFactor&&k.uNormalScale.value.set(a.mapNormalFactor,a.mapNormalFactor),h.map&&(k.tDiffuse.value=h.map,k.enableDiffuse.value=!0),h.specularMap&&(k.tSpecular.value=h.specularMap,k.enableSpecular.value=!0),h.lightMap&&(k.tAO.value=h.lightMap,\nk.enableAO.value=!0),k.diffuse.value.setHex(h.color),k.specular.value.setHex(h.specular),k.ambient.value.setHex(h.ambient),k.shininess.value=h.shininess,void 0!==h.opacity&&(k.opacity.value=h.opacity),g=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:k,lights:!0,fog:!0}),h.transparent&&(g.transparent=!0)):g=new THREE[g](h);void 0!==a.DbgName&&(g.name=a.DbgName);return g}};\nTHREE.Loader.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=0,c=this.handlers.length;b<c;b+=2){var d=this.handlers[b+1];if(this.handlers[b].test(a))return d}return null}};THREE.XHRLoader=function(a){this.cache=new THREE.Cache;this.manager=void 0!==a?a:THREE.DefaultLoadingManager};\nTHREE.XHRLoader.prototype={constructor:THREE.XHRLoader,load:function(a,b,c,d){var e=this,f=e.cache.get(a);void 0!==f?b&&b(f):TiddlyWiki&&a.match(/^tw:/)?(f=TiddlyWiki.load(a),e.manager.itemStart(a),void 0!==b&&(e.cache.add(a,f),b(f),e.manager.itemEnd(f)),hack.log(\"url: \"+a+\": loaded\",hack.loader,\"THREE.XHRLoader.load\")):(f=new XMLHttpRequest,f.open(\"GET\",a,!0),f.addEventListener(\"load\",function(c){e.cache.add(a,this.response);b&&b(this.response);e.manager.itemEnd(a)},!1),void 0!==c&&f.addEventListener(\"progress\",\nfunction(a){c(a)},!1),void 0!==d&&f.addEventListener(\"error\",function(a){d(a)},!1),void 0!==this.crossOrigin&&(f.crossOrigin=this.crossOrigin),void 0!==this.responseType&&(f.responseType=this.responseType),f.send(null),e.manager.itemStart(a))},setResponseType:function(a){this.responseType=a},setCrossOrigin:function(a){this.crossOrigin=a}};THREE.ImageLoader=function(a){this.cache=new THREE.Cache;this.manager=void 0!==a?a:THREE.DefaultLoadingManager};\nTHREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b,c,d){var e=this,f=e.cache.get(a);if(void 0!==f)b(f);else return f=document.createElement(\"img\"),TiddlyWiki&&a.match(/^tw:/)&&(hack.log(\"url: \"+a+(f.crossOrigin?' [crossOrigin=\"'+f.crossOrigin+'\"]':\"\")+\": to be loaded\",hack.loader,\"THREE.ImageLoader.load\"),a=TiddlyWiki.load(a)),void 0!==b&&f.addEventListener(\"load\",function(c){e.cache.add(a,this);b(this);e.manager.itemEnd(a)},!1),void 0!==c&&f.addEventListener(\"progress\",\nfunction(a){c(a)},!1),void 0!==d&&f.addEventListener(\"error\",function(a){d(a)},!1),void 0!==this.crossOrigin&&(f.crossOrigin=this.crossOrigin),f.src=a,e.manager.itemStart(a),f},setCrossOrigin:function(a){this.crossOrigin=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);\nTHREE.JSONLoader.prototype.load=function(a,b,c){c=c&&\"string\"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};\nTHREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){if(TiddlyWiki&&b.match(/^tw:/)){var f=JSON.parse(TiddlyWiki.load(b));void 0!==f.metadata&&\"scene\"===f.metadata.type?console.error('THREE.JSONLoader: \"'+b+'\" seems to be a Scene. Use THREE.SceneLoader instead.'):(f=a.parse(f,d),c(f.geometry,f.materials),a.onLoadComplete(),hack.log(\"url: \"+b+\": loaded\",hack.loader,\"THREE.JSONLoader.loadAjaxJSON\"))}else{var g=new XMLHttpRequest,h=0;g.onreadystatechange=function(){if(g.readyState===g.DONE)if(200===\ng.status||0===g.status){if(g.responseText){var f=JSON.parse(g.responseText);if(void 0!==f.metadata&&\"scene\"===f.metadata.type){console.error('THREE.JSONLoader: \"'+b+'\" seems to be a Scene. Use THREE.SceneLoader instead.');return}f=a.parse(f,d);c(f.geometry,f.materials)}else console.error('THREE.JSONLoader: \"'+b+'\" seems to be unreachable or the file is empty.');a.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load \\\"\"+b+'\" ('+g.status+\")\");else g.readyState===g.LOADING?e&&(0===h&&\n(h=g.getResponseHeader(\"Content-Length\")),e({total:h,loaded:g.responseText.length})):g.readyState===g.HEADERS_RECEIVED&&void 0!==e&&(h=g.getResponseHeader(\"Content-Length\"))};g.open(\"GET\",b,!0);g.withCredentials=this.withCredentials;g.send(null)}};\nTHREE.JSONLoader.prototype.parse=function(a,b){var c=new THREE.Geometry,d=void 0!==a.scale?1/a.scale:1;(function(b){var d,g,h,k,l,n,q,r,t,s,p,v,w,u=a.faces;n=a.vertices;var D=a.normals,A=a.colors,x=0;if(void 0!==a.uvs){for(d=0;d<a.uvs.length;d++)a.uvs[d].length&&x++;for(d=0;d<x;d++)c.faceVertexUvs[d]=[]}k=0;for(l=n.length;k<l;)d=new THREE.Vector3,d.x=n[k++]*b,d.y=n[k++]*b,d.z=n[k++]*b,c.vertices.push(d);k=0;for(l=u.length;k<l;)if(b=u[k++],t=b&1,h=b&2,d=b&8,q=b&16,s=b&32,n=b&64,b&=128,t){t=new THREE.Face3;\nt.a=u[k];t.b=u[k+1];t.c=u[k+3];p=new THREE.Face3;p.a=u[k+1];p.b=u[k+2];p.c=u[k+3];k+=4;h&&(h=u[k++],t.materialIndex=h,p.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<x;d++)for(v=a.uvs[d],c.faceVertexUvs[d][h]=[],c.faceVertexUvs[d][h+1]=[],g=0;4>g;g++)r=u[k++],w=v[2*r],r=v[2*r+1],w=new THREE.Vector2(w,r),2!==g&&c.faceVertexUvs[d][h].push(w),0!==g&&c.faceVertexUvs[d][h+1].push(w);q&&(q=3*u[k++],t.normal.set(D[q++],D[q++],D[q]),p.normal.copy(t.normal));if(s)for(d=0;4>d;d++)q=3*u[k++],s=new THREE.Vector3(D[q++],\nD[q++],D[q]),2!==d&&t.vertexNormals.push(s),0!==d&&p.vertexNormals.push(s);n&&(n=u[k++],n=A[n],t.color.setHex(n),p.color.setHex(n));if(b)for(d=0;4>d;d++)n=u[k++],n=A[n],2!==d&&t.vertexColors.push(new THREE.Color(n)),0!==d&&p.vertexColors.push(new THREE.Color(n));c.faces.push(t);c.faces.push(p)}else{t=new THREE.Face3;t.a=u[k++];t.b=u[k++];t.c=u[k++];h&&(h=u[k++],t.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<x;d++)for(v=a.uvs[d],c.faceVertexUvs[d][h]=[],g=0;3>g;g++)r=u[k++],w=v[2*r],r=v[2*r+1],\nw=new THREE.Vector2(w,r),c.faceVertexUvs[d][h].push(w);q&&(q=3*u[k++],t.normal.set(D[q++],D[q++],D[q]));if(s)for(d=0;3>d;d++)q=3*u[k++],s=new THREE.Vector3(D[q++],D[q++],D[q]),t.vertexNormals.push(s);n&&(n=u[k++],t.color.setHex(A[n]));if(b)for(d=0;3>d;d++)n=u[k++],t.vertexColors.push(new THREE.Color(A[n]));c.faces.push(t)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,g=a.skinWeights.length;d<g;d+=b)c.skinWeights.push(new THREE.Vector4(a.skinWeights[d],\n1<b?a.skinWeights[d+1]:0,2<b?a.skinWeights[d+2]:0,3<b?a.skinWeights[d+3]:0));if(a.skinIndices)for(d=0,g=a.skinIndices.length;d<g;d+=b)c.skinIndices.push(new THREE.Vector4(a.skinIndices[d],1<b?a.skinIndices[d+1]:0,2<b?a.skinIndices[d+2]:0,3<b?a.skinIndices[d+3]:0));c.bones=a.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn(\"When skinning, number of vertices (\"+c.vertices.length+\"), skinIndices (\"+c.skinIndices.length+\n\"), and skinWeights (\"+c.skinWeights.length+\") should match.\");c.animation=a.animation;c.animations=a.animations})();(function(b){if(void 0!==a.morphTargets){var d,g,h,k,l,n;d=0;for(g=a.morphTargets.length;d<g;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=a.morphTargets[d].name,c.morphTargets[d].vertices=[],l=c.morphTargets[d].vertices,n=a.morphTargets[d].vertices,h=0,k=n.length;h<k;h+=3){var q=new THREE.Vector3;q.x=n[h]*b;q.y=n[h+1]*b;q.z=n[h+2]*b;l.push(q)}}if(void 0!==a.morphColors)for(d=\n0,g=a.morphColors.length;d<g;d++)for(c.morphColors[d]={},c.morphColors[d].name=a.morphColors[d].name,c.morphColors[d].colors=[],k=c.morphColors[d].colors,l=a.morphColors[d].colors,b=0,h=l.length;b<h;b+=3)n=new THREE.Color(16755200),n.setRGB(l[b],l[b+1],l[b+2]),k.push(n)})(d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};d=this.initMaterials(a.materials,b);this.needsTangents(d)&&c.computeTangents();return{geometry:c,materials:d}};\nTHREE.LoadingManager=function(a,b,c){var d=this,e=0,f=0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){f++};this.itemEnd=function(a){e++;if(void 0!==d.onProgress)d.onProgress(a,e,f);if(e===f&&void 0!==d.onLoad)d.onLoad()}};THREE.DefaultLoadingManager=new THREE.LoadingManager;THREE.BufferGeometryLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};\nTHREE.BufferGeometryLoader.prototype={constructor:THREE.BufferGeometryLoader,load:function(a,b,c,d){var e=this,f=new THREE.XHRLoader;f.setCrossOrigin(this.crossOrigin);f.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a){var b=new THREE.BufferGeometry,c=a.attributes,d;for(d in c){var e=c[d];b.attributes[d]={itemSize:e.itemSize,array:new self[e.type](e.array)}}c=a.offsets;void 0!==c&&(b.offsets=JSON.parse(JSON.stringify(c)));a=a.boundingSphere;\nvoid 0!==a&&(b.boundingSphere=new THREE.Sphere((new THREE.Vector3).fromArray(void 0!==a.center?a.center:[0,0,0]),a.radius));return b}};THREE.MaterialLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};\nTHREE.MaterialLoader.prototype={constructor:THREE.MaterialLoader,load:function(a,b,c,d){var e=this,f=new THREE.XHRLoader;f.setCrossOrigin(this.crossOrigin);f.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a){var b=new THREE[a.type];void 0!==a.color&&b.color.setHex(a.color);void 0!==a.ambient&&b.ambient.setHex(a.ambient);void 0!==a.emissive&&b.emissive.setHex(a.emissive);void 0!==a.specular&&b.specular.setHex(a.specular);void 0!==a.shininess&&\n(b.shininess=a.shininess);void 0!==a.uniforms&&(b.uniforms=a.uniforms);void 0!==a.vertexShader&&(b.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(b.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(b.vertexColors=a.vertexColors);void 0!==a.blending&&(b.blending=a.blending);void 0!==a.side&&(b.side=a.side);void 0!==a.opacity&&(b.opacity=a.opacity);void 0!==a.transparent&&(b.transparent=a.transparent);void 0!==a.wireframe&&(b.wireframe=a.wireframe);if(void 0!==a.materials)for(var c=\n0,d=a.materials.length;c<d;c++)b.materials.push(this.parse(a.materials[c]));return b}};THREE.ObjectLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};\nTHREE.ObjectLoader.prototype={constructor:THREE.ObjectLoader,load:function(a,b,c,d){var e=this,f=new THREE.XHRLoader(e.manager);f.setCrossOrigin(this.crossOrigin);f.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a){var b=this.parseGeometries(a.geometries),c=this.parseMaterials(a.materials);return this.parseObject(a.object,b,c)},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new THREE.JSONLoader,d=new THREE.BufferGeometryLoader,\ne=0,f=a.length;e<f;e++){var g,h=a[e];switch(h.type){case \"PlaneGeometry\":g=new THREE.PlaneGeometry(h.width,h.height,h.widthSegments,h.heightSegments);break;case \"BoxGeometry\":case \"CubeGeometry\":g=new THREE.BoxGeometry(h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case \"CircleGeometry\":g=new THREE.CircleGeometry(h.radius,h.segments);break;case \"CylinderGeometry\":g=new THREE.CylinderGeometry(h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded);\nbreak;case \"SphereGeometry\":g=new THREE.SphereGeometry(h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case \"IcosahedronGeometry\":g=new THREE.IcosahedronGeometry(h.radius,h.detail);break;case \"TorusGeometry\":g=new THREE.TorusGeometry(h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case \"TorusKnotGeometry\":g=new THREE.TorusKnotGeometry(h.radius,h.tube,h.radialSegments,h.tubularSegments,h.p,h.q,h.heightScale);break;case \"BufferGeometry\":g=\nd.parse(h.data);break;case \"Geometry\":g=c.parse(h.data).geometry}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a){var b={};if(void 0!==a)for(var c=new THREE.MaterialLoader,d=0,e=a.length;d<e;d++){var f=a[d],g=c.parse(f);g.uuid=f.uuid;void 0!==f.name&&(g.name=f.name);b[f.uuid]=g}return b},parseObject:function(){var a=new THREE.Matrix4;return function(b,c,d){var e;switch(b.type){case \"Scene\":e=new THREE.Scene;break;case \"PerspectiveCamera\":e=new THREE.PerspectiveCamera(b.fov,\nb.aspect,b.near,b.far);break;case \"OrthographicCamera\":e=new THREE.OrthographicCamera(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case \"AmbientLight\":e=new THREE.AmbientLight(b.color);break;case \"DirectionalLight\":e=new THREE.DirectionalLight(b.color,b.intensity);break;case \"PointLight\":e=new THREE.PointLight(b.color,b.intensity,b.distance);break;case \"SpotLight\":e=new THREE.SpotLight(b.color,b.intensity,b.distance,b.angle,b.exponent);break;case \"HemisphereLight\":e=new THREE.HemisphereLight(b.color,\nb.groundColor,b.intensity);break;case \"Mesh\":e=c[b.geometry];var f=d[b.material];void 0===e&&console.error(\"THREE.ObjectLoader: Undefined geometry \"+b.geometry);void 0===f&&console.error(\"THREE.ObjectLoader: Undefined material \"+b.material);e=new THREE.Mesh(e,f);break;case \"Sprite\":f=d[b.material];void 0===f&&console.error(\"THREE.ObjectLoader: Undefined material \"+b.material);e=new THREE.Sprite(f);break;default:e=new THREE.Object3D}e.uuid=b.uuid;void 0!==b.name&&(e.name=b.name);void 0!==b.matrix?\n(a.fromArray(b.matrix),a.decompose(e.position,e.quaternion,e.scale)):(void 0!==b.position&&e.position.fromArray(b.position),void 0!==b.rotation&&e.rotation.fromArray(b.rotation),void 0!==b.scale&&e.scale.fromArray(b.scale));void 0!==b.visible&&(e.visible=b.visible);void 0!==b.userData&&(e.userData=b.userData);if(void 0!==b.children)for(var g in b.children)e.add(this.parseObject(b.children[g],c,d));return e}}()};THREE.TextureLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};\nTHREE.TextureLoader.prototype={constructor:THREE.TextureLoader,load:function(a,b,c,d){var e=new THREE.ImageLoader(this.manager);e.setCrossOrigin(this.crossOrigin);e.load(a,function(a){a=new THREE.Texture(a);a.needsUpdate=!0;void 0!==b&&b(a)},c,d)},setCrossOrigin:function(a){this.crossOrigin=a}};\nTHREE.Material=function(){this.id=THREE.MaterialIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.side=THREE.FrontSide;this.opacity=1;this.transparent=!1;this.blending=THREE.NormalBlending;this.blendSrc=THREE.SrcAlphaFactor;this.blendDst=THREE.OneMinusSrcAlphaFactor;this.blendEquation=THREE.AddEquation;this.depthWrite=this.depthTest=!0;this.polygonOffset=!1;this.overdraw=this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.needsUpdate=this.visible=!0};\nTHREE.Material.prototype={constructor:THREE.Material,setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn(\"THREE.Material: '\"+b+\"' parameter is undefined.\");else if(b in this){var d=this[b];d instanceof THREE.Color?d.set(c):d instanceof THREE.Vector3&&c instanceof THREE.Vector3?d.copy(c):this[b]=\"overdraw\"==b?Number(c):c}}},clone:function(a){void 0===a&&(a=new THREE.Material);a.name=this.name;a.side=this.side;a.opacity=this.opacity;a.transparent=this.transparent;\na.blending=this.blending;a.blendSrc=this.blendSrc;a.blendDst=this.blendDst;a.blendEquation=this.blendEquation;a.depthTest=this.depthTest;a.depthWrite=this.depthWrite;a.polygonOffset=this.polygonOffset;a.polygonOffsetFactor=this.polygonOffsetFactor;a.polygonOffsetUnits=this.polygonOffsetUnits;a.alphaTest=this.alphaTest;a.overdraw=this.overdraw;a.visible=this.visible;return a},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.Material.prototype);\nTHREE.MaterialIdCount=0;THREE.LineBasicMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.linewidth=1;this.linejoin=this.linecap=\"round\";this.vertexColors=THREE.NoColors;this.fog=!0;this.setValues(a)};THREE.LineBasicMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.LineBasicMaterial.prototype.clone=function(){var a=new THREE.LineBasicMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.linewidth=this.linewidth;a.linecap=this.linecap;a.linejoin=this.linejoin;a.vertexColors=this.vertexColors;a.fog=this.fog;return a};THREE.LineDashedMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.scale=this.linewidth=1;this.dashSize=3;this.gapSize=1;this.vertexColors=!1;this.fog=!0;this.setValues(a)};\nTHREE.LineDashedMaterial.prototype=Object.create(THREE.Material.prototype);THREE.LineDashedMaterial.prototype.clone=function(){var a=new THREE.LineDashedMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.linewidth=this.linewidth;a.scale=this.scale;a.dashSize=this.dashSize;a.gapSize=this.gapSize;a.vertexColors=this.vertexColors;a.fog=this.fog;return a};\nTHREE.MeshBasicMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.envMap=this.alphaMap=this.specularMap=this.lightMap=this.map=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.vertexColors=THREE.NoColors;this.morphTargets=this.skinning=!1;this.setValues(a)};\nTHREE.MeshBasicMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.MeshBasicMaterial.prototype.clone=function(){var a=new THREE.MeshBasicMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.map=this.map;a.lightMap=this.lightMap;a.specularMap=this.specularMap;a.alphaMap=this.alphaMap;a.envMap=this.envMap;a.combine=this.combine;a.reflectivity=this.reflectivity;a.refractionRatio=this.refractionRatio;a.fog=this.fog;a.shading=this.shading;a.wireframe=this.wireframe;a.wireframeLinewidth=this.wireframeLinewidth;a.wireframeLinecap=this.wireframeLinecap;\na.wireframeLinejoin=this.wireframeLinejoin;a.vertexColors=this.vertexColors;a.skinning=this.skinning;a.morphTargets=this.morphTargets;return a};\nTHREE.MeshLambertMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.ambient=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.wrapAround=!1;this.wrapRGB=new THREE.Vector3(1,1,1);this.envMap=this.alphaMap=this.specularMap=this.lightMap=this.map=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\n\"round\";this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)};THREE.MeshLambertMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.MeshLambertMaterial.prototype.clone=function(){var a=new THREE.MeshLambertMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.ambient.copy(this.ambient);a.emissive.copy(this.emissive);a.wrapAround=this.wrapAround;a.wrapRGB.copy(this.wrapRGB);a.map=this.map;a.lightMap=this.lightMap;a.specularMap=this.specularMap;a.alphaMap=this.alphaMap;a.envMap=this.envMap;a.combine=this.combine;a.reflectivity=this.reflectivity;a.refractionRatio=this.refractionRatio;a.fog=this.fog;\na.shading=this.shading;a.wireframe=this.wireframe;a.wireframeLinewidth=this.wireframeLinewidth;a.wireframeLinecap=this.wireframeLinecap;a.wireframeLinejoin=this.wireframeLinejoin;a.vertexColors=this.vertexColors;a.skinning=this.skinning;a.morphTargets=this.morphTargets;a.morphNormals=this.morphNormals;return a};\nTHREE.MeshPhongMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.ambient=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.specular=new THREE.Color(1118481);this.shininess=30;this.wrapAround=this.metal=!1;this.wrapRGB=new THREE.Vector3(1,1,1);this.bumpMap=this.lightMap=this.map=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new THREE.Vector2(1,1);this.envMap=this.alphaMap=this.specularMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=\n1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)};THREE.MeshPhongMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.MeshPhongMaterial.prototype.clone=function(){var a=new THREE.MeshPhongMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.ambient.copy(this.ambient);a.emissive.copy(this.emissive);a.specular.copy(this.specular);a.shininess=this.shininess;a.metal=this.metal;a.wrapAround=this.wrapAround;a.wrapRGB.copy(this.wrapRGB);a.map=this.map;a.lightMap=this.lightMap;a.bumpMap=this.bumpMap;a.bumpScale=this.bumpScale;a.normalMap=this.normalMap;a.normalScale.copy(this.normalScale);\na.specularMap=this.specularMap;a.alphaMap=this.alphaMap;a.envMap=this.envMap;a.combine=this.combine;a.reflectivity=this.reflectivity;a.refractionRatio=this.refractionRatio;a.fog=this.fog;a.shading=this.shading;a.wireframe=this.wireframe;a.wireframeLinewidth=this.wireframeLinewidth;a.wireframeLinecap=this.wireframeLinecap;a.wireframeLinejoin=this.wireframeLinejoin;a.vertexColors=this.vertexColors;a.skinning=this.skinning;a.morphTargets=this.morphTargets;a.morphNormals=this.morphNormals;return a};\nTHREE.MeshDepthMaterial=function(a){THREE.Material.call(this);this.wireframe=this.morphTargets=!1;this.wireframeLinewidth=1;this.setValues(a)};THREE.MeshDepthMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshDepthMaterial.prototype.clone=function(){var a=new THREE.MeshDepthMaterial;THREE.Material.prototype.clone.call(this,a);a.wireframe=this.wireframe;a.wireframeLinewidth=this.wireframeLinewidth;return a};\nTHREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);this.shading=THREE.FlatShading;this.wireframe=!1;this.wireframeLinewidth=1;this.morphTargets=!1;this.setValues(a)};THREE.MeshNormalMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshNormalMaterial.prototype.clone=function(){var a=new THREE.MeshNormalMaterial;THREE.Material.prototype.clone.call(this,a);a.shading=this.shading;a.wireframe=this.wireframe;a.wireframeLinewidth=this.wireframeLinewidth;return a};\nTHREE.MeshFaceMaterial=function(a){this.materials=a instanceof Array?a:[]};THREE.MeshFaceMaterial.prototype.clone=function(){for(var a=new THREE.MeshFaceMaterial,b=0;b<this.materials.length;b++)a.materials.push(this.materials[b].clone());return a};THREE.PointCloudMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.vertexColors=THREE.NoColors;this.fog=!0;this.setValues(a)};THREE.PointCloudMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.PointCloudMaterial.prototype.clone=function(){var a=new THREE.PointCloudMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.map=this.map;a.size=this.size;a.sizeAttenuation=this.sizeAttenuation;a.vertexColors=this.vertexColors;a.fog=this.fog;return a};THREE.ParticleBasicMaterial=function(a){console.warn(\"THREE.ParticleBasicMaterial has been renamed to THREE.PointCloudMaterial.\");return new THREE.PointCloudMaterial(a)};\nTHREE.ParticleSystemMaterial=function(a){console.warn(\"THREE.ParticleSystemMaterial has been renamed to THREE.PointCloudMaterial.\");return new THREE.PointCloudMaterial(a)};\nTHREE.ShaderMaterial=function(a){THREE.Material.call(this);this.defines={};this.uniforms={};this.attributes=null;this.vertexShader=\"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";this.fragmentShader=\"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";this.shading=THREE.SmoothShading;this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=\n!1;this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.setValues(a)};THREE.ShaderMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.ShaderMaterial.prototype.clone=function(){var a=new THREE.ShaderMaterial;THREE.Material.prototype.clone.call(this,a);a.fragmentShader=this.fragmentShader;a.vertexShader=this.vertexShader;a.uniforms=THREE.UniformsUtils.clone(this.uniforms);a.attributes=this.attributes;a.defines=this.defines;a.shading=this.shading;a.wireframe=this.wireframe;a.wireframeLinewidth=this.wireframeLinewidth;a.fog=this.fog;a.lights=this.lights;a.vertexColors=this.vertexColors;a.skinning=this.skinning;a.morphTargets=\nthis.morphTargets;a.morphNormals=this.morphNormals;return a};THREE.RawShaderMaterial=function(a){THREE.ShaderMaterial.call(this,a)};THREE.RawShaderMaterial.prototype=Object.create(THREE.ShaderMaterial.prototype);THREE.RawShaderMaterial.prototype.clone=function(){var a=new THREE.RawShaderMaterial;THREE.ShaderMaterial.prototype.clone.call(this,a);return a};THREE.SpriteMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=null;this.rotation=0;this.fog=!1;this.setValues(a)};\nTHREE.SpriteMaterial.prototype=Object.create(THREE.Material.prototype);THREE.SpriteMaterial.prototype.clone=function(){var a=new THREE.SpriteMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.map=this.map;a.rotation=this.rotation;a.fog=this.fog;return a};THREE.SpriteCanvasMaterial=function(a){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.program=function(a,c){};this.setValues(a)};THREE.SpriteCanvasMaterial.prototype=Object.create(THREE.Material.prototype);\nTHREE.SpriteCanvasMaterial.prototype.clone=function(){var a=new THREE.SpriteCanvasMaterial;THREE.Material.prototype.clone.call(this,a);a.color.copy(this.color);a.program=this.program;return a};THREE.ParticleCanvasMaterial=THREE.SpriteCanvasMaterial;\nTHREE.Texture=function(a,b,c,d,e,f,g,h,k){this.id=THREE.TextureIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.image=void 0!==a?a:THREE.Texture.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:THREE.Texture.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==d?d:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==e?e:THREE.LinearFilter;this.minFilter=void 0!==f?f:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==k?k:1;this.format=void 0!==\ng?g:THREE.RGBAFormat;this.type=void 0!==h?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this._needsUpdate=!1;this.onUpdate=null};THREE.Texture.DEFAULT_IMAGE=void 0;THREE.Texture.DEFAULT_MAPPING=new THREE.UVMapping;\nTHREE.Texture.prototype={constructor:THREE.Texture,get needsUpdate(){return this._needsUpdate},set needsUpdate(a){!0===a&&this.update();this._needsUpdate=a},clone:function(a){void 0===a&&(a=new THREE.Texture);a.image=this.image;a.mipmaps=this.mipmaps.slice(0);a.mapping=this.mapping;a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.anisotropy=this.anisotropy;a.format=this.format;a.type=this.type;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.generateMipmaps=\nthis.generateMipmaps;a.premultiplyAlpha=this.premultiplyAlpha;a.flipY=this.flipY;a.unpackAlignment=this.unpackAlignment;return a},update:function(){this.dispatchEvent({type:\"update\"})},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype);THREE.TextureIdCount=0;THREE.CubeTexture=function(a,b,c,d,e,f,g,h,k){THREE.Texture.call(this,a,b,c,d,e,f,g,h,k);this.images=a};THREE.CubeTexture.prototype=Object.create(THREE.Texture.prototype);\nTHREE.CubeTexture.clone=function(a){void 0===a&&(a=new THREE.CubeTexture);THREE.Texture.prototype.clone.call(this,a);a.images=this.images;return a};THREE.CompressedTexture=function(a,b,c,d,e,f,g,h,k,l,n){THREE.Texture.call(this,null,f,g,h,k,l,d,e,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=!1};THREE.CompressedTexture.prototype=Object.create(THREE.Texture.prototype);\nTHREE.CompressedTexture.prototype.clone=function(){var a=new THREE.CompressedTexture;THREE.Texture.prototype.clone.call(this,a);return a};THREE.DataTexture=function(a,b,c,d,e,f,g,h,k,l,n){THREE.Texture.call(this,null,f,g,h,k,l,d,e,n);this.image={data:a,width:b,height:c}};THREE.DataTexture.prototype=Object.create(THREE.Texture.prototype);THREE.DataTexture.prototype.clone=function(){var a=new THREE.DataTexture;THREE.Texture.prototype.clone.call(this,a);return a};\nTHREE.PointCloud=function(a,b){THREE.Object3D.call(this);this.geometry=void 0!==a?a:new THREE.Geometry;this.material=void 0!==b?b:new THREE.PointCloudMaterial({color:16777215*Math.random()});this.sortParticles=!1};THREE.PointCloud.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.PointCloud.prototype.raycast=function(){var a=new THREE.Matrix4,b=new THREE.Ray;return function(c,d){var e=this,f=e.geometry,g=c.params.PointCloud.threshold;a.getInverse(this.matrixWorld);b.copy(c.ray).applyMatrix4(a);if(null===f.boundingBox||!1!==b.isIntersectionBox(f.boundingBox)){var h=g/((this.scale.x+this.scale.y+this.scale.z)/3),k=new THREE.Vector3,g=function(a,f){var g=b.distanceToPoint(a);if(g<h){var k=b.closestPointToPoint(a);k.applyMatrix4(e.matrixWorld);var l=c.ray.origin.distanceTo(k);\nd.push({distance:l,distanceToRay:g,point:k.clone(),index:f,face:null,object:e})}};if(f instanceof THREE.BufferGeometry){var l=f.attributes,n=l.position.array;if(void 0!==l.index){var l=l.index.array,q=f.offsets;0===q.length&&(q=[{start:0,count:l.length,index:0}]);for(var r=0,t=q.length;r<t;++r)for(var s=q[r].start,p=q[r].index,f=s,s=s+q[r].count;f<s;f++){var v=p+l[f];k.set(n[3*v],n[3*v+1],n[3*v+2]);g(k,v)}}else for(l=n.length/3,f=0;f<l;f++)k.set(n[3*f],n[3*f+1],n[3*f+2]),g(k,f)}else for(k=this.geometry.vertices,\nf=0;f<k.length;f++)g(k[f],f)}}}();THREE.PointCloud.prototype.clone=function(a){void 0===a&&(a=new THREE.PointCloud(this.geometry,this.material));a.sortParticles=this.sortParticles;THREE.Object3D.prototype.clone.call(this,a);return a};THREE.ParticleSystem=function(a,b){console.warn(\"THREE.ParticleSystem has been renamed to THREE.PointCloud.\");return new THREE.PointCloud(a,b)};\nTHREE.Line=function(a,b,c){THREE.Object3D.call(this);this.geometry=void 0!==a?a:new THREE.Geometry;this.material=void 0!==b?b:new THREE.LineBasicMaterial({color:16777215*Math.random()});this.type=void 0!==c?c:THREE.LineStrip};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.Line.prototype.raycast=function(){var a=new THREE.Matrix4,b=new THREE.Ray,c=new THREE.Sphere;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(this.matrixWorld);if(!1!==d.ray.isIntersectionSphere(c)&&(a.getInverse(this.matrixWorld),b.copy(d.ray).applyMatrix4(a),g instanceof THREE.Geometry))for(var g=g.vertices,h=g.length,k=new THREE.Vector3,l=new THREE.Vector3,n=this.type===THREE.LineStrip?\n1:2,q=0;q<h-1;q+=n)if(!(b.distanceSqToSegment(g[q],g[q+1],l,k)>f)){var r=b.origin.distanceTo(l);r<d.near||r>d.far||e.push({distance:r,point:k.clone().applyMatrix4(this.matrixWorld),face:null,faceIndex:null,object:this})}}}();THREE.Line.prototype.clone=function(a){void 0===a&&(a=new THREE.Line(this.geometry,this.material,this.type));THREE.Object3D.prototype.clone.call(this,a);return a};\nTHREE.Mesh=function(a,b){THREE.Object3D.call(this);this.geometry=void 0!==a?a:new THREE.Geometry;this.material=void 0!==b?b:new THREE.MeshBasicMaterial({color:16777215*Math.random()});this.updateMorphTargets()};THREE.Mesh.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.Mesh.prototype.updateMorphTargets=function(){if(void 0!==this.geometry.morphTargets&&0<this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var a=0,b=this.geometry.morphTargets.length;a<b;a++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[this.geometry.morphTargets[a].name]=a}};\nTHREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(void 0!==this.morphTargetDictionary[a])return this.morphTargetDictionary[a];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+a+\" does not exist. Returning 0.\");return 0};\nTHREE.Mesh.prototype.raycast=function(){var a=new THREE.Matrix4,b=new THREE.Ray,c=new THREE.Sphere,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Vector3;return function(g,h){var k=this.geometry;null===k.boundingSphere&&k.computeBoundingSphere();c.copy(k.boundingSphere);c.applyMatrix4(this.matrixWorld);if(!1!==g.ray.isIntersectionSphere(c)&&(a.getInverse(this.matrixWorld),b.copy(g.ray).applyMatrix4(a),null===k.boundingBox||!1!==b.isIntersectionBox(k.boundingBox)))if(k instanceof THREE.BufferGeometry){var l=\nthis.material;if(void 0!==l){var n=k.attributes,q,r,t=g.precision;if(void 0!==n.index){var s=n.index.array,p=n.position.array,v=k.offsets;0===v.length&&(v=[{start:0,count:s.length,index:0}]);for(var w=0,u=v.length;w<u;++w)for(var n=v[w].start,D=v[w].index,k=n,A=n+v[w].count;k<A;k+=3){n=D+s[k];q=D+s[k+1];r=D+s[k+2];d.set(p[3*n],p[3*n+1],p[3*n+2]);e.set(p[3*q],p[3*q+1],p[3*q+2]);f.set(p[3*r],p[3*r+1],p[3*r+2]);var x=l.side===THREE.BackSide?b.intersectTriangle(f,e,d,!0):b.intersectTriangle(d,e,f,l.side!==\nTHREE.DoubleSide);if(null!==x){x.applyMatrix4(this.matrixWorld);var C=g.ray.origin.distanceTo(x);C<t||C<g.near||C>g.far||h.push({distance:C,point:x,indices:[n,q,r],face:null,faceIndex:null,object:this})}}}else for(p=n.position.array,s=k=0,A=p.length;k<A;k+=3,s+=9)n=k,q=k+1,r=k+2,d.set(p[s],p[s+1],p[s+2]),e.set(p[s+3],p[s+4],p[s+5]),f.set(p[s+6],p[s+7],p[s+8]),x=l.side===THREE.BackSide?b.intersectTriangle(f,e,d,!0):b.intersectTriangle(d,e,f,l.side!==THREE.DoubleSide),null!==x&&(x.applyMatrix4(this.matrixWorld),\nC=g.ray.origin.distanceTo(x),C<t||C<g.near||C>g.far||h.push({distance:C,point:x,indices:[n,q,r],face:null,faceIndex:null,object:this}))}}else if(k instanceof THREE.Geometry)for(s=this.material instanceof THREE.MeshFaceMaterial,p=!0===s?this.material.materials:null,t=g.precision,v=k.vertices,w=0,u=k.faces.length;w<u;w++)if(D=k.faces[w],l=!0===s?p[D.materialIndex]:this.material,void 0!==l){n=v[D.a];q=v[D.b];r=v[D.c];if(!0===l.morphTargets){x=k.morphTargets;C=this.morphTargetInfluences;d.set(0,0,0);\ne.set(0,0,0);f.set(0,0,0);for(var A=0,I=x.length;A<I;A++){var z=C[A];if(0!==z){var y=x[A].vertices;d.x+=(y[D.a].x-n.x)*z;d.y+=(y[D.a].y-n.y)*z;d.z+=(y[D.a].z-n.z)*z;e.x+=(y[D.b].x-q.x)*z;e.y+=(y[D.b].y-q.y)*z;e.z+=(y[D.b].z-q.z)*z;f.x+=(y[D.c].x-r.x)*z;f.y+=(y[D.c].y-r.y)*z;f.z+=(y[D.c].z-r.z)*z}}d.add(n);e.add(q);f.add(r);n=d;q=e;r=f}x=l.side===THREE.BackSide?b.intersectTriangle(r,q,n,!0):b.intersectTriangle(n,q,r,l.side!==THREE.DoubleSide);null!==x&&(x.applyMatrix4(this.matrixWorld),C=g.ray.origin.distanceTo(x),\nC<t||C<g.near||C>g.far||h.push({distance:C,point:x,face:D,faceIndex:w,object:this}))}}}();THREE.Mesh.prototype.clone=function(a,b){void 0===a&&(a=new THREE.Mesh(this.geometry,this.material));THREE.Object3D.prototype.clone.call(this,a,b);return a};THREE.Bone=function(a){THREE.Object3D.call(this);this.skin=a;this.accumulatedSclWeight=this.accumulatedPosWeight=this.accumulatedRotWeight=0};THREE.Bone.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.Bone.prototype.updateMatrixWorld=function(a){THREE.Object3D.prototype.updateMatrixWorld.call(this,a);this.accumulatedSclWeight=this.accumulatedPosWeight=this.accumulatedRotWeight=0};\nTHREE.Skeleton=function(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new THREE.Matrix4;a=a||[];this.bones=a.slice(0);this.useVertexTexture?(this.boneTextureHeight=this.boneTextureWidth=a=256<this.bones.length?64:64<this.bones.length?32:16<this.bones.length?16:8,this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new THREE.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,THREE.RGBAFormat,THREE.FloatType),\nthis.boneTexture.minFilter=THREE.NearestFilter,this.boneTexture.magFilter=THREE.NearestFilter,this.boneTexture.generateMipmaps=!1,this.boneTexture.flipY=!1):this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn(\"THREE.Skeleton bonInverses is the wrong length.\"),this.boneInverses=[],b=0,a=this.bones.length;b<a;b++)this.boneInverses.push(new THREE.Matrix4)};\nTHREE.Skeleton.prototype.calculateInverses=function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new THREE.Matrix4;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}};\nTHREE.Skeleton.prototype.pose=function(){for(var a,b=0,c=this.bones.length;b<c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<c;b++)if(a=this.bones[b])a.parent?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)};\nTHREE.Skeleton.prototype.update=function(){for(var a=new THREE.Matrix4,b=0,c=this.bones.length;b<c;b++)a.multiplyMatrices(this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix,this.boneInverses[b]),a.flattenToArrayOffset(this.boneMatrices,16*b);this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)};\nTHREE.SkinnedMesh=function(a,b,c){THREE.Mesh.call(this,a,b);this.bindMode=\"attached\";this.bindMatrix=new THREE.Matrix4;this.bindMatrixInverse=new THREE.Matrix4;a=[];if(this.geometry&&void 0!==this.geometry.bones){for(var d,e,f,g,h=0,k=this.geometry.bones.length;h<k;++h)d=this.geometry.bones[h],e=d.pos,f=d.rotq,g=d.scl,b=new THREE.Bone(this),a.push(b),b.name=d.name,b.position.set(e[0],e[1],e[2]),b.quaternion.set(f[0],f[1],f[2],f[3]),void 0!==g?b.scale.set(g[0],g[1],g[2]):b.scale.set(1,1,1);h=0;for(k=\nthis.geometry.bones.length;h<k;++h)d=this.geometry.bones[h],-1!==d.parent?a[d.parent].add(a[h]):this.add(a[h])}this.normalizeSkinWeights();this.updateMatrixWorld(!0);this.bind(new THREE.Skeleton(a,void 0,c))};THREE.SkinnedMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.SkinnedMesh.prototype.bind=function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)};THREE.SkinnedMesh.prototype.pose=function(){this.skeleton.pose()};\nTHREE.SkinnedMesh.prototype.normalizeSkinWeights=function(){if(this.geometry instanceof THREE.Geometry)for(var a=0;a<this.geometry.skinIndices.length;a++){var b=this.geometry.skinWeights[a],c=1/b.lengthManhattan();Infinity!==c?b.multiplyScalar(c):b.set(1)}};\nTHREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){THREE.Mesh.prototype.updateMatrixWorld.call(this,!0);\"attached\"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):\"detached\"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn(\"THREE.SkinnedMesh unreckognized bindMode: \"+this.bindMode)};\nTHREE.SkinnedMesh.prototype.clone=function(a){void 0===a&&(a=new THREE.SkinnedMesh(this.geometry,this.material,this.useVertexTexture));THREE.Mesh.prototype.clone.call(this,a);return a};THREE.MorphAnimMesh=function(a,b){THREE.Mesh.call(this,a,b);this.duration=1E3;this.mirroredLoop=!1;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=!1;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=Object.create(THREE.Mesh.prototype);\nTHREE.MorphAnimMesh.prototype.setFrameRange=function(a,b){this.startKeyframe=a;this.endKeyframe=b;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=!1};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=!0};\nTHREE.MorphAnimMesh.prototype.parseAnimations=function(){var a=this.geometry;a.animations||(a.animations={});for(var b,c=a.animations,d=/([a-z]+)_?(\\d+)/,e=0,f=a.morphTargets.length;e<f;e++){var g=a.morphTargets[e].name.match(d);if(g&&1<g.length){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];e<h.start&&(h.start=e);e>h.end&&(h.end=e);b||(b=g)}}a.firstAnimation=b};\nTHREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){this.geometry.animations||(this.geometry.animations={});this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];c?(this.setFrameRange(c.start,c.end),this.duration=(c.end-c.start)/b*1E3,this.time=0):console.warn(\"animation[\"+a+\"] undefined\")};\nTHREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time+=this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||0>this.time)this.direction*=-1,this.time>this.duration&&(this.time=this.duration,this.directionBackwards=!0),0>this.time&&(this.time=0,this.directionBackwards=!1)}else this.time%=this.duration,0>this.time&&(this.time+=this.duration);a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/b),0,this.length-1);a!==this.currentKeyframe&&\n(this.morphTargetInfluences[this.lastKeyframe]=0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[a]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=a);b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};\nTHREE.MorphAnimMesh.prototype.interpolateTargets=function(a,b,c){for(var d=this.morphTargetInfluences,e=0,f=d.length;e<f;e++)d[e]=0;-1<a&&(d[a]=1-c);-1<b&&(d[b]=c)};\nTHREE.MorphAnimMesh.prototype.clone=function(a){void 0===a&&(a=new THREE.MorphAnimMesh(this.geometry,this.material));a.duration=this.duration;a.mirroredLoop=this.mirroredLoop;a.time=this.time;a.lastKeyframe=this.lastKeyframe;a.currentKeyframe=this.currentKeyframe;a.direction=this.direction;a.directionBackwards=this.directionBackwards;THREE.Mesh.prototype.clone.call(this,a);return a};THREE.LOD=function(){THREE.Object3D.call(this);this.objects=[]};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.LOD.prototype.addLevel=function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=0;c<this.objects.length&&!(b<this.objects[c].distance);c++);this.objects.splice(c,0,{distance:b,object:a});this.add(a)};THREE.LOD.prototype.getObjectForDistance=function(a){for(var b=1,c=this.objects.length;b<c&&!(a<this.objects[b].distance);b++);return this.objects[b-1].object};\nTHREE.LOD.prototype.raycast=function(){var a=new THREE.Vector3;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}();\nTHREE.LOD.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c){if(1<this.objects.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);this.objects[0].object.visible=!0;for(var d=1,e=this.objects.length;d<e;d++)if(c>=this.objects[d].distance)this.objects[d-1].object.visible=!1,this.objects[d].object.visible=!0;else break;for(;d<e;d++)this.objects[d].object.visible=!1}}}();\nTHREE.LOD.prototype.clone=function(a){void 0===a&&(a=new THREE.LOD);THREE.Object3D.prototype.clone.call(this,a);for(var b=0,c=this.objects.length;b<c;b++){var d=this.objects[b].object.clone();d.visible=0===b;a.addLevel(d,this.objects[b].distance)}return a};\nTHREE.Sprite=function(){var a=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0]),b=new THREE.BufferGeometry;b.addAttribute(\"position\",new THREE.BufferAttribute(a,3));return function(a){THREE.Object3D.call(this);this.geometry=b;this.material=void 0!==a?a:new THREE.SpriteMaterial}}();THREE.Sprite.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.Sprite.prototype.raycast=function(){var a=new THREE.Vector3;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.distanceToPoint(a);d>this.scale.x||c.push({distance:d,point:this.position,face:null,object:this})}}();THREE.Sprite.prototype.updateMatrix=function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0};\nTHREE.Sprite.prototype.clone=function(a){void 0===a&&(a=new THREE.Sprite(this.material));THREE.Object3D.prototype.clone.call(this,a);return a};THREE.Particle=THREE.Sprite;THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.autoUpdate=!0;this.matrixAutoUpdate=!1;this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)-1===this.__lights.indexOf(a)&&this.__lights.push(a),a.target&&void 0===a.target.parent&&this.add(a.target);else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)){this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);-1!==b&&this.__objectsRemoved.splice(b,1)}this.dispatchEvent({type:\"objectAdded\",object:a});a.dispatchEvent({type:\"addedToScene\",scene:this});for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};\nTHREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);-1!==b&&this.__lights.splice(b,1);if(a.shadowCascadeArray)for(b=0;b<a.shadowCascadeArray.length;b++)this.__removeObject(a.shadowCascadeArray[b])}else a instanceof THREE.Camera||(this.__objectsRemoved.push(a),b=this.__objectsAdded.indexOf(a),-1!==b&&this.__objectsAdded.splice(b,1));this.dispatchEvent({type:\"objectRemoved\",object:a});a.dispatchEvent({type:\"removedFromScene\",scene:this});for(b=\n0;b<a.children.length;b++)this.__removeObject(a.children[b])};THREE.Scene.prototype.clone=function(a){void 0===a&&(a=new THREE.Scene);THREE.Object3D.prototype.clone.call(this,a);null!==this.fog&&(a.fog=this.fog.clone());null!==this.overrideMaterial&&(a.overrideMaterial=this.overrideMaterial.clone());a.autoUpdate=this.autoUpdate;a.matrixAutoUpdate=this.matrixAutoUpdate;return a};THREE.Fog=function(a,b,c){this.name=\"\";this.color=new THREE.Color(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3};\nTHREE.Fog.prototype.clone=function(){return new THREE.Fog(this.color.getHex(),this.near,this.far)};THREE.FogExp2=function(a,b){this.name=\"\";this.color=new THREE.Color(a);this.density=void 0!==b?b:2.5E-4};THREE.FogExp2.prototype.clone=function(){return new THREE.FogExp2(this.color.getHex(),this.density)};\nTHREE.CanvasRenderer=function(a){function b(a,b,c,d){l(b);n(c);q(d);r(a.getStyle());O.stroke();ra.expandByScalar(2*b)}function c(a){t(a.getStyle());O.fill()}function d(a){e(a.target)}function e(a){if(!(a instanceof THREE.CompressedTexture)){var b=a.wrapS===THREE.RepeatWrapping,c=a.wrapT===THREE.RepeatWrapping,d=a.image,e=document.createElement(\"canvas\");e.width=d.width;e.height=d.height;var f=e.getContext(\"2d\");f.setTransform(1,0,0,-1,0,d.height);f.drawImage(d,0,0);Ca[a.id]=O.createPattern(e,!0===\nb&&!0===c?\"repeat\":!0===b&&!1===c?\"repeat-x\":!1===b&&!0===c?\"repeat-y\":\"no-repeat\")}}function f(a,b,c,f,g,h,k,l,n,r,q,s,p){if(!(p instanceof THREE.DataTexture)){!1===p.hasEventListener(\"update\",d)&&(void 0!==p.image&&0<p.image.width&&e(p),p.addEventListener(\"update\",d));var m=Ca[p.id];if(void 0!==m){t(m);var m=p.offset.x/p.repeat.x,w=p.offset.y/p.repeat.y,u=p.image.width*p.repeat.x;p=p.image.height*p.repeat.y;k=(k+m)*u;l=(l+w)*p;c-=a;f-=b;g-=a;h-=b;n=(n+m)*u-k;r=(r+w)*p-l;q=(q+m)*u-k;s=(s+w)*p-l;\np=n*s-q*r;0!==p&&(m=1/p,p=(s*c-r*g)*m,r=(s*f-r*h)*m,c=(n*g-q*c)*m,f=(n*h-q*f)*m,a=a-p*k-c*l,b=b-r*k-f*l,O.save(),O.transform(p,r,c,f,a,b),O.fill(),O.restore())}else t(\"rgba(0,0,0,1)\"),O.fill()}}function g(a,b,c){var d=b.x-a.x,e=b.y-a.y,f=d*d+e*e;0!==f&&(c/=Math.sqrt(f),d*=c,e*=c,b.x+=d,b.y+=e,a.x-=d,a.y-=e)}function h(a){Q!==a&&(Q=O.globalAlpha=a)}function k(a){L!==a&&(a===THREE.NormalBlending?O.globalCompositeOperation=\"source-over\":a===THREE.AdditiveBlending?O.globalCompositeOperation=\"lighter\":\na===THREE.SubtractiveBlending&&(O.globalCompositeOperation=\"darker\"),L=a)}function l(a){S!==a&&(S=O.lineWidth=a)}function n(a){V!==a&&(V=O.lineCap=a)}function q(a){W!==a&&(W=O.lineJoin=a)}function r(a){R!==a&&(R=O.strokeStyle=a)}function t(a){B!==a&&(B=O.fillStyle=a)}function s(a){H.length!==a.length&&(O.setLineDash(a),H=a)}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var p=THREE.Math.smoothstep;a=a||{};var v=this,w,u,D,A=new THREE.Projector,x=void 0!==a.canvas?a.canvas:document.createElement(\"canvas\"),\nC=x.width,I=x.height,z=Math.floor(C/2),y=Math.floor(I/2),K=0,N=0,ba=C,P=I,O=x.getContext(\"2d\",{alpha:!0===a.alpha}),J=new THREE.Color(0),E=0,Q=1,L=0,R=null,B=null,S=null,V=null,W=null,H=[],oa,$,X,T;new THREE.RenderableVertex;new THREE.RenderableVertex;var ya,Ea,Aa,za,Oa,Pa,G=new THREE.Color;new THREE.Color;new THREE.Color;new THREE.Color;new THREE.Color;var Ba=new THREE.Color,Ya=new THREE.Color,Za=new THREE.Color,Ca={},ca,la,qa,ua,ja,Fa,va,Ka=new THREE.Box2,aa=new THREE.Box2,ra=new THREE.Box2,Da=\nnew THREE.Color,Qa=new THREE.Color,cb=new THREE.Color,Ga=new THREE.Vector3,xa=new THREE.Vector3,ma=new THREE.Vector3,Ja=new THREE.Matrix3;void 0===O.setLineDash&&(O.setLineDash=function(){});this.domElement=x;this.devicePixelRatio=void 0!==a.devicePixelRatio?a.devicePixelRatio:void 0!==self.devicePixelRatio?self.devicePixelRatio:1;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.supportsVertexTextures=function(){};this.setFaceCulling=function(){};this.setSize=\nfunction(a,b,c){C=a*this.devicePixelRatio;I=b*this.devicePixelRatio;x.width=C;x.height=I;z=Math.floor(C/2);y=Math.floor(I/2);!1!==c&&(x.style.width=a+\"px\",x.style.height=b+\"px\");Ka.min.set(-z,-y);Ka.max.set(z,y);aa.min.set(-z,-y);aa.max.set(z,y);Q=1;L=0;W=V=S=B=R=null;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){K=a*this.devicePixelRatio;N=b*this.devicePixelRatio;ba=c*this.devicePixelRatio;P=d*this.devicePixelRatio};this.setScissor=function(){};this.enableScissorTest=function(){};\nthis.setClearColor=function(a,b){J.set(a);E=void 0!==b?b:1;aa.min.set(-z,-y);aa.max.set(z,y)};this.setClearColorHex=function(a,b){console.warn(\"THREE.CanvasRenderer: .setClearColorHex() is being removed. Use .setClearColor() instead.\");this.setClearColor(a,b)};this.getClearColor=function(){return J};this.getClearAlpha=function(){return E};this.getMaxAnisotropy=function(){return 0};this.clear=function(){!1===aa.empty()&&(aa.intersect(Ka),aa.expandByScalar(2),aa.min.x+=z,aa.min.y=-aa.min.y+y,aa.max.x+=\nz,aa.max.y=-aa.max.y+y,1>E&&O.clearRect(aa.min.x|0,aa.min.y|0,aa.max.x-aa.min.x|0,aa.max.y-aa.min.y|0),0<E&&(k(THREE.NormalBlending),h(1),t(\"rgba(\"+Math.floor(255*J.r)+\",\"+Math.floor(255*J.g)+\",\"+Math.floor(255*J.b)+\",\"+E+\")\"),O.fillRect(aa.min.x|0,aa.min.y|0,aa.max.x-aa.min.x|0,aa.max.y-aa.min.y|0)),aa.makeEmpty())};this.clearColor=function(){};this.clearDepth=function(){};this.clearStencil=function(){};this.render=function(a,x){if(!1===x instanceof THREE.Camera)console.error(\"THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.\");\nelse{!0===this.autoClear&&this.clear();v.info.render.vertices=0;v.info.render.faces=0;O.setTransform(ba/C,0,0,-P/I,K,I-N);O.translate(z,y);w=A.projectScene(a,x,this.sortObjects,this.sortElements);u=w.elements;D=w.lights;oa=x;Ja.getNormalMatrix(x.matrixWorldInverse);Da.setRGB(0,0,0);Qa.setRGB(0,0,0);cb.setRGB(0,0,0);for(var L=0,Q=D.length;L<Q;L++){var E=D[L],H=E.color;E instanceof THREE.AmbientLight?Da.add(H):E instanceof THREE.DirectionalLight?Qa.add(H):E instanceof THREE.PointLight&&cb.add(H)}L=\n0;for(Q=u.length;L<Q;L++){var J=u[L],B=J.material;if(void 0!==B&&0!==B.opacity){ra.makeEmpty();if(J instanceof THREE.RenderableSprite){$=J;$.x*=z;$.y*=y;var E=$,R=J,H=B;h(H.opacity);k(H.blending);var ea=R.scale.x*z,R=R.scale.y*y,J=.5*Math.sqrt(ea*ea+R*R);ra.min.set(E.x-J,E.y-J);ra.max.set(E.x+J,E.y+J);if(H instanceof THREE.SpriteMaterial){var da=H.map;if(null!==da&&void 0!==da.image){!1===da.hasEventListener(\"update\",d)&&(0<da.image.width&&e(da),da.addEventListener(\"update\",d));J=Ca[da.id];void 0!==\nJ?t(J):t(\"rgba( 0, 0, 0, 1 )\");var S=da.image,J=S.width*da.offset.x,B=S.height*da.offset.y,V=S.width*da.repeat.x,da=S.height*da.repeat.y,S=ea/V,m=R/da;O.save();O.translate(E.x,E.y);0!==H.rotation&&O.rotate(H.rotation);O.translate(-ea/2,-R/2);O.scale(S,m);O.translate(-J,-B);O.fillRect(J,B,V,da)}else t(H.color.getStyle()),O.save(),O.translate(E.x,E.y),0!==H.rotation&&O.rotate(H.rotation),O.scale(ea,-R),O.fillRect(-.5,-.5,1,1);O.restore()}else H instanceof THREE.SpriteCanvasMaterial&&(r(H.color.getStyle()),\nt(H.color.getStyle()),O.save(),O.translate(E.x,E.y),0!==H.rotation&&O.rotate(H.rotation),O.scale(ea,R),H.program(O),O.restore())}else if(J instanceof THREE.RenderableLine){if($=J.v1,X=J.v2,$.positionScreen.x*=z,$.positionScreen.y*=y,X.positionScreen.x*=z,X.positionScreen.y*=y,ra.setFromPoints([$.positionScreen,X.positionScreen]),!0===Ka.isIntersectionBox(ra))if(E=$,H=X,ea=J,R=B,h(R.opacity),k(R.blending),O.beginPath(),O.moveTo(E.positionScreen.x,E.positionScreen.y),O.lineTo(H.positionScreen.x,H.positionScreen.y),\nR instanceof THREE.LineBasicMaterial){l(R.linewidth);n(R.linecap);q(R.linejoin);if(R.vertexColors!==THREE.VertexColors)r(R.color.getStyle());else if(J=ea.vertexColors[0].getStyle(),ea=ea.vertexColors[1].getStyle(),J===ea)r(J);else{try{var W=O.createLinearGradient(E.positionScreen.x,E.positionScreen.y,H.positionScreen.x,H.positionScreen.y);W.addColorStop(0,J);W.addColorStop(1,ea)}catch(xb){W=J}r(W)}O.stroke();ra.expandByScalar(2*R.linewidth)}else R instanceof THREE.LineDashedMaterial&&(l(R.linewidth),\nn(R.linecap),q(R.linejoin),r(R.color.getStyle()),s([R.dashSize,R.gapSize]),O.stroke(),ra.expandByScalar(2*R.linewidth),s([]))}else if(J instanceof THREE.RenderableFace){$=J.v1;X=J.v2;T=J.v3;if(-1>$.positionScreen.z||1<$.positionScreen.z)continue;if(-1>X.positionScreen.z||1<X.positionScreen.z)continue;if(-1>T.positionScreen.z||1<T.positionScreen.z)continue;$.positionScreen.x*=z;$.positionScreen.y*=y;X.positionScreen.x*=z;X.positionScreen.y*=y;T.positionScreen.x*=z;T.positionScreen.y*=y;0<B.overdraw&&\n(g($.positionScreen,X.positionScreen,B.overdraw),g(X.positionScreen,T.positionScreen,B.overdraw),g(T.positionScreen,$.positionScreen,B.overdraw));ra.setFromPoints([$.positionScreen,X.positionScreen,T.positionScreen]);if(!0===Ka.isIntersectionBox(ra)){H=$;ea=X;R=T;E=B;v.info.render.vertices+=3;v.info.render.faces++;h(E.opacity);k(E.blending);ya=H.positionScreen.x;Ea=H.positionScreen.y;Aa=ea.positionScreen.x;za=ea.positionScreen.y;Oa=R.positionScreen.x;Pa=R.positionScreen.y;var B=ya,V=Ea,da=Aa,S=za,\nm=Oa,Ta=Pa;O.beginPath();O.moveTo(B,V);O.lineTo(da,S);O.lineTo(m,Ta);O.closePath();if((E instanceof THREE.MeshLambertMaterial||E instanceof THREE.MeshPhongMaterial)&&null===E.map){Ba.copy(E.color);Ya.copy(E.emissive);E.vertexColors===THREE.FaceColors&&Ba.multiply(J.color);G.copy(Da);xa.copy(H.positionWorld).add(ea.positionWorld).add(R.positionWorld).divideScalar(3);H=xa;ea=J.normalModel;R=G;J=0;for(B=D.length;J<B;J++)V=D[J],Za.copy(V.color),V instanceof THREE.DirectionalLight?(da=Ga.setFromMatrixPosition(V.matrixWorld).normalize(),\nS=ea.dot(da),0>=S||(S*=V.intensity,R.add(Za.multiplyScalar(S)))):V instanceof THREE.PointLight&&(da=Ga.setFromMatrixPosition(V.matrixWorld),S=ea.dot(Ga.subVectors(da,H).normalize()),0>=S||(S*=0==V.distance?1:1-Math.min(H.distanceTo(da)/V.distance,1),0!=S&&(S*=V.intensity,R.add(Za.multiplyScalar(S)))));G.multiply(Ba).add(Ya);!0===E.wireframe?b(G,E.wireframeLinewidth,E.wireframeLinecap,E.wireframeLinejoin):c(G)}else E instanceof THREE.MeshBasicMaterial||E instanceof THREE.MeshLambertMaterial||E instanceof\nTHREE.MeshPhongMaterial?null!==E.map?E.map.mapping instanceof THREE.UVMapping&&(ca=J.uvs,f(ya,Ea,Aa,za,Oa,Pa,ca[0].x,ca[0].y,ca[1].x,ca[1].y,ca[2].x,ca[2].y,E.map)):null!==E.envMap?E.envMap.mapping instanceof THREE.SphericalReflectionMapping?(ma.copy(J.vertexNormalsModel[0]).applyMatrix3(Ja),la=.5*ma.x+.5,qa=.5*ma.y+.5,ma.copy(J.vertexNormalsModel[1]).applyMatrix3(Ja),ua=.5*ma.x+.5,ja=.5*ma.y+.5,ma.copy(J.vertexNormalsModel[2]).applyMatrix3(Ja),Fa=.5*ma.x+.5,va=.5*ma.y+.5,f(ya,Ea,Aa,za,Oa,Pa,la,qa,\nua,ja,Fa,va,E.envMap)):E.envMap.mapping instanceof THREE.SphericalRefractionMapping&&(ma.copy(J.vertexNormalsModel[0]).applyMatrix3(Ja),la=-.5*ma.x+.5,qa=-.5*ma.y+.5,ma.copy(J.vertexNormalsModel[1]).applyMatrix3(Ja),ua=-.5*ma.x+.5,ja=-.5*ma.y+.5,ma.copy(J.vertexNormalsModel[2]).applyMatrix3(Ja),Fa=-.5*ma.x+.5,va=-.5*ma.y+.5,f(ya,Ea,Aa,za,Oa,Pa,la,qa,ua,ja,Fa,va,E.envMap)):(G.copy(E.color),E.vertexColors===THREE.FaceColors&&G.multiply(J.color),!0===E.wireframe?b(G,E.wireframeLinewidth,E.wireframeLinecap,\nE.wireframeLinejoin):c(G)):(E instanceof THREE.MeshDepthMaterial?G.r=G.g=G.b=1-p(H.positionScreen.z*H.positionScreen.w,oa.near,oa.far):E instanceof THREE.MeshNormalMaterial?(ma.copy(J.normalModel).applyMatrix3(Ja),G.setRGB(ma.x,ma.y,ma.z).multiplyScalar(.5).addScalar(.5)):G.setRGB(1,1,1),!0===E.wireframe?b(G,E.wireframeLinewidth,E.wireframeLinecap,E.wireframeLinejoin):c(G))}}aa.union(ra)}}O.setTransform(1,0,0,1,0,0)}}};THREE.ShaderChunk={};THREE.ShaderChunk.alphatest_fragment=\"#ifdef ALPHATEST\\n\\n\\tif ( gl_FragColor.a < ALPHATEST ) discard;\\n\\n#endif\\n\";\nTHREE.ShaderChunk.lights_lambert_vertex=\"vLightFront = vec3( 0.0 );\\n\\n#ifdef DOUBLE_SIDED\\n\\n\\tvLightBack = vec3( 0.0 );\\n\\n#endif\\n\\ntransformedNormal = normalize( transformedNormal );\\n\\n#if MAX_DIR_LIGHTS > 0\\n\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\n\\n\\tvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\n\\tvec3 dirVector = normalize( lDirection.xyz );\\n\\n\\tfloat dotProduct = dot( transformedNormal, dirVector );\\n\\tvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n\\n\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\tvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n\\n\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\tvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n\\n\\t\\t#endif\\n\\n\\t#endif\\n\\n\\t#ifdef WRAP_AROUND\\n\\n\\t\\tvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\n\\t\\tdirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\tdirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n\\n\\t\\t#endif\\n\\n\\t#endif\\n\\n\\tvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n\\n\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\tvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n\\n\\t#endif\\n\\n}\\n\\n#endif\\n\\n#if MAX_POINT_LIGHTS > 0\\n\\n\\tfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\n\\t\\tvec3 lVector = lPosition.xyz - mvPosition.xyz;\\n\\n\\t\\tfloat lDistance = 1.0;\\n\\t\\tif ( pointLightDistance[ i ] > 0.0 )\\n\\t\\t\\tlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\n\\n\\t\\tlVector = normalize( lVector );\\n\\t\\tfloat dotProduct = dot( transformedNormal, lVector );\\n\\n\\t\\tvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\tvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n\\n\\t\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\t\\tvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#endif\\n\\n\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\tvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\n\\t\\t\\tpointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n\\n\\t\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\t\\tpointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#endif\\n\\n\\t\\tvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\tvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n\\n\\t\\t#endif\\n\\n\\t}\\n\\n#endif\\n\\n#if MAX_SPOT_LIGHTS > 0\\n\\n\\tfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\n\\t\\tvec3 lVector = lPosition.xyz - mvPosition.xyz;\\n\\n\\t\\tfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\\n\\n\\t\\tif ( spotEffect > spotLightAngleCos[ i ] ) {\\n\\n\\t\\t\\tspotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\\n\\n\\t\\t\\tfloat lDistance = 1.0;\\n\\t\\t\\tif ( spotLightDistance[ i ] > 0.0 )\\n\\t\\t\\t\\tlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\n\\n\\t\\t\\tlVector = normalize( lVector );\\n\\n\\t\\t\\tfloat dotProduct = dot( transformedNormal, lVector );\\n\\t\\t\\tvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n\\n\\t\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\t\\tvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n\\n\\t\\t\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\t\\t\\tvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\t\\tvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\n\\t\\t\\t\\tspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n\\n\\t\\t\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\t\\t\\tspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n\\n\\t\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\t\\tvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t}\\n\\n\\t}\\n\\n#endif\\n\\n#if MAX_HEMI_LIGHTS > 0\\n\\n\\tfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\\n\\t\\tvec3 lVector = normalize( lDirection.xyz );\\n\\n\\t\\tfloat dotProduct = dot( transformedNormal, lVector );\\n\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\\n\\t\\tfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\\n\\n\\t\\tvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\\n\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\t\\tvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\\n\\n\\t\\t#endif\\n\\n\\t}\\n\\n#endif\\n\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n\\n#ifdef DOUBLE_SIDED\\n\\n\\tvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n\\n#endif\";\nTHREE.ShaderChunk.map_particle_pars_fragment=\"#ifdef USE_MAP\\n\\n\\tuniform sampler2D map;\\n\\n#endif\";THREE.ShaderChunk.default_vertex=\"vec4 mvPosition;\\n\\n#ifdef USE_SKINNING\\n\\n\\tmvPosition = modelViewMatrix * skinned;\\n\\n#endif\\n\\n#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\\n\\n\\tmvPosition = modelViewMatrix * vec4( morphed, 1.0 );\\n\\n#endif\\n\\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\\n\\n\\tmvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\n#endif\\n\\ngl_Position = projectionMatrix * mvPosition;\";\nTHREE.ShaderChunk.map_pars_fragment=\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\\n\\n\\tvarying vec2 vUv;\\n\\n#endif\\n\\n#ifdef USE_MAP\\n\\n\\tuniform sampler2D map;\\n\\n#endif\";THREE.ShaderChunk.skinnormal_vertex=\"#ifdef USE_SKINNING\\n\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\n\\t#ifdef USE_MORPHNORMALS\\n\\n\\tvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\\n\\n\\t#else\\n\\n\\tvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\\n\\n\\t#endif\\n\\n#endif\\n\";\nTHREE.ShaderChunk.logdepthbuf_pars_vertex=\"#ifdef USE_LOGDEPTHBUF\\n\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\n\\t\\tvarying float vFragDepth;\\n\\n\\t#endif\\n\\n\\tuniform float logDepthBufFC;\\n\\n#endif\";THREE.ShaderChunk.lightmap_pars_vertex=\"#ifdef USE_LIGHTMAP\\n\\n\\tvarying vec2 vUv2;\\n\\n#endif\";THREE.ShaderChunk.lights_phong_fragment=\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n\\n#ifdef DOUBLE_SIDED\\n\\n\\tnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n\\n#endif\\n\\n#ifdef USE_NORMALMAP\\n\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n\\n#elif defined( USE_BUMPMAP )\\n\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n\\n#endif\\n\\n#if MAX_POINT_LIGHTS > 0\\n\\n\\tvec3 pointDiffuse = vec3( 0.0 );\\n\\tvec3 pointSpecular = vec3( 0.0 );\\n\\n\\tfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\n\\t\\tvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\n\\n\\t\\tfloat lDistance = 1.0;\\n\\t\\tif ( pointLightDistance[ i ] > 0.0 )\\n\\t\\t\\tlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\n\\n\\t\\tlVector = normalize( lVector );\\n\\n\\t\\t\\t\\t// diffuse\\n\\n\\t\\tfloat dotProduct = dot( normal, lVector );\\n\\n\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\tfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\n\\t\\t\\tfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\n\\n\\t\\t\\tvec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n\\n\\t\\t#else\\n\\n\\t\\t\\tfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n\\n\\t\\t#endif\\n\\n\\t\\tpointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\n\\n\\t\\t\\t\\t// specular\\n\\n\\t\\tvec3 pointHalfVector = normalize( lVector + viewPosition );\\n\\t\\tfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\n\\t\\tfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n\\n\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\n\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );\\n\\t\\tpointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n\\n\\t}\\n\\n#endif\\n\\n#if MAX_SPOT_LIGHTS > 0\\n\\n\\tvec3 spotDiffuse = vec3( 0.0 );\\n\\tvec3 spotSpecular = vec3( 0.0 );\\n\\n\\tfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\n\\t\\tvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\n\\n\\t\\tfloat lDistance = 1.0;\\n\\t\\tif ( spotLightDistance[ i ] > 0.0 )\\n\\t\\t\\tlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\n\\n\\t\\tlVector = normalize( lVector );\\n\\n\\t\\tfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\n\\n\\t\\tif ( spotEffect > spotLightAngleCos[ i ] ) {\\n\\n\\t\\t\\tspotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\\n\\n\\t\\t\\t\\t\\t// diffuse\\n\\n\\t\\t\\tfloat dotProduct = dot( normal, lVector );\\n\\n\\t\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\t\\tfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\n\\t\\t\\t\\tfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\n\\n\\t\\t\\t\\tvec3 spotDiffuseWeight = mix( vec3( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\n\\n\\t\\t\\t\\t\\t// specular\\n\\n\\t\\t\\tvec3 spotHalfVector = normalize( lVector + viewPosition );\\n\\t\\t\\tfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\n\\t\\t\\tfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n\\n\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\n\\t\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, spotHalfVector ), 0.0 ), 5.0 );\\n\\t\\t\\tspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n\\n\\t\\t}\\n\\n\\t}\\n\\n#endif\\n\\n#if MAX_DIR_LIGHTS > 0\\n\\n\\tvec3 dirDiffuse = vec3( 0.0 );\\n\\tvec3 dirSpecular = vec3( 0.0 );\\n\\n\\tfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\n\\t\\tvec3 dirVector = normalize( lDirection.xyz );\\n\\n\\t\\t\\t\\t// diffuse\\n\\n\\t\\tfloat dotProduct = dot( normal, dirVector );\\n\\n\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\tfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\n\\t\\t\\tfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\n\\n\\t\\t\\tvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n\\n\\t\\t#else\\n\\n\\t\\t\\tfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n\\n\\t\\t#endif\\n\\n\\t\\tdirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\n\\n\\t\\t// specular\\n\\n\\t\\tvec3 dirHalfVector = normalize( dirVector + viewPosition );\\n\\t\\tfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\n\\t\\tfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n\\n\\t\\t/*\\n\\t\\t// fresnel term from skin shader\\n\\t\\tconst float F0 = 0.128;\\n\\n\\t\\tfloat base = 1.0 - dot( viewPosition, dirHalfVector );\\n\\t\\tfloat exponential = pow( base, 5.0 );\\n\\n\\t\\tfloat fresnel = exponential + F0 * ( 1.0 - exponential );\\n\\t\\t*/\\n\\n\\t\\t/*\\n\\t\\t// fresnel term from fresnel shader\\n\\t\\tconst float mFresnelBias = 0.08;\\n\\t\\tconst float mFresnelScale = 0.3;\\n\\t\\tconst float mFresnelPower = 5.0;\\n\\n\\t\\tfloat fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );\\n\\t\\t*/\\n\\n\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\n\\t\\t// \\t\\tdirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;\\n\\n\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );\\n\\t\\tdirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n\\n\\n\\t}\\n\\n#endif\\n\\n#if MAX_HEMI_LIGHTS > 0\\n\\n\\tvec3 hemiDiffuse = vec3( 0.0 );\\n\\tvec3 hemiSpecular = vec3( 0.0 );\\n\\n\\tfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\\n\\n\\t\\tvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\\n\\t\\tvec3 lVector = normalize( lDirection.xyz );\\n\\n\\t\\t// diffuse\\n\\n\\t\\tfloat dotProduct = dot( normal, lVector );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\\n\\n\\t\\tvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\\n\\n\\t\\themiDiffuse += diffuse * hemiColor;\\n\\n\\t\\t// specular (sky light)\\n\\n\\t\\tvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\\n\\t\\tfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\\n\\t\\tfloat hemiSpecularWeightSky = specularStrength * max( pow( max( hemiDotNormalHalfSky, 0.0 ), shininess ), 0.0 );\\n\\n\\t\\t// specular (ground light)\\n\\n\\t\\tvec3 lVectorGround = -lVector;\\n\\n\\t\\tvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\\n\\t\\tfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\\n\\t\\tfloat hemiSpecularWeightGround = specularStrength * max( pow( max( hemiDotNormalHalfGround, 0.0 ), shininess ), 0.0 );\\n\\n\\t\\tfloat dotProductGround = dot( normal, lVectorGround );\\n\\n\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\n\\t\\tvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, hemiHalfVectorSky ), 0.0 ), 5.0 );\\n\\t\\tvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 0.0 ), 5.0 );\\n\\t\\themiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\\n\\n\\t}\\n\\n#endif\\n\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n\\n#if MAX_DIR_LIGHTS > 0\\n\\n\\ttotalDiffuse += dirDiffuse;\\n\\ttotalSpecular += dirSpecular;\\n\\n#endif\\n\\n#if MAX_HEMI_LIGHTS > 0\\n\\n\\ttotalDiffuse += hemiDiffuse;\\n\\ttotalSpecular += hemiSpecular;\\n\\n#endif\\n\\n#if MAX_POINT_LIGHTS > 0\\n\\n\\ttotalDiffuse += pointDiffuse;\\n\\ttotalSpecular += pointSpecular;\\n\\n#endif\\n\\n#if MAX_SPOT_LIGHTS > 0\\n\\n\\ttotalDiffuse += spotDiffuse;\\n\\ttotalSpecular += spotSpecular;\\n\\n#endif\\n\\n#ifdef METAL\\n\\n\\tgl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n\\n#else\\n\\n\\tgl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n\\n#endif\";\nTHREE.ShaderChunk.fog_pars_fragment=\"#ifdef USE_FOG\\n\\n\\tuniform vec3 fogColor;\\n\\n\\t#ifdef FOG_EXP2\\n\\n\\t\\tuniform float fogDensity;\\n\\n\\t#else\\n\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n\\n#endif\";THREE.ShaderChunk.morphnormal_vertex=\"#ifdef USE_MORPHNORMALS\\n\\n\\tvec3 morphedNormal = vec3( 0.0 );\\n\\n\\tmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n\\n\\tmorphedNormal += normal;\\n\\n#endif\";\nTHREE.ShaderChunk.envmap_pars_fragment=\"#ifdef USE_ENVMAP\\n\\n\\tuniform float reflectivity;\\n\\tuniform samplerCube envMap;\\n\\tuniform float flipEnvMap;\\n\\tuniform int combine;\\n\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\n\\t\\tuniform bool useRefract;\\n\\t\\tuniform float refractionRatio;\\n\\n\\t#else\\n\\n\\t\\tvarying vec3 vReflect;\\n\\n\\t#endif\\n\\n#endif\";THREE.ShaderChunk.logdepthbuf_fragment=\"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n\\n#endif\";\nTHREE.ShaderChunk.normalmap_pars_fragment=\"#ifdef USE_NORMALMAP\\n\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\n\\t\\t\\t// Per-Pixel Tangent Space Normal Mapping\\n\\t\\t\\t// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html\\n\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\n\\t}\\n\\n#endif\\n\";\nTHREE.ShaderChunk.lights_phong_pars_vertex=\"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\\n\\n\\tvarying vec3 vWorldPosition;\\n\\n#endif\\n\";THREE.ShaderChunk.lightmap_pars_fragment=\"#ifdef USE_LIGHTMAP\\n\\n\\tvarying vec2 vUv2;\\n\\tuniform sampler2D lightMap;\\n\\n#endif\";THREE.ShaderChunk.shadowmap_vertex=\"#ifdef USE_SHADOWMAP\\n\\n\\tfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n\\n\\t\\tvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\\n\\n\\t}\\n\\n#endif\";\nTHREE.ShaderChunk.lights_phong_vertex=\"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\\n\\n\\tvWorldPosition = worldPosition.xyz;\\n\\n#endif\";THREE.ShaderChunk.map_fragment=\"#ifdef USE_MAP\\n\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\n\\t#ifdef GAMMA_INPUT\\n\\n\\t\\ttexelColor.xyz *= texelColor.xyz;\\n\\n\\t#endif\\n\\n\\tgl_FragColor = gl_FragColor * texelColor;\\n\\n#endif\";THREE.ShaderChunk.lightmap_vertex=\"#ifdef USE_LIGHTMAP\\n\\n\\tvUv2 = uv2;\\n\\n#endif\";\nTHREE.ShaderChunk.map_particle_fragment=\"#ifdef USE_MAP\\n\\n\\tgl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\\n\\n#endif\";THREE.ShaderChunk.color_pars_fragment=\"#ifdef USE_COLOR\\n\\n\\tvarying vec3 vColor;\\n\\n#endif\\n\";THREE.ShaderChunk.color_vertex=\"#ifdef USE_COLOR\\n\\n\\t#ifdef GAMMA_INPUT\\n\\n\\t\\tvColor = color * color;\\n\\n\\t#else\\n\\n\\t\\tvColor = color;\\n\\n\\t#endif\\n\\n#endif\";THREE.ShaderChunk.skinning_vertex=\"#ifdef USE_SKINNING\\n\\n\\t#ifdef USE_MORPHTARGETS\\n\\n\\tvec4 skinVertex = bindMatrix * vec4( morphed, 1.0 );\\n\\n\\t#else\\n\\n\\tvec4 skinVertex = bindMatrix * vec4( position, 1.0 );\\n\\n\\t#endif\\n\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\tskinned = bindMatrixInverse * skinned;\\n\\n#endif\\n\";\nTHREE.ShaderChunk.envmap_pars_vertex=\"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\\n\\n\\tvarying vec3 vReflect;\\n\\n\\tuniform float refractionRatio;\\n\\tuniform bool useRefract;\\n\\n#endif\\n\";THREE.ShaderChunk.linear_to_gamma_fragment=\"#ifdef GAMMA_OUTPUT\\n\\n\\tgl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n\\n#endif\";THREE.ShaderChunk.color_pars_vertex=\"#ifdef USE_COLOR\\n\\n\\tvarying vec3 vColor;\\n\\n#endif\";THREE.ShaderChunk.lights_lambert_pars_vertex=\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\n\\nuniform vec3 ambientLightColor;\\n\\n#if MAX_DIR_LIGHTS > 0\\n\\n\\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\n\\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_HEMI_LIGHTS > 0\\n\\n\\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\\n\\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\\n\\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_POINT_LIGHTS > 0\\n\\n\\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n\\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\n\\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_SPOT_LIGHTS > 0\\n\\n\\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\n\\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\n\\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n\\n#endif\\n\\n#ifdef WRAP_AROUND\\n\\n\\tuniform vec3 wrapRGB;\\n\\n#endif\\n\";\nTHREE.ShaderChunk.map_pars_vertex=\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\\n\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n\\n#endif\\n\";THREE.ShaderChunk.envmap_fragment=\"#ifdef USE_ENVMAP\\n\\n\\tvec3 reflectVec;\\n\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\n\\t\\t// http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations\\n\\t\\t// Transforming Normal Vectors with the Inverse Transformation\\n\\n\\t\\tvec3 worldNormal = normalize( vec3( vec4( normal, 0.0 ) * viewMatrix ) );\\n\\n\\t\\tif ( useRefract ) {\\n\\n\\t\\t\\treflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\n\\t\\t} else { \\n\\n\\t\\t\\treflectVec = reflect( cameraToVertex, worldNormal );\\n\\n\\t\\t}\\n\\n\\t#else\\n\\n\\t\\treflectVec = vReflect;\\n\\n\\t#endif\\n\\n\\t#ifdef DOUBLE_SIDED\\n\\n\\t\\tfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n\\t\\tvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\n\\t#else\\n\\n\\t\\tvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\n\\t#endif\\n\\n\\t#ifdef GAMMA_INPUT\\n\\n\\t\\tcubeColor.xyz *= cubeColor.xyz;\\n\\n\\t#endif\\n\\n\\tif ( combine == 1 ) {\\n\\n\\t\\tgl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\\n\\n\\t} else if ( combine == 2 ) {\\n\\n\\t\\tgl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;\\n\\n\\t} else {\\n\\n\\t\\tgl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\\n\\n\\t}\\n\\n#endif\";\nTHREE.ShaderChunk.specularmap_pars_fragment=\"#ifdef USE_SPECULARMAP\\n\\n\\tuniform sampler2D specularMap;\\n\\n#endif\";THREE.ShaderChunk.logdepthbuf_vertex=\"#ifdef USE_LOGDEPTHBUF\\n\\n\\tgl_Position.z = log2(max(1e-6, gl_Position.w + 1.0)) * logDepthBufFC;\\n\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\n#else\\n\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\n\\t#endif\\n\\n#endif\";THREE.ShaderChunk.morphtarget_pars_vertex=\"#ifdef USE_MORPHTARGETS\\n\\n\\t#ifndef USE_MORPHNORMALS\\n\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\n\\t#else\\n\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\n\\t#endif\\n\\n#endif\";\nTHREE.ShaderChunk.specularmap_fragment=\"float specularStrength;\\n\\n#ifdef USE_SPECULARMAP\\n\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n\\n#else\\n\\n\\tspecularStrength = 1.0;\\n\\n#endif\";THREE.ShaderChunk.fog_fragment=\"#ifdef USE_FOG\\n\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\n\\t#else\\n\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\n\\t#endif\\n\\n\\t#ifdef FOG_EXP2\\n\\n\\t\\tconst float LOG2 = 1.442695;\\n\\t\\tfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\n\\t\\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n\\n\\t#else\\n\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\n\\t#endif\\n\\t\\n\\tgl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n\\n#endif\";\nTHREE.ShaderChunk.bumpmap_pars_fragment=\"#ifdef USE_BUMPMAP\\n\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\n\\t\\t\\t// Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen\\n\\t\\t\\t//\\thttp://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html\\n\\n\\t\\t\\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\\n\\n\\tvec2 dHdxy_fwd() {\\n\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\n\\t\\treturn vec2( dBx, dBy );\\n\\n\\t}\\n\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\n\\t\\tvec3 vN = surf_norm;\\t\\t// normalized\\n\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\n\\t}\\n\\n#endif\";\nTHREE.ShaderChunk.defaultnormal_vertex=\"vec3 objectNormal;\\n\\n#ifdef USE_SKINNING\\n\\n\\tobjectNormal = skinnedNormal.xyz;\\n\\n#endif\\n\\n#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\\n\\n\\tobjectNormal = morphedNormal;\\n\\n#endif\\n\\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\\n\\n\\tobjectNormal = normal;\\n\\n#endif\\n\\n#ifdef FLIP_SIDED\\n\\n\\tobjectNormal = -objectNormal;\\n\\n#endif\\n\\nvec3 transformedNormal = normalMatrix * objectNormal;\";\nTHREE.ShaderChunk.lights_phong_pars_fragment=\"uniform vec3 ambientLightColor;\\n\\n#if MAX_DIR_LIGHTS > 0\\n\\n\\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\n\\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_HEMI_LIGHTS > 0\\n\\n\\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\\n\\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\\n\\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_POINT_LIGHTS > 0\\n\\n\\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n\\n\\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\n\\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_SPOT_LIGHTS > 0\\n\\n\\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\n\\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\n\\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n\\n\\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n\\n#endif\\n\\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\\n\\n\\tvarying vec3 vWorldPosition;\\n\\n#endif\\n\\n#ifdef WRAP_AROUND\\n\\n\\tuniform vec3 wrapRGB;\\n\\n#endif\\n\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\";\nTHREE.ShaderChunk.skinbase_vertex=\"#ifdef USE_SKINNING\\n\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n\\n#endif\";THREE.ShaderChunk.map_vertex=\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\\n\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n\\n#endif\";\nTHREE.ShaderChunk.lightmap_fragment=\"#ifdef USE_LIGHTMAP\\n\\n\\tgl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n\\n#endif\";THREE.ShaderChunk.shadowmap_pars_vertex=\"#ifdef USE_SHADOWMAP\\n\\n\\tvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\n\\tuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n\\n#endif\";THREE.ShaderChunk.color_fragment=\"#ifdef USE_COLOR\\n\\n\\tgl_FragColor = gl_FragColor * vec4( vColor, 1.0 );\\n\\n#endif\";THREE.ShaderChunk.morphtarget_vertex=\"#ifdef USE_MORPHTARGETS\\n\\n\\tvec3 morphed = vec3( 0.0 );\\n\\tmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\tmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\tmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\tmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\n\\t#ifndef USE_MORPHNORMALS\\n\\n\\tmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\tmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\tmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\tmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\n\\t#endif\\n\\n\\tmorphed += position;\\n\\n#endif\";\nTHREE.ShaderChunk.envmap_vertex=\"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\\n\\n\\tvec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\\n\\tworldNormal = normalize( worldNormal );\\n\\n\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\n\\tif ( useRefract ) {\\n\\n\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\n\\t} else {\\n\\n\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\n\\t}\\n\\n#endif\";\nTHREE.ShaderChunk.shadowmap_fragment=\"#ifdef USE_SHADOWMAP\\n\\n\\t#ifdef SHADOWMAP_DEBUG\\n\\n\\t\\tvec3 frustumColors[3];\\n\\t\\tfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\n\\t\\tfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\n\\t\\tfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n\\n\\t#endif\\n\\n\\t#ifdef SHADOWMAP_CASCADE\\n\\n\\t\\tint inFrustumCount = 0;\\n\\n\\t#endif\\n\\n\\tfloat fDepth;\\n\\tvec3 shadowColor = vec3( 1.0 );\\n\\n\\tfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n\\n\\t\\tvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\n\\n\\t\\t\\t\\t// if ( something && something ) breaks ATI OpenGL shader compiler\\n\\t\\t\\t\\t// if ( all( something, something ) ) using this instead\\n\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\n\\t\\t\\t\\t// don't shadow pixels outside of light frustum\\n\\t\\t\\t\\t// use just first frustum (for cascades)\\n\\t\\t\\t\\t// don't shadow pixels behind far plane of light frustum\\n\\n\\t\\t#ifdef SHADOWMAP_CASCADE\\n\\n\\t\\t\\tinFrustumCount += int( inFrustum );\\n\\t\\t\\tbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n\\n\\t\\t#else\\n\\n\\t\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\n\\t\\t#endif\\n\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\n\\t\\tif ( frustumTest ) {\\n\\n\\t\\t\\tshadowCoord.z += shadowBias[ i ];\\n\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\n\\t\\t\\t\\t\\t\\t// Percentage-close filtering\\n\\t\\t\\t\\t\\t\\t// (9 pixel kernel)\\n\\t\\t\\t\\t\\t\\t// http://fabiensanglard.net/shadowmappingPCF/\\n\\n\\t\\t\\t\\tfloat shadow = 0.0;\\n\\n\\t\\t/*\\n\\t\\t\\t\\t\\t\\t// nested loops breaks shader compiler / validator on some ATI cards when using OpenGL\\n\\t\\t\\t\\t\\t\\t// must enroll loop manually\\n\\n\\t\\t\\t\\tfor ( float y = -1.25; y <= 1.25; y += 1.25 )\\n\\t\\t\\t\\t\\tfor ( float x = -1.25; x <= 1.25; x += 1.25 ) {\\n\\n\\t\\t\\t\\t\\t\\tvec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// doesn't seem to produce any noticeable visual difference compared to simple texture2D lookup\\n\\t\\t\\t\\t\\t\\t\\t\\t//vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );\\n\\n\\t\\t\\t\\t\\t\\tfloat fDepth = unpackDepth( rgbaDepth );\\n\\n\\t\\t\\t\\t\\t\\tif ( fDepth < shadowCoord.z )\\n\\t\\t\\t\\t\\t\\t\\tshadow += 1.0;\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tshadow /= 9.0;\\n\\n\\t\\t*/\\n\\n\\t\\t\\t\\tconst float shadowDelta = 1.0 / 9.0;\\n\\n\\t\\t\\t\\tfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\n\\t\\t\\t\\tfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\n\\n\\t\\t\\t\\tfloat dx0 = -1.25 * xPixelOffset;\\n\\t\\t\\t\\tfloat dy0 = -1.25 * yPixelOffset;\\n\\t\\t\\t\\tfloat dx1 = 1.25 * xPixelOffset;\\n\\t\\t\\t\\tfloat dy1 = 1.25 * yPixelOffset;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\n\\n\\t\\t\\t\\tshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n\\n\\t\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\n\\t\\t\\t\\t\\t\\t// Percentage-close filtering\\n\\t\\t\\t\\t\\t\\t// (9 pixel kernel)\\n\\t\\t\\t\\t\\t\\t// http://fabiensanglard.net/shadowmappingPCF/\\n\\n\\t\\t\\t\\tfloat shadow = 0.0;\\n\\n\\t\\t\\t\\tfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\n\\t\\t\\t\\tfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\n\\n\\t\\t\\t\\tfloat dx0 = -1.0 * xPixelOffset;\\n\\t\\t\\t\\tfloat dy0 = -1.0 * yPixelOffset;\\n\\t\\t\\t\\tfloat dx1 = 1.0 * xPixelOffset;\\n\\t\\t\\t\\tfloat dy1 = 1.0 * yPixelOffset;\\n\\n\\t\\t\\t\\tmat3 shadowKernel;\\n\\t\\t\\t\\tmat3 depthKernel;\\n\\n\\t\\t\\t\\tdepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\n\\t\\t\\t\\tdepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\n\\t\\t\\t\\tdepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\n\\t\\t\\t\\tdepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\n\\t\\t\\t\\tdepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\n\\t\\t\\t\\tdepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\n\\t\\t\\t\\tdepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\n\\t\\t\\t\\tdepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\n\\t\\t\\t\\tdepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\n\\n\\t\\t\\t\\tvec3 shadowZ = vec3( shadowCoord.z );\\n\\t\\t\\t\\tshadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\\n\\t\\t\\t\\tshadowKernel[0] *= vec3(0.25);\\n\\n\\t\\t\\t\\tshadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\\n\\t\\t\\t\\tshadowKernel[1] *= vec3(0.25);\\n\\n\\t\\t\\t\\tshadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\\n\\t\\t\\t\\tshadowKernel[2] *= vec3(0.25);\\n\\n\\t\\t\\t\\tvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\\n\\n\\t\\t\\t\\tshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\\n\\t\\t\\t\\tshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\\n\\n\\t\\t\\t\\tvec4 shadowValues;\\n\\t\\t\\t\\tshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\\n\\t\\t\\t\\tshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\\n\\t\\t\\t\\tshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\\n\\t\\t\\t\\tshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\\n\\n\\t\\t\\t\\tshadow = dot( shadowValues, vec4( 1.0 ) );\\n\\n\\t\\t\\t\\tshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\n\\t\\t\\t\\tfloat fDepth = unpackDepth( rgbaDepth );\\n\\n\\t\\t\\t\\tif ( fDepth < shadowCoord.z )\\n\\n\\t\\t// spot with multiple shadows is darker\\n\\n\\t\\t\\t\\t\\tshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n\\n\\t\\t// spot with multiple shadows has the same color as single shadow spot\\n\\n\\t\\t// \\t\\t\\t\\t\\tshadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t}\\n\\n\\n\\t\\t#ifdef SHADOWMAP_DEBUG\\n\\n\\t\\t\\t#ifdef SHADOWMAP_CASCADE\\n\\n\\t\\t\\t\\tif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#endif\\n\\n\\t}\\n\\n\\t#ifdef GAMMA_OUTPUT\\n\\n\\t\\tshadowColor *= shadowColor;\\n\\n\\t#endif\\n\\n\\tgl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n\\n#endif\\n\";\nTHREE.ShaderChunk.worldpos_vertex=\"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\n\\t#ifdef USE_SKINNING\\n\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\n\\t#endif\\n\\n\\t#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\\n\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\\n\\n\\t#endif\\n\\n\\t#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\\n\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\\n\\n\\t#endif\\n\\n#endif\";\nTHREE.ShaderChunk.shadowmap_pars_fragment=\"#ifdef USE_SHADOWMAP\\n\\n\\tuniform sampler2D shadowMap[ MAX_SHADOWS ];\\n\\tuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\n\\n\\tuniform float shadowDarkness[ MAX_SHADOWS ];\\n\\tuniform float shadowBias[ MAX_SHADOWS ];\\n\\n\\tvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\n\\n\\tfloat unpackDepth( const in vec4 rgba_depth ) {\\n\\n\\t\\tconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\n\\t\\tfloat depth = dot( rgba_depth, bit_shift );\\n\\t\\treturn depth;\\n\\n\\t}\\n\\n#endif\";\nTHREE.ShaderChunk.skinning_pars_vertex=\"#ifdef USE_SKINNING\\n\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\n\\t#ifdef BONE_TEXTURE\\n\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\n\\t\\t\\treturn bone;\\n\\n\\t\\t}\\n\\n\\t#else\\n\\n\\t\\tuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\n\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\n\\t\\t\\tmat4 bone = boneGlobalMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\n\\t\\t}\\n\\n\\t#endif\\n\\n#endif\\n\";\nTHREE.ShaderChunk.logdepthbuf_pars_fragment=\"#ifdef USE_LOGDEPTHBUF\\n\\n\\tuniform float logDepthBufFC;\\n\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\n\\t\\t#extension GL_EXT_frag_depth : enable\\n\\t\\tvarying float vFragDepth;\\n\\n\\t#endif\\n\\n#endif\";THREE.ShaderChunk.alphamap_fragment=\"#ifdef USE_ALPHAMAP\\n\\n\\tgl_FragColor.a *= texture2D( alphaMap, vUv ).g;\\n\\n#endif\\n\";THREE.ShaderChunk.alphamap_pars_fragment=\"#ifdef USE_ALPHAMAP\\n\\n\\tuniform sampler2D alphaMap;\\n\\n#endif\\n\";\nTHREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b<a.length;b++)for(c in d=this.clone(a[b]),d)e[c]=d[c];return e},clone:function(a){var b,c,d,e={};for(b in a)for(c in e[b]={},a[b])d=a[b][c],e[b][c]=d instanceof THREE.Color||d instanceof THREE.Vector2||d instanceof THREE.Vector3||d instanceof THREE.Vector4||d instanceof THREE.Matrix4||d instanceof THREE.Texture?d.clone():d instanceof Array?d.slice():d;return e}};\nTHREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:null},specularMap:{type:\"t\",value:null},alphaMap:{type:\"t\",value:null},envMap:{type:\"t\",value:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",\nvalue:0}},bump:{bumpMap:{type:\"t\",value:null},bumpScale:{type:\"f\",value:1}},normalmap:{normalMap:{type:\"t\",value:null},normalScale:{type:\"v2\",value:new THREE.Vector2(1,1)}},fog:{fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},hemisphereLightDirection:{type:\"fv\",value:[]},\nhemisphereLightSkyColor:{type:\"fv\",value:[]},hemisphereLightGroundColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",value:[]},spotLightAngleCos:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},\nopacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:null},fogDensity:{type:\"f\",value:2.5E-4},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2E3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",value:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};\nTHREE.ShaderLib={basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.map_vertex,\nTHREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinbase_vertex,\"\\t#ifdef USE_ENVMAP\",THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,\"\\t#endif\",THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),\nfragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tgl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.logdepthbuf_fragment,\nTHREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,\n{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,\nTHREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.worldpos_vertex,\nTHREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\nTHREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tgl_FragColor = vec4( vec3( 1.0 ), opacity );\",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,\"\\t#ifdef DOUBLE_SIDED\\n\\t\\tif ( gl_FrontFacing )\\n\\t\\t\\tgl_FragColor.xyz *= vLightFront;\\n\\t\\telse\\n\\t\\t\\tgl_FragColor.xyz *= vLightBack;\\n\\t#else\\n\\t\\tgl_FragColor.xyz *= vLightFront;\\n\\t#endif\",\nTHREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.bump,THREE.UniformsLib.normalmap,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},\nspecular:{type:\"c\",value:new THREE.Color(1118481)},shininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"#define PHONG\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\nTHREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,\"\\tvNormal = normalize( transformedNormal );\",THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.logdepthbuf_vertex,\"\\tvViewPosition = -mvPosition.xyz;\",\nTHREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,\nTHREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.bumpmap_pars_fragment,THREE.ShaderChunk.normalmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tgl_FragColor = vec4( vec3( 1.0 ), opacity );\",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,\nTHREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\nTHREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\tgl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",\nTHREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tgl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},dashed:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,\nTHREE.UniformsLib.fog,{scale:{type:\"f\",value:1},dashSize:{type:\"f\",value:1},totalSize:{type:\"f\",value:2}}]),vertexShader:[\"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\",THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.logdepthbuf_vertex,\n\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tgl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.fog_fragment,\n\"}\"].join(\"\\n\")},depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2E3},opacity:{type:\"f\",value:1}},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.logdepthbuf_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\",THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\",THREE.ShaderChunk.logdepthbuf_fragment,\n\"\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\tfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\n\\tgl_FragColor = vec4( vec3( color ), opacity );\\n}\"].join(\"\\n\")},normal:{uniforms:{opacity:{type:\"f\",value:1}},vertexShader:[\"varying vec3 vNormal;\",THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\\n\\tvNormal = normalize( normalMatrix * normal );\",\nTHREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.logdepthbuf_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tgl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\",THREE.ShaderChunk.logdepthbuf_fragment,\"}\"].join(\"\\n\")},normalmap:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",\nvalue:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},enableDisplacement:{type:\"i\",value:0},tDisplacement:{type:\"t\",value:null},tDiffuse:{type:\"t\",value:null},tCube:{type:\"t\",value:null},tNormal:{type:\"t\",value:null},tSpecular:{type:\"t\",value:null},tAO:{type:\"t\",value:null},uNormalScale:{type:\"v2\",value:new THREE.Vector2(1,1)},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},diffuse:{type:\"c\",value:new THREE.Color(16777215)},\nspecular:{type:\"c\",value:new THREE.Color(1118481)},ambient:{type:\"c\",value:new THREE.Color(16777215)},shininess:{type:\"f\",value:30},opacity:{type:\"f\",value:1},useRefract:{type:\"i\",value:0},refractionRatio:{type:\"f\",value:.98},reflectivity:{type:\"f\",value:.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),fragmentShader:[\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform vec2 uNormalScale;\\nuniform bool useRefract;\\nuniform float refractionRatio;\\nuniform float reflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\n\\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\n\\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\n\\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\\n\\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\\n\\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\n\\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n\\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\n\\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\n\\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\n\\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\n\\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n\\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\n\\tuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vWorldPosition;\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\",THREE.ShaderChunk.logdepthbuf_fragment,\"\\tgl_FragColor = vec4( vec3( 1.0 ), opacity );\\n\\tvec3 specularTex = vec3( 1.0 );\\n\\tvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\n\\tnormalTex.xy *= uNormalScale;\\n\\tnormalTex = normalize( normalTex );\\n\\tif( enableDiffuse ) {\\n\\t\\t#ifdef GAMMA_INPUT\\n\\t\\t\\tvec4 texelColor = texture2D( tDiffuse, vUv );\\n\\t\\t\\ttexelColor.xyz *= texelColor.xyz;\\n\\t\\t\\tgl_FragColor = gl_FragColor * texelColor;\\n\\t\\t#else\\n\\t\\t\\tgl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n\\t\\t#endif\\n\\t}\\n\\tif( enableAO ) {\\n\\t\\t#ifdef GAMMA_INPUT\\n\\t\\t\\tvec4 aoColor = texture2D( tAO, vUv );\\n\\t\\t\\taoColor.xyz *= aoColor.xyz;\\n\\t\\t\\tgl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n\\t\\t#else\\n\\t\\t\\tgl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n\\t\\t#endif\\n\\t}\",\nTHREE.ShaderChunk.alphatest_fragment,\"\\tif( enableSpecular )\\n\\t\\tspecularTex = texture2D( tSpecular, vUv ).xyz;\\n\\tmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\n\\tvec3 finalNormal = tsb * normalTex;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tfinalNormal = -finalNormal;\\n\\t#endif\\n\\tvec3 normal = normalize( finalNormal );\\n\\tvec3 viewPosition = normalize( vViewPosition );\\n\\t#if MAX_POINT_LIGHTS > 0\\n\\t\\tvec3 pointDiffuse = vec3( 0.0 );\\n\\t\\tvec3 pointSpecular = vec3( 0.0 );\\n\\t\\tfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n\\t\\t\\tvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\n\\t\\t\\tvec3 pointVector = lPosition.xyz + vViewPosition.xyz;\\n\\t\\t\\tfloat pointDistance = 1.0;\\n\\t\\t\\tif ( pointLightDistance[ i ] > 0.0 )\\n\\t\\t\\t\\tpointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\\n\\t\\t\\tpointVector = normalize( pointVector );\\n\\t\\t\\t#ifdef WRAP_AROUND\\n\\t\\t\\t\\tfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\n\\t\\t\\t\\tfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\n\\t\\t\\t\\tvec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t\\tpointDiffuse += pointDistance * pointLightColor[ i ] * diffuse * pointDiffuseWeight;\\n\\t\\t\\tvec3 pointHalfVector = normalize( pointVector + viewPosition );\\n\\t\\t\\tfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\n\\t\\t\\tfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\t\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( pointVector, pointHalfVector ), 0.0 ), 5.0 );\\n\\t\\t\\tpointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n\\t\\t}\\n\\t#endif\\n\\t#if MAX_SPOT_LIGHTS > 0\\n\\t\\tvec3 spotDiffuse = vec3( 0.0 );\\n\\t\\tvec3 spotSpecular = vec3( 0.0 );\\n\\t\\tfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n\\t\\t\\tvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\n\\t\\t\\tvec3 spotVector = lPosition.xyz + vViewPosition.xyz;\\n\\t\\t\\tfloat spotDistance = 1.0;\\n\\t\\t\\tif ( spotLightDistance[ i ] > 0.0 )\\n\\t\\t\\t\\tspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\\n\\t\\t\\tspotVector = normalize( spotVector );\\n\\t\\t\\tfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\n\\t\\t\\tif ( spotEffect > spotLightAngleCos[ i ] ) {\\n\\t\\t\\t\\tspotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\\n\\t\\t\\t\\t#ifdef WRAP_AROUND\\n\\t\\t\\t\\t\\tfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\\n\\t\\t\\t\\t\\tfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\\n\\t\\t\\t\\t\\tvec3 spotDiffuseWeight = mix( vec3( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t\\tspotDiffuse += spotDistance * spotLightColor[ i ] * diffuse * spotDiffuseWeight * spotEffect;\\n\\t\\t\\t\\tvec3 spotHalfVector = normalize( spotVector + viewPosition );\\n\\t\\t\\t\\tfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\n\\t\\t\\t\\tfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n\\t\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\t\\t\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( spotVector, spotHalfVector ), 0.0 ), 5.0 );\\n\\t\\t\\t\\tspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t#endif\\n\\t#if MAX_DIR_LIGHTS > 0\\n\\t\\tvec3 dirDiffuse = vec3( 0.0 );\\n\\t\\tvec3 dirSpecular = vec3( 0.0 );\\n\\t\\tfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\n\\t\\t\\tvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\n\\t\\t\\tvec3 dirVector = normalize( lDirection.xyz );\\n\\t\\t\\t#ifdef WRAP_AROUND\\n\\t\\t\\t\\tfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\n\\t\\t\\t\\tfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\n\\t\\t\\t\\tvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t\\tdirDiffuse += directionalLightColor[ i ] * diffuse * dirDiffuseWeight;\\n\\t\\t\\tvec3 dirHalfVector = normalize( dirVector + viewPosition );\\n\\t\\t\\tfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\n\\t\\t\\tfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\t\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );\\n\\t\\t\\tdirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n\\t\\t}\\n\\t#endif\\n\\t#if MAX_HEMI_LIGHTS > 0\\n\\t\\tvec3 hemiDiffuse = vec3( 0.0 );\\n\\t\\tvec3 hemiSpecular = vec3( 0.0 );\\n\\t\\tfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\\n\\t\\t\\tvec3 lVector = normalize( lDirection.xyz );\\n\\t\\t\\tfloat dotProduct = dot( normal, lVector );\\n\\t\\t\\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\\n\\t\\t\\tvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\\n\\t\\t\\themiDiffuse += diffuse * hemiColor;\\n\\t\\t\\tvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\\n\\t\\t\\tfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\\n\\t\\t\\tfloat hemiSpecularWeightSky = specularTex.r * max( pow( max( hemiDotNormalHalfSky, 0.0 ), shininess ), 0.0 );\\n\\t\\t\\tvec3 lVectorGround = -lVector;\\n\\t\\t\\tvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\\n\\t\\t\\tfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\\n\\t\\t\\tfloat hemiSpecularWeightGround = specularTex.r * max( pow( max( hemiDotNormalHalfGround, 0.0 ), shininess ), 0.0 );\\n\\t\\t\\tfloat dotProductGround = dot( normal, lVectorGround );\\n\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\t\\t\\tvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, hemiHalfVectorSky ), 0.0 ), 5.0 );\\n\\t\\t\\tvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 0.0 ), 5.0 );\\n\\t\\t\\themiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\\n\\t\\t}\\n\\t#endif\\n\\tvec3 totalDiffuse = vec3( 0.0 );\\n\\tvec3 totalSpecular = vec3( 0.0 );\\n\\t#if MAX_DIR_LIGHTS > 0\\n\\t\\ttotalDiffuse += dirDiffuse;\\n\\t\\ttotalSpecular += dirSpecular;\\n\\t#endif\\n\\t#if MAX_HEMI_LIGHTS > 0\\n\\t\\ttotalDiffuse += hemiDiffuse;\\n\\t\\ttotalSpecular += hemiSpecular;\\n\\t#endif\\n\\t#if MAX_POINT_LIGHTS > 0\\n\\t\\ttotalDiffuse += pointDiffuse;\\n\\t\\ttotalSpecular += pointSpecular;\\n\\t#endif\\n\\t#if MAX_SPOT_LIGHTS > 0\\n\\t\\ttotalDiffuse += spotDiffuse;\\n\\t\\ttotalSpecular += spotSpecular;\\n\\t#endif\\n\\t#ifdef METAL\\n\\t\\tgl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n\\t#else\\n\\t\\tgl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n\\t#endif\\n\\tif ( enableReflection ) {\\n\\t\\tvec3 vReflect;\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tif ( useRefract ) {\\n\\t\\t\\tvReflect = refract( cameraToVertex, normal, refractionRatio );\\n\\t\\t} else {\\n\\t\\t\\tvReflect = reflect( cameraToVertex, normal );\\n\\t\\t}\\n\\t\\tvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n\\t\\t#ifdef GAMMA_INPUT\\n\\t\\t\\tcubeColor.xyz *= cubeColor.xyz;\\n\\t\\t#endif\\n\\t\\tgl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * reflectivity );\\n\\t}\",\nTHREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\nuniform bool enableDisplacement;\\n#ifdef VERTEX_TEXTURES\\n\\tuniform sampler2D tDisplacement;\\n\\tuniform float uDisplacementScale;\\n\\tuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nvarying vec3 vWorldPosition;\\nvarying vec3 vViewPosition;\",\nTHREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,\"\\t#ifdef USE_SKINNING\\n\\t\\tvNormal = normalize( normalMatrix * skinnedNormal.xyz );\\n\\t\\tvec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\\n\\t\\tvTangent = normalize( normalMatrix * skinnedTangent.xyz );\\n\\t#else\\n\\t\\tvNormal = normalize( normalMatrix * normal );\\n\\t\\tvTangent = normalize( normalMatrix * tangent.xyz );\\n\\t#endif\\n\\tvBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\tvUv = uv * uRepeat + uOffset;\\n\\tvec3 displacedPosition;\\n\\t#ifdef VERTEX_TEXTURES\\n\\t\\tif ( enableDisplacement ) {\\n\\t\\t\\tvec3 dv = texture2D( tDisplacement, uv ).xyz;\\n\\t\\t\\tfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\n\\t\\t\\tdisplacedPosition = position + normalize( normal ) * df;\\n\\t\\t} else {\\n\\t\\t\\t#ifdef USE_SKINNING\\n\\t\\t\\t\\tvec4 skinVertex = bindMatrix * vec4( position, 1.0 );\\n\\t\\t\\t\\tvec4 skinned = vec4( 0.0 );\\n\\t\\t\\t\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\t\\t\\t\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\t\\t\\t\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\t\\t\\t\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\t\\t\\t\\tskinned = bindMatrixInverse * skinned;\\n\\t\\t\\t\\tdisplacedPosition = skinned.xyz;\\n\\t\\t\\t#else\\n\\t\\t\\t\\tdisplacedPosition = position;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifdef USE_SKINNING\\n\\t\\t\\tvec4 skinVertex = bindMatrix * vec4( position, 1.0 );\\n\\t\\t\\tvec4 skinned = vec4( 0.0 );\\n\\t\\t\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\t\\t\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\t\\t\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\t\\t\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\t\\t\\tskinned = bindMatrixInverse * skinned;\\n\\t\\t\\tdisplacedPosition = skinned.xyz;\\n\\t\\t#else\\n\\t\\t\\tdisplacedPosition = position;\\n\\t\\t#endif\\n\\t#endif\\n\\tvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\\n\\tvec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\",\nTHREE.ShaderChunk.logdepthbuf_vertex,\"\\tvWorldPosition = worldPosition.xyz;\\n\\tvViewPosition = -mvPosition.xyz;\\n\\t#ifdef USE_SHADOWMAP\\n\\t\\tfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\n\\t\\t\\tvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\\n\\t\\t}\\n\\t#endif\\n}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:null},tFlip:{type:\"f\",value:-1}},vertexShader:[\"varying vec3 vWorldPosition;\",THREE.ShaderChunk.logdepthbuf_pars_vertex,\"void main() {\\n\\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\\n\\tvWorldPosition = worldPosition.xyz;\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\nTHREE.ShaderChunk.logdepthbuf_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\",THREE.ShaderChunk.logdepthbuf_pars_fragment,\"void main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\",THREE.ShaderChunk.logdepthbuf_fragment,\"}\"].join(\"\\n\")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,\n\"void main() {\",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.logdepthbuf_vertex,\"}\"].join(\"\\n\"),fragmentShader:[THREE.ShaderChunk.logdepthbuf_pars_fragment,\"vec4 pack_depth( const in float depth ) {\\n\\tconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\n\\tconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\n\\tvec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );\\n\\tres -= res.xxyz * bit_mask;\\n\\treturn res;\\n}\\nvoid main() {\",\nTHREE.ShaderChunk.logdepthbuf_fragment,\"\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tgl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );\\n\\t#else\\n\\t\\tgl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n\\t#endif\\n}\"].join(\"\\n\")}};\nTHREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var g=1;\"v2\"===f.type?g=2:\"v3\"===f.type?g=3:\"v4\"===f.type?g=4:\"c\"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=m.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}}\nfunction c(a,b){var c=b.geometry,g=a.faces3,h=3*g.length,k=1*g.length,l=3*g.length,g=d(b,a),n=f(g),r=e(g),p=g.vertexColors?g.vertexColors:!1;a.__vertexArray=new Float32Array(3*h);r&&(a.__normalArray=new Float32Array(3*h));c.hasTangents&&(a.__tangentArray=new Float32Array(4*h));p&&(a.__colorArray=new Float32Array(3*h));n&&(0<c.faceVertexUvs.length&&(a.__uvArray=new Float32Array(2*h)),1<c.faceVertexUvs.length&&(a.__uv2Array=new Float32Array(2*h)));b.geometry.skinWeights.length&&b.geometry.skinIndices.length&&\n(a.__skinIndexArray=new Float32Array(4*h),a.__skinWeightArray=new Float32Array(4*h));c=null!==Eb&&21845<k?Uint32Array:Uint16Array;a.__typeArray=c;a.__faceArray=new c(3*k);a.__lineArray=new c(2*l);if(a.numMorphTargets)for(a.__morphTargetsArrays=[],c=0,n=a.numMorphTargets;c<n;c++)a.__morphTargetsArrays.push(new Float32Array(3*h));if(a.numMorphNormals)for(a.__morphNormalsArrays=[],c=0,n=a.numMorphNormals;c<n;c++)a.__morphNormalsArrays.push(new Float32Array(3*h));a.__webglFaceCount=3*k;a.__webglLineCount=\n2*l;if(g.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var q in g.attributes){var k=g.attributes[q],l={},s;for(s in k)l[s]=k[s];if(!l.__webglInitialized||l.createUniqueBuffers)l.__webglInitialized=!0,c=1,\"v2\"===l.type?c=2:\"v3\"===l.type?c=3:\"v4\"===l.type?c=4:\"c\"===l.type&&(c=3),l.size=c,l.array=new Float32Array(h*c),l.buffer=m.createBuffer(),l.buffer.belongsToAttribute=q,k.needsUpdate=!0,l.__original=k;a.__webglCustomAttributesList.push(l)}}a.__inittedArrays=\n!0}function d(a,b){return a.material instanceof THREE.MeshFaceMaterial?a.material.materials[b.materialIndex]:a.material}function e(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?!1:a&&void 0!==a.shading&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function f(a){return a.map||a.lightMap||a.bumpMap||a.normalMap||a.specularMap||a.alphaMap||a instanceof THREE.ShaderMaterial?!0:!1}function g(a){for(var b in a.attributes){var c=\n\"index\"===b?m.ELEMENT_ARRAY_BUFFER:m.ARRAY_BUFFER,d=a.attributes[b];d.buffer=m.createBuffer();m.bindBuffer(c,d.buffer);m.bufferData(c,d.array,m.STATIC_DRAW)}}function h(a,b,c,d){for(var e in b){var f=b[e],g=c[e];if(0<=f)if(g){var h=g.itemSize;m.bindBuffer(m.ARRAY_BUFFER,g.buffer);l(f);m.vertexAttribPointer(f,h,m.FLOAT,!1,0,d*h*4)}else a.defaultAttributeValues&&(2===a.defaultAttributeValues[e].length?m.vertexAttrib2fv(f,a.defaultAttributeValues[e]):3===a.defaultAttributeValues[e].length&&m.vertexAttrib3fv(f,\na.defaultAttributeValues[e]))}n()}function k(){for(var a=0,b=pb.length;a<b;a++)pb[a]=0}function l(a){pb[a]=1;0===tb[a]&&(m.enableVertexAttribArray(a),tb[a]=1)}function n(){for(var a=0,b=tb.length;a<b;a++)tb[a]!==pb[a]&&(m.disableVertexAttribArray(a),tb[a]=0)}function q(a,b){return a.z!==b.z?b.z-a.z:a.id-b.id}function r(a,b){return a.z!==b.z?a.z-b.z:a.id-b.id}function t(a,b){return b[0]-a[0]}function s(a,b,h){if(!1!==b.visible){var k=a.__webglObjects[b.id];if(k&&(!1===b.frustumCulled||!0===jc.intersectsObject(b))){var l=\nb.geometry,n,r,p;if(l instanceof THREE.BufferGeometry){var q=m.DYNAMIC_DRAW,w=l.attributes,u,v;for(u in w)v=w[u],v.needsUpdate&&(\"index\"===u?(m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,v.buffer),m.bufferData(m.ELEMENT_ARRAY_BUFFER,v.array,q)):(m.bindBuffer(m.ARRAY_BUFFER,v.buffer),m.bufferData(m.ARRAY_BUFFER,v.array,q)),v.needsUpdate=!1)}else if(b instanceof THREE.Mesh){if(l.buffersNeedUpdate||l.groupsNeedUpdate)l instanceof THREE.BufferGeometry?g(l):b instanceof THREE.Mesh&&D(a,b,l);for(var A=0,z=l.geometryGroupsList.length;A<\nz;A++)if(n=l.geometryGroupsList[A],p=d(b,n),(l.buffersNeedUpdate||l.groupsNeedUpdate)&&c(n,b),r=p.attributes&&x(p),l.verticesNeedUpdate||l.morphTargetsNeedUpdate||l.elementsNeedUpdate||l.uvsNeedUpdate||l.normalsNeedUpdate||l.colorsNeedUpdate||l.tangentsNeedUpdate||r){var y=n,E=b,I=m.DYNAMIC_DRAW,J=!l.dynamic,L=p;if(y.__inittedArrays){var K=e(L),H=L.vertexColors?L.vertexColors:!1,Q=f(L),O=K===THREE.SmoothShading,B=void 0,N=void 0,P=void 0,T=void 0,R=void 0,ba=void 0,S=void 0,$=void 0,X=void 0,V=void 0,\nza=void 0,ga=void 0,ha=void 0,ia=void 0,Ea=void 0,aa=void 0,da=void 0,ya=void 0,U=void 0,ca=void 0,W=void 0,Ba=void 0,Aa=void 0,la=void 0,ma=void 0,oa=void 0,ra=void 0,ua=void 0,va=void 0,ja=void 0,Fa=void 0,Da=void 0,Ga=void 0,Ya=void 0,qa=void 0,Ka=void 0,xa=void 0,Ca=void 0,Ja=void 0,Qa=void 0,db=0,eb=0,Sa=0,Za=0,Ta=0,gb=0,Ua=0,ub=0,$a=0,wa=0,Ha=0,M=0,Ra=void 0,hb=y.__vertexArray,cb=y.__uvArray,fb=y.__uv2Array,yb=y.__normalArray,Va=y.__tangentArray,ib=y.__colorArray,Wa=y.__skinIndexArray,Xa=y.__skinWeightArray,\ntb=y.__morphTargetsArrays,wb=y.__morphNormalsArrays,sb=y.__webglCustomAttributesList,F=void 0,pb=y.__faceArray,zb=y.__lineArray,La=E.geometry,Db=La.elementsNeedUpdate,xb=La.uvsNeedUpdate,Eb=La.normalsNeedUpdate,Ob=La.tangentsNeedUpdate,Pb=La.colorsNeedUpdate,Sb=La.morphTargetsNeedUpdate,lc=La.vertices,ka=y.faces3,jb=La.faces,Hb=La.faceVertexUvs[0],Ib=La.faceVertexUvs[1],mc=La.skinIndices,Vb=La.skinWeights,Wb=La.morphTargets,Jb=La.morphNormals;if(La.verticesNeedUpdate){B=0;for(N=ka.length;B<N;B++)T=\njb[ka[B]],ga=lc[T.a],ha=lc[T.b],ia=lc[T.c],hb[eb]=ga.x,hb[eb+1]=ga.y,hb[eb+2]=ga.z,hb[eb+3]=ha.x,hb[eb+4]=ha.y,hb[eb+5]=ha.z,hb[eb+6]=ia.x,hb[eb+7]=ia.y,hb[eb+8]=ia.z,eb+=9;m.bindBuffer(m.ARRAY_BUFFER,y.__webglVertexBuffer);m.bufferData(m.ARRAY_BUFFER,hb,I)}if(Sb)for(qa=0,Ka=Wb.length;qa<Ka;qa++){B=Ha=0;for(N=ka.length;B<N;B++)Ja=ka[B],T=jb[Ja],ga=Wb[qa].vertices[T.a],ha=Wb[qa].vertices[T.b],ia=Wb[qa].vertices[T.c],xa=tb[qa],xa[Ha]=ga.x,xa[Ha+1]=ga.y,xa[Ha+2]=ga.z,xa[Ha+3]=ha.x,xa[Ha+4]=ha.y,xa[Ha+\n5]=ha.z,xa[Ha+6]=ia.x,xa[Ha+7]=ia.y,xa[Ha+8]=ia.z,L.morphNormals&&(O?(Qa=Jb[qa].vertexNormals[Ja],ya=Qa.a,U=Qa.b,ca=Qa.c):ca=U=ya=Jb[qa].faceNormals[Ja],Ca=wb[qa],Ca[Ha]=ya.x,Ca[Ha+1]=ya.y,Ca[Ha+2]=ya.z,Ca[Ha+3]=U.x,Ca[Ha+4]=U.y,Ca[Ha+5]=U.z,Ca[Ha+6]=ca.x,Ca[Ha+7]=ca.y,Ca[Ha+8]=ca.z),Ha+=9;m.bindBuffer(m.ARRAY_BUFFER,y.__webglMorphTargetsBuffers[qa]);m.bufferData(m.ARRAY_BUFFER,tb[qa],I);L.morphNormals&&(m.bindBuffer(m.ARRAY_BUFFER,y.__webglMorphNormalsBuffers[qa]),m.bufferData(m.ARRAY_BUFFER,wb[qa],\nI))}if(Vb.length){B=0;for(N=ka.length;B<N;B++)T=jb[ka[B]],la=Vb[T.a],ma=Vb[T.b],oa=Vb[T.c],Xa[wa]=la.x,Xa[wa+1]=la.y,Xa[wa+2]=la.z,Xa[wa+3]=la.w,Xa[wa+4]=ma.x,Xa[wa+5]=ma.y,Xa[wa+6]=ma.z,Xa[wa+7]=ma.w,Xa[wa+8]=oa.x,Xa[wa+9]=oa.y,Xa[wa+10]=oa.z,Xa[wa+11]=oa.w,ra=mc[T.a],ua=mc[T.b],va=mc[T.c],Wa[wa]=ra.x,Wa[wa+1]=ra.y,Wa[wa+2]=ra.z,Wa[wa+3]=ra.w,Wa[wa+4]=ua.x,Wa[wa+5]=ua.y,Wa[wa+6]=ua.z,Wa[wa+7]=ua.w,Wa[wa+8]=va.x,Wa[wa+9]=va.y,Wa[wa+10]=va.z,Wa[wa+11]=va.w,wa+=12;0<wa&&(m.bindBuffer(m.ARRAY_BUFFER,\ny.__webglSkinIndicesBuffer),m.bufferData(m.ARRAY_BUFFER,Wa,I),m.bindBuffer(m.ARRAY_BUFFER,y.__webglSkinWeightsBuffer),m.bufferData(m.ARRAY_BUFFER,Xa,I))}if(Pb&&H){B=0;for(N=ka.length;B<N;B++)T=jb[ka[B]],S=T.vertexColors,$=T.color,3===S.length&&H===THREE.VertexColors?(W=S[0],Ba=S[1],Aa=S[2]):Aa=Ba=W=$,ib[$a]=W.r,ib[$a+1]=W.g,ib[$a+2]=W.b,ib[$a+3]=Ba.r,ib[$a+4]=Ba.g,ib[$a+5]=Ba.b,ib[$a+6]=Aa.r,ib[$a+7]=Aa.g,ib[$a+8]=Aa.b,$a+=9;0<$a&&(m.bindBuffer(m.ARRAY_BUFFER,y.__webglColorBuffer),m.bufferData(m.ARRAY_BUFFER,\nib,I))}if(Ob&&La.hasTangents){B=0;for(N=ka.length;B<N;B++)T=jb[ka[B]],X=T.vertexTangents,Ea=X[0],aa=X[1],da=X[2],Va[Ua]=Ea.x,Va[Ua+1]=Ea.y,Va[Ua+2]=Ea.z,Va[Ua+3]=Ea.w,Va[Ua+4]=aa.x,Va[Ua+5]=aa.y,Va[Ua+6]=aa.z,Va[Ua+7]=aa.w,Va[Ua+8]=da.x,Va[Ua+9]=da.y,Va[Ua+10]=da.z,Va[Ua+11]=da.w,Ua+=12;m.bindBuffer(m.ARRAY_BUFFER,y.__webglTangentBuffer);m.bufferData(m.ARRAY_BUFFER,Va,I)}if(Eb&&K){B=0;for(N=ka.length;B<N;B++)if(T=jb[ka[B]],R=T.vertexNormals,ba=T.normal,3===R.length&&O)for(ja=0;3>ja;ja++)Da=R[ja],\nyb[gb]=Da.x,yb[gb+1]=Da.y,yb[gb+2]=Da.z,gb+=3;else for(ja=0;3>ja;ja++)yb[gb]=ba.x,yb[gb+1]=ba.y,yb[gb+2]=ba.z,gb+=3;m.bindBuffer(m.ARRAY_BUFFER,y.__webglNormalBuffer);m.bufferData(m.ARRAY_BUFFER,yb,I)}if(xb&&Hb&&Q){B=0;for(N=ka.length;B<N;B++)if(P=ka[B],V=Hb[P],void 0!==V)for(ja=0;3>ja;ja++)Ga=V[ja],cb[Sa]=Ga.x,cb[Sa+1]=Ga.y,Sa+=2;0<Sa&&(m.bindBuffer(m.ARRAY_BUFFER,y.__webglUVBuffer),m.bufferData(m.ARRAY_BUFFER,cb,I))}if(xb&&Ib&&Q){B=0;for(N=ka.length;B<N;B++)if(P=ka[B],za=Ib[P],void 0!==za)for(ja=\n0;3>ja;ja++)Ya=za[ja],fb[Za]=Ya.x,fb[Za+1]=Ya.y,Za+=2;0<Za&&(m.bindBuffer(m.ARRAY_BUFFER,y.__webglUV2Buffer),m.bufferData(m.ARRAY_BUFFER,fb,I))}if(Db){B=0;for(N=ka.length;B<N;B++)pb[Ta]=db,pb[Ta+1]=db+1,pb[Ta+2]=db+2,Ta+=3,zb[ub]=db,zb[ub+1]=db+1,zb[ub+2]=db,zb[ub+3]=db+2,zb[ub+4]=db+1,zb[ub+5]=db+2,ub+=6,db+=3;m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,y.__webglFaceBuffer);m.bufferData(m.ELEMENT_ARRAY_BUFFER,pb,I);m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,y.__webglLineBuffer);m.bufferData(m.ELEMENT_ARRAY_BUFFER,\nzb,I)}if(sb)for(ja=0,Fa=sb.length;ja<Fa;ja++)if(F=sb[ja],F.__original.needsUpdate){M=0;if(1===F.size)if(void 0===F.boundTo||\"vertices\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)T=jb[ka[B]],F.array[M]=F.value[T.a],F.array[M+1]=F.value[T.b],F.array[M+2]=F.value[T.c],M+=3;else{if(\"faces\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)Ra=F.value[ka[B]],F.array[M]=Ra,F.array[M+1]=Ra,F.array[M+2]=Ra,M+=3}else if(2===F.size)if(void 0===F.boundTo||\"vertices\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)T=jb[ka[B]],ga=\nF.value[T.a],ha=F.value[T.b],ia=F.value[T.c],F.array[M]=ga.x,F.array[M+1]=ga.y,F.array[M+2]=ha.x,F.array[M+3]=ha.y,F.array[M+4]=ia.x,F.array[M+5]=ia.y,M+=6;else{if(\"faces\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)ia=ha=ga=Ra=F.value[ka[B]],F.array[M]=ga.x,F.array[M+1]=ga.y,F.array[M+2]=ha.x,F.array[M+3]=ha.y,F.array[M+4]=ia.x,F.array[M+5]=ia.y,M+=6}else if(3===F.size){var ta;ta=\"c\"===F.type?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(void 0===F.boundTo||\"vertices\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)T=jb[ka[B]],\nga=F.value[T.a],ha=F.value[T.b],ia=F.value[T.c],F.array[M]=ga[ta[0]],F.array[M+1]=ga[ta[1]],F.array[M+2]=ga[ta[2]],F.array[M+3]=ha[ta[0]],F.array[M+4]=ha[ta[1]],F.array[M+5]=ha[ta[2]],F.array[M+6]=ia[ta[0]],F.array[M+7]=ia[ta[1]],F.array[M+8]=ia[ta[2]],M+=9;else if(\"faces\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)ia=ha=ga=Ra=F.value[ka[B]],F.array[M]=ga[ta[0]],F.array[M+1]=ga[ta[1]],F.array[M+2]=ga[ta[2]],F.array[M+3]=ha[ta[0]],F.array[M+4]=ha[ta[1]],F.array[M+5]=ha[ta[2]],F.array[M+6]=ia[ta[0]],F.array[M+\n7]=ia[ta[1]],F.array[M+8]=ia[ta[2]],M+=9;else if(\"faceVertices\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)Ra=F.value[ka[B]],ga=Ra[0],ha=Ra[1],ia=Ra[2],F.array[M]=ga[ta[0]],F.array[M+1]=ga[ta[1]],F.array[M+2]=ga[ta[2]],F.array[M+3]=ha[ta[0]],F.array[M+4]=ha[ta[1]],F.array[M+5]=ha[ta[2]],F.array[M+6]=ia[ta[0]],F.array[M+7]=ia[ta[1]],F.array[M+8]=ia[ta[2]],M+=9}else if(4===F.size)if(void 0===F.boundTo||\"vertices\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)T=jb[ka[B]],ga=F.value[T.a],ha=F.value[T.b],ia=F.value[T.c],\nF.array[M]=ga.x,F.array[M+1]=ga.y,F.array[M+2]=ga.z,F.array[M+3]=ga.w,F.array[M+4]=ha.x,F.array[M+5]=ha.y,F.array[M+6]=ha.z,F.array[M+7]=ha.w,F.array[M+8]=ia.x,F.array[M+9]=ia.y,F.array[M+10]=ia.z,F.array[M+11]=ia.w,M+=12;else if(\"faces\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)ia=ha=ga=Ra=F.value[ka[B]],F.array[M]=ga.x,F.array[M+1]=ga.y,F.array[M+2]=ga.z,F.array[M+3]=ga.w,F.array[M+4]=ha.x,F.array[M+5]=ha.y,F.array[M+6]=ha.z,F.array[M+7]=ha.w,F.array[M+8]=ia.x,F.array[M+9]=ia.y,F.array[M+10]=ia.z,\nF.array[M+11]=ia.w,M+=12;else if(\"faceVertices\"===F.boundTo)for(B=0,N=ka.length;B<N;B++)Ra=F.value[ka[B]],ga=Ra[0],ha=Ra[1],ia=Ra[2],F.array[M]=ga.x,F.array[M+1]=ga.y,F.array[M+2]=ga.z,F.array[M+3]=ga.w,F.array[M+4]=ha.x,F.array[M+5]=ha.y,F.array[M+6]=ha.z,F.array[M+7]=ha.w,F.array[M+8]=ia.x,F.array[M+9]=ia.y,F.array[M+10]=ia.z,F.array[M+11]=ia.w,M+=12;m.bindBuffer(m.ARRAY_BUFFER,F.buffer);m.bufferData(m.ARRAY_BUFFER,F.array,I)}J&&(delete y.__inittedArrays,delete y.__colorArray,delete y.__normalArray,\ndelete y.__tangentArray,delete y.__uvArray,delete y.__uv2Array,delete y.__faceArray,delete y.__vertexArray,delete y.__lineArray,delete y.__skinIndexArray,delete y.__skinWeightArray)}}l.verticesNeedUpdate=!1;l.morphTargetsNeedUpdate=!1;l.elementsNeedUpdate=!1;l.uvsNeedUpdate=!1;l.normalsNeedUpdate=!1;l.colorsNeedUpdate=!1;l.tangentsNeedUpdate=!1;l.buffersNeedUpdate=!1;p.attributes&&C(p)}else if(b instanceof THREE.Line){p=d(b,l);r=p.attributes&&x(p);if(l.verticesNeedUpdate||l.colorsNeedUpdate||l.lineDistancesNeedUpdate||\nr){var Xb=m.DYNAMIC_DRAW,Kb,Lb,Mb,Yb,sa,Zb,Nb=l.vertices,Qb=l.colors,Rb=l.lineDistances,ec=Nb.length,fc=Qb.length,gc=Rb.length,$b=l.__vertexArray,ac=l.__colorArray,Tb=l.__lineDistanceArray,hc=l.colorsNeedUpdate,ic=l.lineDistancesNeedUpdate,nc=l.__webglCustomAttributesList,bc,uc,Ia,Fb,Ma,pa;if(l.verticesNeedUpdate){for(Kb=0;Kb<ec;Kb++)Yb=Nb[Kb],sa=3*Kb,$b[sa]=Yb.x,$b[sa+1]=Yb.y,$b[sa+2]=Yb.z;m.bindBuffer(m.ARRAY_BUFFER,l.__webglVertexBuffer);m.bufferData(m.ARRAY_BUFFER,$b,Xb)}if(hc){for(Lb=0;Lb<fc;Lb++)Zb=\nQb[Lb],sa=3*Lb,ac[sa]=Zb.r,ac[sa+1]=Zb.g,ac[sa+2]=Zb.b;m.bindBuffer(m.ARRAY_BUFFER,l.__webglColorBuffer);m.bufferData(m.ARRAY_BUFFER,ac,Xb)}if(ic){for(Mb=0;Mb<gc;Mb++)Tb[Mb]=Rb[Mb];m.bindBuffer(m.ARRAY_BUFFER,l.__webglLineDistanceBuffer);m.bufferData(m.ARRAY_BUFFER,Tb,Xb)}if(nc)for(bc=0,uc=nc.length;bc<uc;bc++)if(pa=nc[bc],pa.needsUpdate&&(void 0===pa.boundTo||\"vertices\"===pa.boundTo)){sa=0;Fb=pa.value.length;if(1===pa.size)for(Ia=0;Ia<Fb;Ia++)pa.array[Ia]=pa.value[Ia];else if(2===pa.size)for(Ia=\n0;Ia<Fb;Ia++)Ma=pa.value[Ia],pa.array[sa]=Ma.x,pa.array[sa+1]=Ma.y,sa+=2;else if(3===pa.size)if(\"c\"===pa.type)for(Ia=0;Ia<Fb;Ia++)Ma=pa.value[Ia],pa.array[sa]=Ma.r,pa.array[sa+1]=Ma.g,pa.array[sa+2]=Ma.b,sa+=3;else for(Ia=0;Ia<Fb;Ia++)Ma=pa.value[Ia],pa.array[sa]=Ma.x,pa.array[sa+1]=Ma.y,pa.array[sa+2]=Ma.z,sa+=3;else if(4===pa.size)for(Ia=0;Ia<Fb;Ia++)Ma=pa.value[Ia],pa.array[sa]=Ma.x,pa.array[sa+1]=Ma.y,pa.array[sa+2]=Ma.z,pa.array[sa+3]=Ma.w,sa+=4;m.bindBuffer(m.ARRAY_BUFFER,pa.buffer);m.bufferData(m.ARRAY_BUFFER,\npa.array,Xb)}}l.verticesNeedUpdate=!1;l.colorsNeedUpdate=!1;l.lineDistancesNeedUpdate=!1;p.attributes&&C(p)}else if(b instanceof THREE.PointCloud){p=d(b,l);r=p.attributes&&x(p);if(l.verticesNeedUpdate||l.colorsNeedUpdate||b.sortParticles||r){var oc=m.DYNAMIC_DRAW,Na,kb,lb,Z,mb,vb,cc=l.vertices,pc=cc.length,qc=l.colors,vc=qc.length,Ab=l.__vertexArray,Bb=l.__colorArray,qb=l.__sortArray,wc=l.verticesNeedUpdate,xc=l.colorsNeedUpdate,rb=l.__webglCustomAttributesList,ab,Gb,fa,bb,na,Y;if(b.sortParticles){kc.copy(Ub);\nkc.multiply(b.matrixWorld);for(Na=0;Na<pc;Na++)lb=cc[Na],ea.copy(lb),ea.applyProjection(kc),qb[Na]=[ea.z,Na];qb.sort(t);for(Na=0;Na<pc;Na++)lb=cc[qb[Na][1]],Z=3*Na,Ab[Z]=lb.x,Ab[Z+1]=lb.y,Ab[Z+2]=lb.z;for(kb=0;kb<vc;kb++)Z=3*kb,vb=qc[qb[kb][1]],Bb[Z]=vb.r,Bb[Z+1]=vb.g,Bb[Z+2]=vb.b;if(rb)for(ab=0,Gb=rb.length;ab<Gb;ab++)if(Y=rb[ab],void 0===Y.boundTo||\"vertices\"===Y.boundTo)if(Z=0,bb=Y.value.length,1===Y.size)for(fa=0;fa<bb;fa++)mb=qb[fa][1],Y.array[fa]=Y.value[mb];else if(2===Y.size)for(fa=0;fa<bb;fa++)mb=\nqb[fa][1],na=Y.value[mb],Y.array[Z]=na.x,Y.array[Z+1]=na.y,Z+=2;else if(3===Y.size)if(\"c\"===Y.type)for(fa=0;fa<bb;fa++)mb=qb[fa][1],na=Y.value[mb],Y.array[Z]=na.r,Y.array[Z+1]=na.g,Y.array[Z+2]=na.b,Z+=3;else for(fa=0;fa<bb;fa++)mb=qb[fa][1],na=Y.value[mb],Y.array[Z]=na.x,Y.array[Z+1]=na.y,Y.array[Z+2]=na.z,Z+=3;else if(4===Y.size)for(fa=0;fa<bb;fa++)mb=qb[fa][1],na=Y.value[mb],Y.array[Z]=na.x,Y.array[Z+1]=na.y,Y.array[Z+2]=na.z,Y.array[Z+3]=na.w,Z+=4}else{if(wc)for(Na=0;Na<pc;Na++)lb=cc[Na],Z=3*\nNa,Ab[Z]=lb.x,Ab[Z+1]=lb.y,Ab[Z+2]=lb.z;if(xc)for(kb=0;kb<vc;kb++)vb=qc[kb],Z=3*kb,Bb[Z]=vb.r,Bb[Z+1]=vb.g,Bb[Z+2]=vb.b;if(rb)for(ab=0,Gb=rb.length;ab<Gb;ab++)if(Y=rb[ab],Y.needsUpdate&&(void 0===Y.boundTo||\"vertices\"===Y.boundTo))if(bb=Y.value.length,Z=0,1===Y.size)for(fa=0;fa<bb;fa++)Y.array[fa]=Y.value[fa];else if(2===Y.size)for(fa=0;fa<bb;fa++)na=Y.value[fa],Y.array[Z]=na.x,Y.array[Z+1]=na.y,Z+=2;else if(3===Y.size)if(\"c\"===Y.type)for(fa=0;fa<bb;fa++)na=Y.value[fa],Y.array[Z]=na.r,Y.array[Z+1]=\nna.g,Y.array[Z+2]=na.b,Z+=3;else for(fa=0;fa<bb;fa++)na=Y.value[fa],Y.array[Z]=na.x,Y.array[Z+1]=na.y,Y.array[Z+2]=na.z,Z+=3;else if(4===Y.size)for(fa=0;fa<bb;fa++)na=Y.value[fa],Y.array[Z]=na.x,Y.array[Z+1]=na.y,Y.array[Z+2]=na.z,Y.array[Z+3]=na.w,Z+=4}if(wc||b.sortParticles)m.bindBuffer(m.ARRAY_BUFFER,l.__webglVertexBuffer),m.bufferData(m.ARRAY_BUFFER,Ab,oc);if(xc||b.sortParticles)m.bindBuffer(m.ARRAY_BUFFER,l.__webglColorBuffer),m.bufferData(m.ARRAY_BUFFER,Bb,oc);if(rb)for(ab=0,Gb=rb.length;ab<\nGb;ab++)if(Y=rb[ab],Y.needsUpdate||b.sortParticles)m.bindBuffer(m.ARRAY_BUFFER,Y.buffer),m.bufferData(m.ARRAY_BUFFER,Y.array,oc)}l.verticesNeedUpdate=!1;l.colorsNeedUpdate=!1;p.attributes&&C(p)}for(var Cb=0,rc=k.length;Cb<rc;Cb++){var dc=k[Cb],nb=dc,yc=nb.object,sc=nb.buffer,tc=yc.geometry,ob=yc.material;ob instanceof THREE.MeshFaceMaterial?(ob=ob.materials[tc instanceof THREE.BufferGeometry?0:sc.materialIndex],ob.transparent?(nb.material=ob,Pa.push(nb)):(nb.material=ob,Oa.push(nb))):ob&&(ob.transparent?\n(nb.material=ob,Pa.push(nb)):(nb.material=ob,Oa.push(nb)));dc.render=!0;!0===G.sortObjects&&(null!==b.renderDepth?dc.z=b.renderDepth:(ea.setFromMatrixPosition(b.matrixWorld),ea.applyProjection(Ub),dc.z=ea.z))}}Cb=0;for(rc=b.children.length;Cb<rc;Cb++)s(a,b.children[Cb],h)}}function p(a,b,c){if(0!==a.length)for(var d=0,e=a.length;d<e;d++)la=Ya=null,Ca=ca=ja=ua=Da=ra=Fa=-1,fb=!0,a[d].render(b,c,Hb,Ib),la=Ya=null,Ca=ca=ja=ua=Da=ra=Fa=-1,fb=!0}function v(a,b,c,d,e,f){for(var g,h,k,m=a.length-1;-1!==m;m--){g=\na[m];h=g.object;k=g.buffer;N(h,b);if(f)g=f;else{g=g.material;if(!g)continue;e&&G.setBlending(g.blending,g.blendEquation,g.blendSrc,g.blendDst);G.setDepthTest(g.depthTest);G.setDepthWrite(g.depthWrite);J(g.polygonOffset,g.polygonOffsetFactor,g.polygonOffsetUnits)}G.setMaterialFaces(g);k instanceof THREE.BufferGeometry?G.renderBufferDirect(b,c,d,g,k,h):G.renderBuffer(b,c,d,g,k,h)}}function w(a,b,c,d,e,f,g){for(var h,k,m=0,l=a.length;m<l;m++)if(h=a[m],k=h.object,k.visible){if(g)h=g;else{h=h[b];if(!h)continue;\nf&&G.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);G.setDepthTest(h.depthTest);G.setDepthWrite(h.depthWrite);J(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}G.renderImmediateObject(c,d,e,h,k)}}function u(a){var b=a.object.material;b.transparent?(a.transparent=b,a.opaque=null):(a.opaque=b,a.transparent=null)}function D(a,b,d){var e,f=!1;e=b.material;if(void 0===d.geometryGroups||d.groupsNeedUpdate)delete a.__webglObjects[b.id],d.makeGroups(e instanceof THREE.MeshFaceMaterial,\nEb?4294967296:65535),d.groupsNeedUpdate=!1;for(var g=0,h=d.geometryGroupsList.length;g<h;g++){e=d.geometryGroupsList[g];if(e.__webglVertexBuffer)f=!1;else{f=e;f.__webglVertexBuffer=m.createBuffer();f.__webglNormalBuffer=m.createBuffer();f.__webglTangentBuffer=m.createBuffer();f.__webglColorBuffer=m.createBuffer();f.__webglUVBuffer=m.createBuffer();f.__webglUV2Buffer=m.createBuffer();f.__webglSkinIndicesBuffer=m.createBuffer();f.__webglSkinWeightsBuffer=m.createBuffer();f.__webglFaceBuffer=m.createBuffer();\nf.__webglLineBuffer=m.createBuffer();var k=void 0,l=void 0;if(f.numMorphTargets)for(f.__webglMorphTargetsBuffers=[],k=0,l=f.numMorphTargets;k<l;k++)f.__webglMorphTargetsBuffers.push(m.createBuffer());if(f.numMorphNormals)for(f.__webglMorphNormalsBuffers=[],k=0,l=f.numMorphNormals;k<l;k++)f.__webglMorphNormalsBuffers.push(m.createBuffer());G.info.memory.geometries++;c(e,b);d.verticesNeedUpdate=!0;d.morphTargetsNeedUpdate=!0;d.elementsNeedUpdate=!0;d.uvsNeedUpdate=!0;d.normalsNeedUpdate=!0;d.tangentsNeedUpdate=\n!0;f=d.colorsNeedUpdate=!0}(f||void 0===b.__webglActive)&&A(a.__webglObjects,e,b)}b.__webglActive=!0}function A(a,b,c){var d=c.id;a[d]=a[d]||[];a[d].push({id:d,buffer:b,object:c,material:null,z:0})}function x(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return!0;return!1}function C(a){for(var b in a.attributes)a.attributes[b].needsUpdate=!1}function I(a,b){if(a instanceof THREE.Mesh||a instanceof THREE.PointCloud||a instanceof THREE.Line)delete b.__webglObjects[a.id];else if(a instanceof\nTHREE.ImmediateRenderObject||a.immediateRenderCallback)for(var c=b.__webglObjectsImmediate,d=c.length-1;0<=d;d--)c[d].object===a&&c.splice(d,1);delete a.__webglActive}function z(a,b,c,d,e){qa=0;d.needsUpdate&&(d.program&&Nb(d),G.initMaterial(d,b,c,e),d.needsUpdate=!1);d.morphTargets&&!e.__webglMorphTargetInfluences&&(e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets));var f=!1,g=!1,h=!1,k=d.program,l=k.uniforms,n=d.__webglShader.uniforms;k.id!==Ya&&(m.useProgram(k.program),Ya=k.id,\nh=g=f=!0);d.id!==Ca&&(-1===Ca&&(h=!0),Ca=d.id,g=!0);if(f||a!==la)m.uniformMatrix4fv(l.projectionMatrix,!1,a.projectionMatrix.elements),Ea&&m.uniform1f(l.logDepthBufFC,2/(Math.log(a.far+1)/Math.LN2)),a!==la&&(la=a),(d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&null!==l.cameraPosition&&(ea.setFromMatrixPosition(a.matrixWorld),m.uniform3f(l.cameraPosition,ea.x,ea.y,ea.z)),(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof\nTHREE.ShaderMaterial||d.skinning)&&null!==l.viewMatrix&&m.uniformMatrix4fv(l.viewMatrix,!1,a.matrixWorldInverse.elements);d.skinning&&(e.bindMatrix&&null!==l.bindMatrix&&m.uniformMatrix4fv(l.bindMatrix,!1,e.bindMatrix.elements),e.bindMatrixInverse&&null!==l.bindMatrixInverse&&m.uniformMatrix4fv(l.bindMatrixInverse,!1,e.bindMatrixInverse.elements),Ob&&e.skeleton&&e.skeleton.useVertexTexture?(null!==l.boneTexture&&(f=K(),m.uniform1i(l.boneTexture,f),G.setTexture(e.skeleton.boneTexture,f)),null!==l.boneTextureWidth&&\nm.uniform1i(l.boneTextureWidth,e.skeleton.boneTextureWidth),null!==l.boneTextureHeight&&m.uniform1i(l.boneTextureHeight,e.skeleton.boneTextureHeight)):e.skeleton&&e.skeleton.boneMatrices&&null!==l.boneGlobalMatrices&&m.uniformMatrix4fv(l.boneGlobalMatrices,!1,e.skeleton.boneMatrices));if(g){c&&d.fog&&(n.fogColor.value=c.color,c instanceof THREE.Fog?(n.fogNear.value=c.near,n.fogFar.value=c.far):c instanceof THREE.FogExp2&&(n.fogDensity.value=c.density));if(d instanceof THREE.MeshPhongMaterial||d instanceof\nTHREE.MeshLambertMaterial||d.lights){if(fb){var h=!0,p,r=f=0,q=0,s,t,w,u=Jb,v=u.directional.colors,x=u.directional.positions,D=u.point.colors,A=u.point.positions,z=u.point.distances,C=u.spot.colors,I=u.spot.positions,L=u.spot.distances,N=u.spot.directions,J=u.spot.anglesCos,T=u.spot.exponents,H=u.hemi.skyColors,Q=u.hemi.groundColors,O=u.hemi.positions,R=0,X=0,V=0,$=0,za=0,aa=0,ya=0,ca=0,W=p=0;c=w=W=0;for(g=b.length;c<g;c++)p=b[c],p.onlyShadow||(s=p.color,t=p.intensity,w=p.distance,p instanceof THREE.AmbientLight?\np.visible&&(G.gammaInput?(f+=s.r*s.r,r+=s.g*s.g,q+=s.b*s.b):(f+=s.r,r+=s.g,q+=s.b)):p instanceof THREE.DirectionalLight?(za+=1,p.visible&&(da.setFromMatrixPosition(p.matrixWorld),ea.setFromMatrixPosition(p.target.matrixWorld),da.sub(ea),da.normalize(),p=3*R,x[p]=da.x,x[p+1]=da.y,x[p+2]=da.z,G.gammaInput?ba(v,p,s,t*t):P(v,p,s,t),R+=1)):p instanceof THREE.PointLight?(aa+=1,p.visible&&(W=3*X,G.gammaInput?ba(D,W,s,t*t):P(D,W,s,t),ea.setFromMatrixPosition(p.matrixWorld),A[W]=ea.x,A[W+1]=ea.y,A[W+2]=ea.z,\nz[X]=w,X+=1)):p instanceof THREE.SpotLight?(ya+=1,p.visible&&(W=3*V,G.gammaInput?ba(C,W,s,t*t):P(C,W,s,t),ea.setFromMatrixPosition(p.matrixWorld),I[W]=ea.x,I[W+1]=ea.y,I[W+2]=ea.z,L[V]=w,da.copy(ea),ea.setFromMatrixPosition(p.target.matrixWorld),da.sub(ea),da.normalize(),N[W]=da.x,N[W+1]=da.y,N[W+2]=da.z,J[V]=Math.cos(p.angle),T[V]=p.exponent,V+=1)):p instanceof THREE.HemisphereLight&&(ca+=1,p.visible&&(da.setFromMatrixPosition(p.matrixWorld),da.normalize(),w=3*$,O[w]=da.x,O[w+1]=da.y,O[w+2]=da.z,\ns=p.color,p=p.groundColor,G.gammaInput?(t*=t,ba(H,w,s,t),ba(Q,w,p,t)):(P(H,w,s,t),P(Q,w,p,t)),$+=1)));c=3*R;for(g=Math.max(v.length,3*za);c<g;c++)v[c]=0;c=3*X;for(g=Math.max(D.length,3*aa);c<g;c++)D[c]=0;c=3*V;for(g=Math.max(C.length,3*ya);c<g;c++)C[c]=0;c=3*$;for(g=Math.max(H.length,3*ca);c<g;c++)H[c]=0;c=3*$;for(g=Math.max(Q.length,3*ca);c<g;c++)Q[c]=0;u.directional.length=R;u.point.length=X;u.spot.length=V;u.hemi.length=$;u.ambient[0]=f;u.ambient[1]=r;u.ambient[2]=q;fb=!1}h?(h=Jb,n.ambientLightColor.value=\nh.ambient,n.directionalLightColor.value=h.directional.colors,n.directionalLightDirection.value=h.directional.positions,n.pointLightColor.value=h.point.colors,n.pointLightPosition.value=h.point.positions,n.pointLightDistance.value=h.point.distances,n.spotLightColor.value=h.spot.colors,n.spotLightPosition.value=h.spot.positions,n.spotLightDistance.value=h.spot.distances,n.spotLightDirection.value=h.spot.directions,n.spotLightAngleCos.value=h.spot.anglesCos,n.spotLightExponent.value=h.spot.exponents,\nn.hemisphereLightSkyColor.value=h.hemi.skyColors,n.hemisphereLightGroundColor.value=h.hemi.groundColors,n.hemisphereLightDirection.value=h.hemi.positions,y(n,!0)):y(n,!1)}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshPhongMaterial){n.opacity.value=d.opacity;G.gammaInput?n.diffuse.value.copyGammaToLinear(d.color):n.diffuse.value=d.color;n.map.value=d.map;n.lightMap.value=d.lightMap;n.specularMap.value=d.specularMap;n.alphaMap.value=d.alphaMap;\nd.bumpMap&&(n.bumpMap.value=d.bumpMap,n.bumpScale.value=d.bumpScale);d.normalMap&&(n.normalMap.value=d.normalMap,n.normalScale.value.copy(d.normalScale));var U;d.map?U=d.map:d.specularMap?U=d.specularMap:d.normalMap?U=d.normalMap:d.bumpMap?U=d.bumpMap:d.alphaMap&&(U=d.alphaMap);void 0!==U&&(h=U.offset,U=U.repeat,n.offsetRepeat.value.set(h.x,h.y,U.x,U.y));n.envMap.value=d.envMap;n.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;n.reflectivity.value=d.reflectivity;n.refractionRatio.value=\nd.refractionRatio;n.combine.value=d.combine;n.useRefract.value=d.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}d instanceof THREE.LineBasicMaterial?(n.diffuse.value=d.color,n.opacity.value=d.opacity):d instanceof THREE.LineDashedMaterial?(n.diffuse.value=d.color,n.opacity.value=d.opacity,n.dashSize.value=d.dashSize,n.totalSize.value=d.dashSize+d.gapSize,n.scale.value=d.scale):d instanceof THREE.PointCloudMaterial?(n.psColor.value=d.color,n.opacity.value=d.opacity,n.size.value=d.size,\nn.scale.value=S.height/2,n.map.value=d.map):d instanceof THREE.MeshPhongMaterial?(n.shininess.value=d.shininess,G.gammaInput?(n.ambient.value.copyGammaToLinear(d.ambient),n.emissive.value.copyGammaToLinear(d.emissive),n.specular.value.copyGammaToLinear(d.specular)):(n.ambient.value=d.ambient,n.emissive.value=d.emissive,n.specular.value=d.specular),d.wrapAround&&n.wrapRGB.value.copy(d.wrapRGB)):d instanceof THREE.MeshLambertMaterial?(G.gammaInput?(n.ambient.value.copyGammaToLinear(d.ambient),n.emissive.value.copyGammaToLinear(d.emissive)):\n(n.ambient.value=d.ambient,n.emissive.value=d.emissive),d.wrapAround&&n.wrapRGB.value.copy(d.wrapRGB)):d instanceof THREE.MeshDepthMaterial?(n.mNear.value=a.near,n.mFar.value=a.far,n.opacity.value=d.opacity):d instanceof THREE.MeshNormalMaterial&&(n.opacity.value=d.opacity);if(e.receiveShadow&&!d._shadowPass&&n.shadowMatrix)for(U=a=0,h=b.length;U<h;U++)c=b[U],c.castShadow&&(c instanceof THREE.SpotLight||c instanceof THREE.DirectionalLight&&!c.shadowCascade)&&(n.shadowMap.value[a]=c.shadowMap,n.shadowMapSize.value[a]=\nc.shadowMapSize,n.shadowMatrix.value[a]=c.shadowMatrix,n.shadowDarkness.value[a]=c.shadowDarkness,n.shadowBias.value[a]=c.shadowBias,a++);b=d.uniformsList;d=0;for(n=b.length;d<n;d++)if(a=b[d][0],!1!==a.needsUpdate)switch(c=a.type,h=a.value,U=b[d][1],c){case \"1i\":m.uniform1i(U,h);break;case \"1f\":m.uniform1f(U,h);break;case \"2f\":m.uniform2f(U,h[0],h[1]);break;case \"3f\":m.uniform3f(U,h[0],h[1],h[2]);break;case \"4f\":m.uniform4f(U,h[0],h[1],h[2],h[3]);break;case \"1iv\":m.uniform1iv(U,h);break;case \"3iv\":m.uniform3iv(U,\nh);break;case \"1fv\":m.uniform1fv(U,h);break;case \"2fv\":m.uniform2fv(U,h);break;case \"3fv\":m.uniform3fv(U,h);break;case \"4fv\":m.uniform4fv(U,h);break;case \"Matrix3fv\":m.uniformMatrix3fv(U,!1,h);break;case \"Matrix4fv\":m.uniformMatrix4fv(U,!1,h);break;case \"i\":m.uniform1i(U,h);break;case \"f\":m.uniform1f(U,h);break;case \"v2\":m.uniform2f(U,h.x,h.y);break;case \"v3\":m.uniform3f(U,h.x,h.y,h.z);break;case \"v4\":m.uniform4f(U,h.x,h.y,h.z,h.w);break;case \"c\":m.uniform3f(U,h.r,h.g,h.b);break;case \"iv1\":m.uniform1iv(U,\nh);break;case \"iv\":m.uniform3iv(U,h);break;case \"fv1\":m.uniform1fv(U,h);break;case \"fv\":m.uniform3fv(U,h);break;case \"v2v\":void 0===a._array&&(a._array=new Float32Array(2*h.length));c=0;for(g=h.length;c<g;c++)f=2*c,a._array[f]=h[c].x,a._array[f+1]=h[c].y;m.uniform2fv(U,a._array);break;case \"v3v\":void 0===a._array&&(a._array=new Float32Array(3*h.length));c=0;for(g=h.length;c<g;c++)f=3*c,a._array[f]=h[c].x,a._array[f+1]=h[c].y,a._array[f+2]=h[c].z;m.uniform3fv(U,a._array);break;case \"v4v\":void 0===\na._array&&(a._array=new Float32Array(4*h.length));c=0;for(g=h.length;c<g;c++)f=4*c,a._array[f]=h[c].x,a._array[f+1]=h[c].y,a._array[f+2]=h[c].z,a._array[f+3]=h[c].w;m.uniform4fv(U,a._array);break;case \"m3\":m.uniformMatrix3fv(U,!1,h.elements);break;case \"m3v\":void 0===a._array&&(a._array=new Float32Array(9*h.length));c=0;for(g=h.length;c<g;c++)h[c].flattenToArrayOffset(a._array,9*c);m.uniformMatrix3fv(U,!1,a._array);break;case \"m4\":m.uniformMatrix4fv(U,!1,h.elements);break;case \"m4v\":void 0===a._array&&\n(a._array=new Float32Array(16*h.length));c=0;for(g=h.length;c<g;c++)h[c].flattenToArrayOffset(a._array,16*c);m.uniformMatrix4fv(U,!1,a._array);break;case \"t\":f=h;h=K();m.uniform1i(U,h);if(!f)continue;if(f instanceof THREE.CubeTexture||f.image instanceof Array&&6===f.image.length){if(a=f,U=h,6===a.image.length)if(a.needsUpdate){a.image.__webglTextureCube||(a.addEventListener(\"dispose\",Pb),a.image.__webglTextureCube=m.createTexture(),G.info.memory.textures++);m.activeTexture(m.TEXTURE0+U);m.bindTexture(m.TEXTURE_CUBE_MAP,\na.image.__webglTextureCube);m.pixelStorei(m.UNPACK_FLIP_Y_WEBGL,a.flipY);U=a instanceof THREE.CompressedTexture;h=[];for(c=0;6>c;c++)G.autoScaleCubemaps&&!U?(g=c,f=a.image[c],q=sc,f.width<=q&&f.height<=q||(u=Math.max(f.width,f.height),r=Math.floor(f.width*q/u),q=Math.floor(f.height*q/u),u=document.createElement(\"canvas\"),u.width=r,u.height=q,u.getContext(\"2d\").drawImage(f,0,0,f.width,f.height,0,0,r,q),f=u),h[g]=f):h[c]=a.image[c];c=h[0];g=THREE.Math.isPowerOfTwo(c.width)&&THREE.Math.isPowerOfTwo(c.height);\nf=B(a.format);r=B(a.type);E(m.TEXTURE_CUBE_MAP,a,g);for(c=0;6>c;c++)if(U)for(u=h[c].mipmaps,v=0,x=u.length;v<x;v++)q=u[v],a.format!==THREE.RGBAFormat?m.compressedTexImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+c,v,f,q.width,q.height,0,q.data):m.texImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+c,v,f,q.width,q.height,0,f,r,q.data);else m.texImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+c,0,f,f,r,h[c]);a.generateMipmaps&&g&&m.generateMipmap(m.TEXTURE_CUBE_MAP);a.needsUpdate=!1;if(a.onUpdate)a.onUpdate()}else m.activeTexture(m.TEXTURE0+\nU),m.bindTexture(m.TEXTURE_CUBE_MAP,a.image.__webglTextureCube)}else f instanceof THREE.WebGLRenderTargetCube?(a=f,m.activeTexture(m.TEXTURE0+h),m.bindTexture(m.TEXTURE_CUBE_MAP,a.__webglTexture)):G.setTexture(f,h);break;case \"tv\":void 0===a._array&&(a._array=[]);c=0;for(g=a.value.length;c<g;c++)a._array[c]=K();m.uniform1iv(U,a._array);c=0;for(g=a.value.length;c<g;c++)f=a.value[c],h=a._array[c],f&&G.setTexture(f,h);break;default:console.warn(\"THREE.WebGLRenderer: Unknown uniform type: \"+c)}}m.uniformMatrix4fv(l.modelViewMatrix,\n!1,e._modelViewMatrix.elements);l.normalMatrix&&m.uniformMatrix3fv(l.normalMatrix,!1,e._normalMatrix.elements);null!==l.modelMatrix&&m.uniformMatrix4fv(l.modelMatrix,!1,e.matrixWorld.elements);return k}function y(a,b){a.ambientLightColor.needsUpdate=b;a.directionalLightColor.needsUpdate=b;a.directionalLightDirection.needsUpdate=b;a.pointLightColor.needsUpdate=b;a.pointLightPosition.needsUpdate=b;a.pointLightDistance.needsUpdate=b;a.spotLightColor.needsUpdate=b;a.spotLightPosition.needsUpdate=b;a.spotLightDistance.needsUpdate=\nb;a.spotLightDirection.needsUpdate=b;a.spotLightAngleCos.needsUpdate=b;a.spotLightExponent.needsUpdate=b;a.hemisphereLightSkyColor.needsUpdate=b;a.hemisphereLightGroundColor.needsUpdate=b;a.hemisphereLightDirection.needsUpdate=b}function K(){var a=qa;a>=Qb&&console.warn(\"WebGLRenderer: trying to use \"+a+\" texture units while this GPU supports only \"+Qb);qa+=1;return a}function N(a,b){a._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getNormalMatrix(a._modelViewMatrix)}\nfunction ba(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function P(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function O(a){a!==xa&&(m.lineWidth(a),xa=a)}function J(a,b,c){Qa!==a&&(a?m.enable(m.POLYGON_OFFSET_FILL):m.disable(m.POLYGON_OFFSET_FILL),Qa=a);!a||cb===b&&Ga===c||(m.polygonOffset(b,c),cb=b,Ga=c)}function E(a,b,c){c?(m.texParameteri(a,m.TEXTURE_WRAP_S,B(b.wrapS)),m.texParameteri(a,m.TEXTURE_WRAP_T,B(b.wrapT)),m.texParameteri(a,m.TEXTURE_MAG_FILTER,B(b.magFilter)),m.texParameteri(a,\nm.TEXTURE_MIN_FILTER,B(b.minFilter))):(m.texParameteri(a,m.TEXTURE_WRAP_S,m.CLAMP_TO_EDGE),m.texParameteri(a,m.TEXTURE_WRAP_T,m.CLAMP_TO_EDGE),m.texParameteri(a,m.TEXTURE_MAG_FILTER,R(b.magFilter)),m.texParameteri(a,m.TEXTURE_MIN_FILTER,R(b.minFilter)));Ta&&b.type!==THREE.FloatType&&(1<b.anisotropy||b.__oldAnisotropy)&&(m.texParameterf(a,Ta.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(b.anisotropy,Rb)),b.__oldAnisotropy=b.anisotropy)}function Q(a,b){m.bindRenderbuffer(m.RENDERBUFFER,a);b.depthBuffer&&!b.stencilBuffer?\n(m.renderbufferStorage(m.RENDERBUFFER,m.DEPTH_COMPONENT16,b.width,b.height),m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_ATTACHMENT,m.RENDERBUFFER,a)):b.depthBuffer&&b.stencilBuffer?(m.renderbufferStorage(m.RENDERBUFFER,m.DEPTH_STENCIL,b.width,b.height),m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_STENCIL_ATTACHMENT,m.RENDERBUFFER,a)):m.renderbufferStorage(m.RENDERBUFFER,m.RGBA4,b.width,b.height)}function L(a){a instanceof THREE.WebGLRenderTargetCube?(m.bindTexture(m.TEXTURE_CUBE_MAP,a.__webglTexture),\nm.generateMipmap(m.TEXTURE_CUBE_MAP),m.bindTexture(m.TEXTURE_CUBE_MAP,null)):(m.bindTexture(m.TEXTURE_2D,a.__webglTexture),m.generateMipmap(m.TEXTURE_2D),m.bindTexture(m.TEXTURE_2D,null))}function R(a){return a===THREE.NearestFilter||a===THREE.NearestMipMapNearestFilter||a===THREE.NearestMipMapLinearFilter?m.NEAREST:m.LINEAR}function B(a){if(a===THREE.RepeatWrapping)return m.REPEAT;if(a===THREE.ClampToEdgeWrapping)return m.CLAMP_TO_EDGE;if(a===THREE.MirroredRepeatWrapping)return m.MIRRORED_REPEAT;\nif(a===THREE.NearestFilter)return m.NEAREST;if(a===THREE.NearestMipMapNearestFilter)return m.NEAREST_MIPMAP_NEAREST;if(a===THREE.NearestMipMapLinearFilter)return m.NEAREST_MIPMAP_LINEAR;if(a===THREE.LinearFilter)return m.LINEAR;if(a===THREE.LinearMipMapNearestFilter)return m.LINEAR_MIPMAP_NEAREST;if(a===THREE.LinearMipMapLinearFilter)return m.LINEAR_MIPMAP_LINEAR;if(a===THREE.UnsignedByteType)return m.UNSIGNED_BYTE;if(a===THREE.UnsignedShort4444Type)return m.UNSIGNED_SHORT_4_4_4_4;if(a===THREE.UnsignedShort5551Type)return m.UNSIGNED_SHORT_5_5_5_1;\nif(a===THREE.UnsignedShort565Type)return m.UNSIGNED_SHORT_5_6_5;if(a===THREE.ByteType)return m.BYTE;if(a===THREE.ShortType)return m.SHORT;if(a===THREE.UnsignedShortType)return m.UNSIGNED_SHORT;if(a===THREE.IntType)return m.INT;if(a===THREE.UnsignedIntType)return m.UNSIGNED_INT;if(a===THREE.FloatType)return m.FLOAT;if(a===THREE.AlphaFormat)return m.ALPHA;if(a===THREE.RGBFormat)return m.RGB;if(a===THREE.RGBAFormat)return m.RGBA;if(a===THREE.LuminanceFormat)return m.LUMINANCE;if(a===THREE.LuminanceAlphaFormat)return m.LUMINANCE_ALPHA;\nif(a===THREE.AddEquation)return m.FUNC_ADD;if(a===THREE.SubtractEquation)return m.FUNC_SUBTRACT;if(a===THREE.ReverseSubtractEquation)return m.FUNC_REVERSE_SUBTRACT;if(a===THREE.ZeroFactor)return m.ZERO;if(a===THREE.OneFactor)return m.ONE;if(a===THREE.SrcColorFactor)return m.SRC_COLOR;if(a===THREE.OneMinusSrcColorFactor)return m.ONE_MINUS_SRC_COLOR;if(a===THREE.SrcAlphaFactor)return m.SRC_ALPHA;if(a===THREE.OneMinusSrcAlphaFactor)return m.ONE_MINUS_SRC_ALPHA;if(a===THREE.DstAlphaFactor)return m.DST_ALPHA;\nif(a===THREE.OneMinusDstAlphaFactor)return m.ONE_MINUS_DST_ALPHA;if(a===THREE.DstColorFactor)return m.DST_COLOR;if(a===THREE.OneMinusDstColorFactor)return m.ONE_MINUS_DST_COLOR;if(a===THREE.SrcAlphaSaturateFactor)return m.SRC_ALPHA_SATURATE;if(void 0!==Sa){if(a===THREE.RGB_S3TC_DXT1_Format)return Sa.COMPRESSED_RGB_S3TC_DXT1_EXT;if(a===THREE.RGBA_S3TC_DXT1_Format)return Sa.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(a===THREE.RGBA_S3TC_DXT3_Format)return Sa.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(a===THREE.RGBA_S3TC_DXT5_Format)return Sa.COMPRESSED_RGBA_S3TC_DXT5_EXT}return 0}\nconsole.log(\"THREE.WebGLRenderer\",THREE.REVISION);a=a||{};var S=void 0!==a.canvas?a.canvas:document.createElement(\"canvas\"),V=void 0!==a.context?a.context:null,W=void 0!==a.precision?a.precision:\"highp\",H=void 0!==a.alpha?a.alpha:!1,oa=void 0!==a.depth?a.depth:!0,$=void 0!==a.stencil?a.stencil:!0,X=void 0!==a.antialias?a.antialias:!1,T=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,ya=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,Ea=void 0!==a.logarithmicDepthBuffer?a.logarithmicDepthBuffer:\n!1,Aa=new THREE.Color(0),za=0,Oa=[],Pa=[];this.domElement=S;this.context=null;this.devicePixelRatio=void 0!==a.devicePixelRatio?a.devicePixelRatio:void 0!==self.devicePixelRatio?self.devicePixelRatio:1;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.shadowMapEnabled=this.gammaOutput=this.gammaInput=!1;this.shadowMapAutoUpdate=!0;this.shadowMapType=THREE.PCFShadowMap;this.shadowMapCullFace=THREE.CullFaceFront;this.shadowMapCascade=this.shadowMapDebug=\n!1;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=!0;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var G=this,Ba=[],Ya=null,Za=null,Ca=-1,ca=null,la=null,qa=0,ua=-1,ja=-1,Fa=-1,va=-1,Ka=-1,aa=-1,ra=-1,Da=-1,Qa=null,cb=null,Ga=null,xa=null,ma=0,Ja=0,wb=S.width,sb=S.height,Hb=0,Ib=0,pb=new Uint8Array(16),tb=new Uint8Array(16),jc=new THREE.Frustum,Ub=new THREE.Matrix4,kc=new THREE.Matrix4,\nea=new THREE.Vector3,da=new THREE.Vector3,fb=!0,Jb={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],anglesCos:[],exponents:[]},hemi:{length:0,skyColors:[],groundColors:[],positions:[]}},m,Db,xb,Ta,Sa,Eb;(function(){try{var a={alpha:H,depth:oa,stencil:$,antialias:X,premultipliedAlpha:T,preserveDrawingBuffer:ya};m=V||S.getContext(\"webgl\",a)||S.getContext(\"experimental-webgl\",\na);if(null===m)throw\"Error creating WebGL context.\";}catch(b){console.error(b)}Db=m.getExtension(\"OES_texture_float\");m.getExtension(\"OES_texture_float_linear\");xb=m.getExtension(\"OES_standard_derivatives\");Ta=m.getExtension(\"EXT_texture_filter_anisotropic\")||m.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||m.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");Sa=m.getExtension(\"WEBGL_compressed_texture_s3tc\")||m.getExtension(\"MOZ_WEBGL_compressed_texture_s3tc\")||m.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\");\nEb=m.getExtension(\"OES_element_index_uint\");null===Db&&console.log(\"THREE.WebGLRenderer: Float textures not supported.\");null===xb&&console.log(\"THREE.WebGLRenderer: Standard derivatives not supported.\");null===Ta&&console.log(\"THREE.WebGLRenderer: Anisotropic texture filtering not supported.\");null===Sa&&console.log(\"THREE.WebGLRenderer: S3TC compressed textures not supported.\");null===Eb&&console.log(\"THREE.WebGLRenderer: elementindex as unsigned integer not supported.\");void 0===m.getShaderPrecisionFormat&&\n(m.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});Ea&&m.getExtension(\"EXT_frag_depth\")})();m.clearColor(0,0,0,1);m.clearDepth(1);m.clearStencil(0);m.enable(m.DEPTH_TEST);m.depthFunc(m.LEQUAL);m.frontFace(m.CCW);m.cullFace(m.BACK);m.enable(m.CULL_FACE);m.enable(m.BLEND);m.blendEquation(m.FUNC_ADD);m.blendFunc(m.SRC_ALPHA,m.ONE_MINUS_SRC_ALPHA);m.viewport(ma,Ja,wb,sb);m.clearColor(Aa.r,Aa.g,Aa.b,za);this.context=m;var Qb=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS),tc=\nm.getParameter(m.MAX_VERTEX_TEXTURE_IMAGE_UNITS);m.getParameter(m.MAX_TEXTURE_SIZE);var sc=m.getParameter(m.MAX_CUBE_MAP_TEXTURE_SIZE),Rb=Ta?m.getParameter(Ta.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,Sb=0<tc,Ob=Sb&&Db;Sa&&m.getParameter(m.COMPRESSED_TEXTURE_FORMATS);var zc=m.getShaderPrecisionFormat(m.VERTEX_SHADER,m.HIGH_FLOAT),Ac=m.getShaderPrecisionFormat(m.VERTEX_SHADER,m.MEDIUM_FLOAT);m.getShaderPrecisionFormat(m.VERTEX_SHADER,m.LOW_FLOAT);var Bc=m.getShaderPrecisionFormat(m.FRAGMENT_SHADER,m.HIGH_FLOAT),\nCc=m.getShaderPrecisionFormat(m.FRAGMENT_SHADER,m.MEDIUM_FLOAT);m.getShaderPrecisionFormat(m.FRAGMENT_SHADER,m.LOW_FLOAT);var Dc=0<zc.precision&&0<Bc.precision,ec=0<Ac.precision&&0<Cc.precision;\"highp\"!==W||Dc||(ec?(W=\"mediump\",console.warn(\"THREE.WebGLRenderer: highp not supported, using mediump.\")):(W=\"lowp\",console.warn(\"THREE.WebGLRenderer: highp and mediump not supported, using lowp.\")));\"mediump\"!==W||ec||(W=\"lowp\",console.warn(\"THREE.WebGLRenderer: mediump not supported, using lowp.\"));this.getContext=\nfunction(){return m};this.supportsVertexTextures=function(){return Sb};this.supportsFloatTextures=function(){return Db};this.supportsStandardDerivatives=function(){return xb};this.supportsCompressedTextureS3TC=function(){return Sa};this.getMaxAnisotropy=function(){return Rb};this.getPrecision=function(){return W};this.setSize=function(a,b,c){S.width=a*this.devicePixelRatio;S.height=b*this.devicePixelRatio;!1!==c&&(S.style.width=a+\"px\",S.style.height=b+\"px\");this.setViewport(0,0,a,b)};this.setViewport=\nfunction(a,b,c,d){ma=a*this.devicePixelRatio;Ja=b*this.devicePixelRatio;wb=c*this.devicePixelRatio;sb=d*this.devicePixelRatio;m.viewport(ma,Ja,wb,sb)};this.setScissor=function(a,b,c,d){m.scissor(a*this.devicePixelRatio,b*this.devicePixelRatio,c*this.devicePixelRatio,d*this.devicePixelRatio)};this.enableScissorTest=function(a){a?m.enable(m.SCISSOR_TEST):m.disable(m.SCISSOR_TEST)};this.setClearColor=function(a,b){Aa.set(a);za=void 0!==b?b:1;m.clearColor(Aa.r,Aa.g,Aa.b,za)};this.setClearColorHex=function(a,\nb){console.warn(\"THREE.WebGLRenderer: .setClearColorHex() is being removed. Use .setClearColor() instead.\");this.setClearColor(a,b)};this.getClearColor=function(){return Aa};this.getClearAlpha=function(){return za};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=m.COLOR_BUFFER_BIT;if(void 0===b||b)d|=m.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=m.STENCIL_BUFFER_BIT;m.clear(d)};this.clearColor=function(){m.clear(m.COLOR_BUFFER_BIT)};this.clearDepth=function(){m.clear(m.DEPTH_BUFFER_BIT)};this.clearStencil=\nfunction(){m.clear(m.STENCIL_BUFFER_BIT)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};this.updateShadowMap=function(a,b){Ya=null;Ca=ca=Da=ra=Fa=-1;fb=!0;ja=ua=-1;fc(a);this.shadowMapPlugin.update(a,b)};var gc=function(a){a=a.target;a.removeEventListener(\"dispose\",gc);a.__webglInit=void 0;if(a instanceof THREE.BufferGeometry){a=\na.attributes;for(var b in a)void 0!==a[b].buffer&&m.deleteBuffer(a[b].buffer);G.info.memory.geometries--}else if(void 0!==a.geometryGroups){b=0;for(var c=a.geometryGroupsList.length;b<c;b++){var d=a.geometryGroupsList[b];if(void 0!==d.numMorphTargets)for(var e=0,f=d.numMorphTargets;e<f;e++)m.deleteBuffer(d.__webglMorphTargetsBuffers[e]);if(void 0!==d.numMorphNormals)for(e=0,f=d.numMorphNormals;e<f;e++)m.deleteBuffer(d.__webglMorphNormalsBuffers[e]);Tb(d)}}else Tb(a)},Pb=function(a){a=a.target;a.removeEventListener(\"dispose\",\nPb);a.image&&a.image.__webglTextureCube?m.deleteTexture(a.image.__webglTextureCube):a.__webglInit&&(a.__webglInit=!1,m.deleteTexture(a.__webglTexture));G.info.memory.textures--},hc=function(a){a=a.target;a.removeEventListener(\"dispose\",hc);if(a&&a.__webglTexture)if(m.deleteTexture(a.__webglTexture),a instanceof THREE.WebGLRenderTargetCube)for(var b=0;6>b;b++)m.deleteFramebuffer(a.__webglFramebuffer[b]),m.deleteRenderbuffer(a.__webglRenderbuffer[b]);else m.deleteFramebuffer(a.__webglFramebuffer),m.deleteRenderbuffer(a.__webglRenderbuffer);\nG.info.memory.textures--},ic=function(a){a=a.target;a.removeEventListener(\"dispose\",ic);Nb(a)},Tb=function(a){void 0!==a.__webglVertexBuffer&&m.deleteBuffer(a.__webglVertexBuffer);void 0!==a.__webglNormalBuffer&&m.deleteBuffer(a.__webglNormalBuffer);void 0!==a.__webglTangentBuffer&&m.deleteBuffer(a.__webglTangentBuffer);void 0!==a.__webglColorBuffer&&m.deleteBuffer(a.__webglColorBuffer);void 0!==a.__webglUVBuffer&&m.deleteBuffer(a.__webglUVBuffer);void 0!==a.__webglUV2Buffer&&m.deleteBuffer(a.__webglUV2Buffer);\nvoid 0!==a.__webglSkinIndicesBuffer&&m.deleteBuffer(a.__webglSkinIndicesBuffer);void 0!==a.__webglSkinWeightsBuffer&&m.deleteBuffer(a.__webglSkinWeightsBuffer);void 0!==a.__webglFaceBuffer&&m.deleteBuffer(a.__webglFaceBuffer);void 0!==a.__webglLineBuffer&&m.deleteBuffer(a.__webglLineBuffer);void 0!==a.__webglLineDistanceBuffer&&m.deleteBuffer(a.__webglLineDistanceBuffer);if(void 0!==a.__webglCustomAttributesList)for(var b in a.__webglCustomAttributesList)m.deleteBuffer(a.__webglCustomAttributesList[b].buffer);\nG.info.memory.geometries--},Nb=function(a){var b=a.program.program;if(void 0!==b){a.program=void 0;var c,d,e=!1;a=0;for(c=Ba.length;a<c;a++)if(d=Ba[a],d.program===b){d.usedTimes--;0===d.usedTimes&&(e=!0);break}if(!0===e){e=[];a=0;for(c=Ba.length;a<c;a++)d=Ba[a],d.program!==b&&e.push(d);Ba=e;m.deleteProgram(b);G.info.memory.programs--}}};this.renderBufferImmediate=function(a,b,c){k();a.hasPositions&&!a.__webglVertexBuffer&&(a.__webglVertexBuffer=m.createBuffer());a.hasNormals&&!a.__webglNormalBuffer&&\n(a.__webglNormalBuffer=m.createBuffer());a.hasUvs&&!a.__webglUvBuffer&&(a.__webglUvBuffer=m.createBuffer());a.hasColors&&!a.__webglColorBuffer&&(a.__webglColorBuffer=m.createBuffer());a.hasPositions&&(m.bindBuffer(m.ARRAY_BUFFER,a.__webglVertexBuffer),m.bufferData(m.ARRAY_BUFFER,a.positionArray,m.DYNAMIC_DRAW),l(b.attributes.position),m.vertexAttribPointer(b.attributes.position,3,m.FLOAT,!1,0,0));if(a.hasNormals){m.bindBuffer(m.ARRAY_BUFFER,a.__webglNormalBuffer);if(c.shading===THREE.FlatShading){var d,\ne,f,g,h,p,r,q,s,t,u,w=3*a.count;for(u=0;u<w;u+=9)t=a.normalArray,d=t[u],e=t[u+1],f=t[u+2],g=t[u+3],p=t[u+4],q=t[u+5],h=t[u+6],r=t[u+7],s=t[u+8],d=(d+g+h)/3,e=(e+p+r)/3,f=(f+q+s)/3,t[u]=d,t[u+1]=e,t[u+2]=f,t[u+3]=d,t[u+4]=e,t[u+5]=f,t[u+6]=d,t[u+7]=e,t[u+8]=f}m.bufferData(m.ARRAY_BUFFER,a.normalArray,m.DYNAMIC_DRAW);l(b.attributes.normal);m.vertexAttribPointer(b.attributes.normal,3,m.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(m.bindBuffer(m.ARRAY_BUFFER,a.__webglUvBuffer),m.bufferData(m.ARRAY_BUFFER,a.uvArray,\nm.DYNAMIC_DRAW),l(b.attributes.uv),m.vertexAttribPointer(b.attributes.uv,2,m.FLOAT,!1,0,0));a.hasColors&&c.vertexColors!==THREE.NoColors&&(m.bindBuffer(m.ARRAY_BUFFER,a.__webglColorBuffer),m.bufferData(m.ARRAY_BUFFER,a.colorArray,m.DYNAMIC_DRAW),l(b.attributes.color),m.vertexAttribPointer(b.attributes.color,3,m.FLOAT,!1,0,0));n();m.drawArrays(m.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(!1!==d.visible){var g=z(a,b,c,d,f);a=g.attributes;b=e.attributes;c=!1;g=16777215*\ne.id+2*g.id+(d.wireframe?1:0);g!==ca&&(ca=g,c=!0);c&&k();if(f instanceof THREE.Mesh)if(g=b.index){var l,n;g.array instanceof Uint32Array?(l=m.UNSIGNED_INT,n=4):(l=m.UNSIGNED_SHORT,n=2);e=e.offsets;if(0===e.length)c&&(h(d,a,b,0),m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,g.buffer)),m.drawElements(m.TRIANGLES,g.array.length,l,0),G.info.render.calls++,G.info.render.vertices+=g.array.length,G.info.render.faces+=g.array.length/3;else{c=!0;for(var p=0,r=e.length;p<r;p++){var q=e[p].index;c&&(h(d,a,b,q),m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,\ng.buffer));m.drawElements(m.TRIANGLES,e[p].count,l,e[p].start*n);G.info.render.calls++;G.info.render.vertices+=e[p].count;G.info.render.faces+=e[p].count/3}}}else c&&h(d,a,b,0),d=e.attributes.position,m.drawArrays(m.TRIANGLES,0,d.array.length/3),G.info.render.calls++,G.info.render.vertices+=d.array.length/3,G.info.render.faces+=d.array.length/9;else if(f instanceof THREE.PointCloud)c&&h(d,a,b,0),d=b.position,m.drawArrays(m.POINTS,0,d.array.length/3),G.info.render.calls++,G.info.render.points+=d.array.length/\n3;else if(f instanceof THREE.Line)if(f=f.type===THREE.LineStrip?m.LINE_STRIP:m.LINES,O(d.linewidth),g=b.index)if(g.array instanceof Uint32Array?(l=m.UNSIGNED_INT,n=4):(l=m.UNSIGNED_SHORT,n=2),e=e.offsets,0===e.length)c&&(h(d,a,b,0),m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,g.buffer)),m.drawElements(f,g.array.length,l,0),G.info.render.calls++,G.info.render.vertices+=g.array.length;else for(1<e.length&&(c=!0),p=0,r=e.length;p<r;p++)q=e[p].index,c&&(h(d,a,b,q),m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,g.buffer)),\nm.drawElements(f,e[p].count,l,e[p].start*n),G.info.render.calls++,G.info.render.vertices+=e[p].count;else c&&h(d,a,b,0),d=b.position,m.drawArrays(f,0,d.array.length/3),G.info.render.calls++,G.info.render.points+=d.array.length/3}};this.renderBuffer=function(a,b,c,d,e,f){if(!1!==d.visible){var g,h;c=z(a,b,c,d,f);b=c.attributes;a=!1;c=16777215*e.id+2*c.id+(d.wireframe?1:0);c!==ca&&(ca=c,a=!0);a&&k();if(!d.morphTargets&&0<=b.position)a&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglVertexBuffer),l(b.position),\nm.vertexAttribPointer(b.position,3,m.FLOAT,!1,0,0));else if(f.morphTargetBase){c=d.program.attributes;-1!==f.morphTargetBase&&0<=c.position?(m.bindBuffer(m.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]),l(c.position),m.vertexAttribPointer(c.position,3,m.FLOAT,!1,0,0)):0<=c.position&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglVertexBuffer),l(c.position),m.vertexAttribPointer(c.position,3,m.FLOAT,!1,0,0));if(f.morphTargetForcedOrder.length){var p=0;h=f.morphTargetForcedOrder;for(g=f.morphTargetInfluences;p<\nd.numSupportedMorphTargets&&p<h.length;)0<=c[\"morphTarget\"+p]&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[h[p]]),l(c[\"morphTarget\"+p]),m.vertexAttribPointer(c[\"morphTarget\"+p],3,m.FLOAT,!1,0,0)),0<=c[\"morphNormal\"+p]&&d.morphNormals&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[h[p]]),l(c[\"morphNormal\"+p]),m.vertexAttribPointer(c[\"morphNormal\"+p],3,m.FLOAT,!1,0,0)),f.__webglMorphTargetInfluences[p]=g[h[p]],p++}else{h=[];g=f.morphTargetInfluences;var r,q=g.length;for(r=\n0;r<q;r++)p=g[r],0<p&&h.push([p,r]);h.length>d.numSupportedMorphTargets?(h.sort(t),h.length=d.numSupportedMorphTargets):h.length>d.numSupportedMorphNormals?h.sort(t):0===h.length&&h.push([0,0]);for(p=0;p<d.numSupportedMorphTargets;)h[p]?(r=h[p][1],0<=c[\"morphTarget\"+p]&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[r]),l(c[\"morphTarget\"+p]),m.vertexAttribPointer(c[\"morphTarget\"+p],3,m.FLOAT,!1,0,0)),0<=c[\"morphNormal\"+p]&&d.morphNormals&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[r]),\nl(c[\"morphNormal\"+p]),m.vertexAttribPointer(c[\"morphNormal\"+p],3,m.FLOAT,!1,0,0)),f.__webglMorphTargetInfluences[p]=g[r]):f.__webglMorphTargetInfluences[p]=0,p++}null!==d.program.uniforms.morphTargetInfluences&&m.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList)for(g=0,h=e.__webglCustomAttributesList.length;g<h;g++)c=e.__webglCustomAttributesList[g],0<=b[c.buffer.belongsToAttribute]&&(m.bindBuffer(m.ARRAY_BUFFER,c.buffer),l(b[c.buffer.belongsToAttribute]),\nm.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,m.FLOAT,!1,0,0));0<=b.color&&(0<f.geometry.colors.length||0<f.geometry.faces.length?(m.bindBuffer(m.ARRAY_BUFFER,e.__webglColorBuffer),l(b.color),m.vertexAttribPointer(b.color,3,m.FLOAT,!1,0,0)):d.defaultAttributeValues&&m.vertexAttrib3fv(b.color,d.defaultAttributeValues.color));0<=b.normal&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglNormalBuffer),l(b.normal),m.vertexAttribPointer(b.normal,3,m.FLOAT,!1,0,0));0<=b.tangent&&(m.bindBuffer(m.ARRAY_BUFFER,\ne.__webglTangentBuffer),l(b.tangent),m.vertexAttribPointer(b.tangent,4,m.FLOAT,!1,0,0));0<=b.uv&&(f.geometry.faceVertexUvs[0]?(m.bindBuffer(m.ARRAY_BUFFER,e.__webglUVBuffer),l(b.uv),m.vertexAttribPointer(b.uv,2,m.FLOAT,!1,0,0)):d.defaultAttributeValues&&m.vertexAttrib2fv(b.uv,d.defaultAttributeValues.uv));0<=b.uv2&&(f.geometry.faceVertexUvs[1]?(m.bindBuffer(m.ARRAY_BUFFER,e.__webglUV2Buffer),l(b.uv2),m.vertexAttribPointer(b.uv2,2,m.FLOAT,!1,0,0)):d.defaultAttributeValues&&m.vertexAttrib2fv(b.uv2,\nd.defaultAttributeValues.uv2));d.skinning&&0<=b.skinIndex&&0<=b.skinWeight&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglSkinIndicesBuffer),l(b.skinIndex),m.vertexAttribPointer(b.skinIndex,4,m.FLOAT,!1,0,0),m.bindBuffer(m.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),l(b.skinWeight),m.vertexAttribPointer(b.skinWeight,4,m.FLOAT,!1,0,0));0<=b.lineDistance&&(m.bindBuffer(m.ARRAY_BUFFER,e.__webglLineDistanceBuffer),l(b.lineDistance),m.vertexAttribPointer(b.lineDistance,1,m.FLOAT,!1,0,0))}n();f instanceof THREE.Mesh?\n(f=e.__typeArray===Uint32Array?m.UNSIGNED_INT:m.UNSIGNED_SHORT,d.wireframe?(O(d.wireframeLinewidth),a&&m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),m.drawElements(m.LINES,e.__webglLineCount,f,0)):(a&&m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),m.drawElements(m.TRIANGLES,e.__webglFaceCount,f,0)),G.info.render.calls++,G.info.render.vertices+=e.__webglFaceCount,G.info.render.faces+=e.__webglFaceCount/3):f instanceof THREE.Line?(f=f.type===THREE.LineStrip?m.LINE_STRIP:m.LINES,\nO(d.linewidth),m.drawArrays(f,0,e.__webglLineCount),G.info.render.calls++):f instanceof THREE.PointCloud&&(m.drawArrays(m.POINTS,0,e.__webglParticleCount),G.info.render.calls++,G.info.render.points+=e.__webglParticleCount)}};this.render=function(a,b,c,d){function e(a){a instanceof THREE.SkinnedMesh&&a.skeleton.update();for(var b=0,c=a.children.length;b<c;b++)e(a.children[b])}if(!1===b instanceof THREE.Camera)console.error(\"THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.\");else{var f,\ng,h,k,m=a.__lights,l=a.fog;Ca=-1;la=null;fb=!0;!0===a.autoUpdate&&a.updateMatrixWorld();void 0===b.parent&&b.updateMatrixWorld();e(a);b.matrixWorldInverse.getInverse(b.matrixWorld);Ub.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);jc.setFromMatrix(Ub);fc(a);Oa.length=0;Pa.length=0;s(a,a,b);!0===G.sortObjects&&(Oa.sort(q),Pa.sort(r));p(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||\nd)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);k=a.__webglObjectsImmediate;d=0;for(f=k.length;d<f;d++)g=k[d],h=g.object,h.visible&&(N(h,b),u(g));a.overrideMaterial?(d=a.overrideMaterial,this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst),this.setDepthTest(d.depthTest),this.setDepthWrite(d.depthWrite),J(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits),v(Oa,b,m,l,!0,d),v(Pa,b,m,l,!0,d),w(a.__webglObjectsImmediate,\"\",b,m,l,!1,d)):(d=null,this.setBlending(THREE.NoBlending),\nv(Oa,b,m,l,!1,d),w(a.__webglObjectsImmediate,\"opaque\",b,m,l,!1,d),v(Pa,b,m,l,!0,d),w(a.__webglObjectsImmediate,\"transparent\",b,m,l,!0,d));p(this.renderPluginsPost,a,b);c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter&&L(c);this.setDepthTest(!0);this.setDepthWrite(!0)}};this.renderImmediateObject=function(a,b,c,d,e){var f=z(a,b,c,d,e);ca=-1;G.setMaterialFaces(d);e.immediateRenderCallback?e.immediateRenderCallback(f,m,jc):e.render(function(a){G.renderBufferImmediate(a,\nf,d)})};var fc=function(a){a.__webglObjects||(a.__webglObjects={},a.__webglObjectsImmediate=[]);for(;a.__objectsAdded.length;){var c=a.__objectsAdded[0],d=a,e=void 0,f=void 0;void 0===c.__webglInit&&(c.__webglInit=!0,c._modelViewMatrix=new THREE.Matrix4,c._normalMatrix=new THREE.Matrix3);e=c.geometry;if(void 0!==e&&void 0===e.__webglInit)if(e.__webglInit=!0,e.addEventListener(\"dispose\",gc),e instanceof THREE.BufferGeometry)g(e);else if(c instanceof THREE.Mesh)void 0!==c.__webglActive&&I(c,d),D(d,\nc,e);else if(c instanceof THREE.Line){if(!e.__webglVertexBuffer){f=e;f.__webglVertexBuffer=m.createBuffer();f.__webglColorBuffer=m.createBuffer();f.__webglLineDistanceBuffer=m.createBuffer();G.info.memory.geometries++;var f=e,h=c,k=f.vertices.length;f.__vertexArray=new Float32Array(3*k);f.__colorArray=new Float32Array(3*k);f.__lineDistanceArray=new Float32Array(1*k);f.__webglLineCount=k;b(f,h);e.verticesNeedUpdate=!0;e.colorsNeedUpdate=!0;e.lineDistancesNeedUpdate=!0}}else c instanceof THREE.PointCloud&&\n!e.__webglVertexBuffer&&(f=e,f.__webglVertexBuffer=m.createBuffer(),f.__webglColorBuffer=m.createBuffer(),G.info.memory.geometries++,f=e,h=c,k=f.vertices.length,f.__vertexArray=new Float32Array(3*k),f.__colorArray=new Float32Array(3*k),f.__sortArray=[],f.__webglParticleCount=k,b(f,h),e.verticesNeedUpdate=!0,e.colorsNeedUpdate=!0);if(void 0===c.__webglActive){if(c instanceof THREE.Mesh)if(e=c.geometry,e instanceof THREE.BufferGeometry)A(d.__webglObjects,e,c);else{if(e instanceof THREE.Geometry)for(h=\n0,k=e.geometryGroupsList.length;h<k;h++)f=e.geometryGroupsList[h],A(d.__webglObjects,f,c)}else c instanceof THREE.Line||c instanceof THREE.PointCloud?(e=c.geometry,A(d.__webglObjects,e,c)):(c instanceof THREE.ImmediateRenderObject||c.immediateRenderCallback)&&d.__webglObjectsImmediate.push({id:null,object:c,opaque:null,transparent:null,z:0});c.__webglActive=!0}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;)I(a.__objectsRemoved[0],a),a.__objectsRemoved.splice(0,1)};this.initMaterial=\nfunction(a,b,c,d){var e,f,g,h;a.addEventListener(\"dispose\",ic);var k,l,n,p;a instanceof THREE.MeshDepthMaterial?p=\"depth\":a instanceof THREE.MeshNormalMaterial?p=\"normal\":a instanceof THREE.MeshBasicMaterial?p=\"basic\":a instanceof THREE.MeshLambertMaterial?p=\"lambert\":a instanceof THREE.MeshPhongMaterial?p=\"phong\":a instanceof THREE.LineBasicMaterial?p=\"basic\":a instanceof THREE.LineDashedMaterial?p=\"dashed\":a instanceof THREE.PointCloudMaterial&&(p=\"particle_basic\");p?(e=THREE.ShaderLib[p],a.__webglShader=\n{uniforms:THREE.UniformsUtils.clone(e.uniforms),vertexShader:e.vertexShader,fragmentShader:e.fragmentShader}):a.__webglShader={uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader};n=h=g=f=e=0;for(var r=b.length;n<r;n++){var q=b[n];q.onlyShadow||!1===q.visible||(q instanceof THREE.DirectionalLight&&e++,q instanceof THREE.PointLight&&f++,q instanceof THREE.SpotLight&&g++,q instanceof THREE.HemisphereLight&&h++)}r=n=0;for(q=b.length;r<q;r++){var s=b[r];s.castShadow&&(s instanceof\nTHREE.SpotLight&&n++,s instanceof THREE.DirectionalLight&&!s.shadowCascade&&n++)}b=n;Ob&&d&&d.skeleton&&d.skeleton.useVertexTexture?n=1024:(n=m.getParameter(m.MAX_VERTEX_UNIFORM_VECTORS),n=Math.floor((n-20)/4),void 0!==d&&d instanceof THREE.SkinnedMesh&&(n=Math.min(d.skeleton.bones.length,n),n<d.skeleton.bones.length&&console.warn(\"WebGLRenderer: too many bones - \"+d.skeleton.bones.length+\", this GPU supports just \"+n+\" (try OpenGL instead of ANGLE)\")));c={precision:W,supportsVertexTextures:Sb,map:!!a.map,\nenvMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,normalMap:!!a.normalMap,specularMap:!!a.specularMap,alphaMap:!!a.alphaMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,fogExp:c instanceof THREE.FogExp2,sizeAttenuation:a.sizeAttenuation,logarithmicDepthBuffer:Ea,skinning:a.skinning,maxBones:n,useVertexTexture:Ob&&d&&d.skeleton&&d.skeleton.useVertexTexture,morphTargets:a.morphTargets,morphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:e,\nmaxPointLights:f,maxSpotLights:g,maxHemiLights:h,maxShadows:b,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow&&0<b,shadowMapType:this.shadowMapType,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,wrapAround:a.wrapAround,doubleSided:a.side===THREE.DoubleSide,flipSided:a.side===THREE.BackSide};d=[];p?d.push(p):(d.push(a.fragmentShader),d.push(a.vertexShader));for(var t in a.defines)d.push(t),d.push(a.defines[t]);for(l in c)d.push(l),\nd.push(c[l]);p=d.join();var u;l=0;for(t=Ba.length;l<t;l++)if(d=Ba[l],d.code===p){u=d;u.usedTimes++;break}void 0===u&&(u=new THREE.WebGLProgram(this,p,a,c),Ba.push(u),G.info.memory.programs=Ba.length);a.program=u;u=a.program.attributes;if(a.morphTargets)for(a.numSupportedMorphTargets=0,t=\"morphTarget\",l=0;l<this.maxMorphTargets;l++)p=t+l,0<=u[p]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(a.numSupportedMorphNormals=0,t=\"morphNormal\",l=0;l<this.maxMorphNormals;l++)p=t+l,0<=u[p]&&a.numSupportedMorphNormals++;\na.uniformsList=[];for(k in a.__webglShader.uniforms)(l=a.program.uniforms[k])&&a.uniformsList.push([a.__webglShader.uniforms[k],l])};this.setFaceCulling=function(a,b){a===THREE.CullFaceNone?m.disable(m.CULL_FACE):(b===THREE.FrontFaceDirectionCW?m.frontFace(m.CW):m.frontFace(m.CCW),a===THREE.CullFaceBack?m.cullFace(m.BACK):a===THREE.CullFaceFront?m.cullFace(m.FRONT):m.cullFace(m.FRONT_AND_BACK),m.enable(m.CULL_FACE))};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide;a=a.side===THREE.BackSide;\nua!==b&&(b?m.disable(m.CULL_FACE):m.enable(m.CULL_FACE),ua=b);ja!==a&&(a?m.frontFace(m.CW):m.frontFace(m.CCW),ja=a)};this.setDepthTest=function(a){ra!==a&&(a?m.enable(m.DEPTH_TEST):m.disable(m.DEPTH_TEST),ra=a)};this.setDepthWrite=function(a){Da!==a&&(m.depthMask(a),Da=a)};this.setBlending=function(a,b,c,d){a!==Fa&&(a===THREE.NoBlending?m.disable(m.BLEND):a===THREE.AdditiveBlending?(m.enable(m.BLEND),m.blendEquation(m.FUNC_ADD),m.blendFunc(m.SRC_ALPHA,m.ONE)):a===THREE.SubtractiveBlending?(m.enable(m.BLEND),\nm.blendEquation(m.FUNC_ADD),m.blendFunc(m.ZERO,m.ONE_MINUS_SRC_COLOR)):a===THREE.MultiplyBlending?(m.enable(m.BLEND),m.blendEquation(m.FUNC_ADD),m.blendFunc(m.ZERO,m.SRC_COLOR)):a===THREE.CustomBlending?m.enable(m.BLEND):(m.enable(m.BLEND),m.blendEquationSeparate(m.FUNC_ADD,m.FUNC_ADD),m.blendFuncSeparate(m.SRC_ALPHA,m.ONE_MINUS_SRC_ALPHA,m.ONE,m.ONE_MINUS_SRC_ALPHA)),Fa=a);if(a===THREE.CustomBlending){if(b!==va&&(m.blendEquation(B(b)),va=b),c!==Ka||d!==aa)m.blendFunc(B(c),B(d)),Ka=c,aa=d}else aa=\nKa=va=null};this.setTexture=function(a,b){hack.log(\"\",hack.render,\"THREE.WebGLRenderer.setTexture\");if(a.needsUpdate){a.__webglInit||(a.__webglInit=!0,a.addEventListener(\"dispose\",Pb),a.__webglTexture=m.createTexture(),G.info.memory.textures++);m.activeTexture(m.TEXTURE0+b);m.bindTexture(m.TEXTURE_2D,a.__webglTexture);m.pixelStorei(m.UNPACK_FLIP_Y_WEBGL,a.flipY);m.pixelStorei(m.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);m.pixelStorei(m.UNPACK_ALIGNMENT,a.unpackAlignment);var c=a.image,d=THREE.Math.isPowerOfTwo(c.width)&&\nTHREE.Math.isPowerOfTwo(c.height),e=B(a.format),f=B(a.type);E(m.TEXTURE_2D,a,d);var g=a.mipmaps;if(a instanceof THREE.DataTexture)if(0<g.length&&d){for(var h=0,k=g.length;h<k;h++)c=g[h],m.texImage2D(m.TEXTURE_2D,h,e,c.width,c.height,0,e,f,c.data);a.generateMipmaps=!1}else m.texImage2D(m.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data);else if(a instanceof THREE.CompressedTexture)for(h=0,k=g.length;h<k;h++)c=g[h],a.format!==THREE.RGBAFormat?m.compressedTexImage2D(m.TEXTURE_2D,h,e,c.width,c.height,0,c.data):\nm.texImage2D(m.TEXTURE_2D,h,e,c.width,c.height,0,e,f,c.data);else if(0<g.length&&d){h=0;for(k=g.length;h<k;h++)c=g[h],m.texImage2D(m.TEXTURE_2D,h,e,e,f,c);a.generateMipmaps=!1}else m.texImage2D(m.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&m.generateMipmap(m.TEXTURE_2D);a.needsUpdate=!1;if(a.onUpdate)a.onUpdate()}else m.activeTexture(m.TEXTURE0+b),m.bindTexture(m.TEXTURE_2D,a.__webglTexture)};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){void 0===\na.depthBuffer&&(a.depthBuffer=!0);void 0===a.stencilBuffer&&(a.stencilBuffer=!0);a.addEventListener(\"dispose\",hc);a.__webglTexture=m.createTexture();G.info.memory.textures++;var c=THREE.Math.isPowerOfTwo(a.width)&&THREE.Math.isPowerOfTwo(a.height),d=B(a.format),e=B(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];m.bindTexture(m.TEXTURE_CUBE_MAP,a.__webglTexture);E(m.TEXTURE_CUBE_MAP,a,c);for(var f=0;6>f;f++){a.__webglFramebuffer[f]=m.createFramebuffer();a.__webglRenderbuffer[f]=m.createRenderbuffer();\nm.texImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=m.TEXTURE_CUBE_MAP_POSITIVE_X+f;m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer[f]);m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,h,g.__webglTexture,0);Q(a.__webglRenderbuffer[f],a)}c&&m.generateMipmap(m.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=m.createFramebuffer(),a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:m.createRenderbuffer(),m.bindTexture(m.TEXTURE_2D,a.__webglTexture),\nE(m.TEXTURE_2D,a,c),m.texImage2D(m.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=m.TEXTURE_2D,m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,d,a.__webglTexture,0),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_ATTACHMENT,m.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_STENCIL_ATTACHMENT,m.RENDERBUFFER,a.__webglRenderbuffer):\nQ(a.__webglRenderbuffer,a),c&&m.generateMipmap(m.TEXTURE_2D);b?m.bindTexture(m.TEXTURE_CUBE_MAP,null):m.bindTexture(m.TEXTURE_2D,null);m.bindRenderbuffer(m.RENDERBUFFER,null);m.bindFramebuffer(m.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=wb,a=sb,d=ma,e=Ja);b!==Za&&(m.bindFramebuffer(m.FRAMEBUFFER,b),m.viewport(d,e,c,a),Za=b);Hb=c;Ib=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);\nthis.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};\nTHREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format:\nTHREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null};\nTHREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,setSize:function(a,b){this.width=a;this.height=b},clone:function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.anisotropy=this.anisotropy;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;\na.shareDepthFrom=this.shareDepthFrom;return a},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);\nTHREE.WebGLProgram=function(){var a=0;return function(b,c,d,e){var f=b.context,g=d.defines,h=d.__webglShader.uniforms,k=d.attributes,l=d.__webglShader.vertexShader,n=d.__webglShader.fragmentShader,q=d.index0AttributeName;void 0===q&&!0===e.morphTargets&&(q=\"position\");var r=\"SHADOWMAP_TYPE_BASIC\";e.shadowMapType===THREE.PCFShadowMap?r=\"SHADOWMAP_TYPE_PCF\":e.shadowMapType===THREE.PCFSoftShadowMap&&(r=\"SHADOWMAP_TYPE_PCF_SOFT\");var t,s;t=[];for(var p in g)s=g[p],!1!==s&&(s=\"#define \"+p+\" \"+s,t.push(s));\nt=t.join(\"\\n\");g=f.createProgram();d instanceof THREE.RawShaderMaterial?b=d=\"\":(d=[\"precision \"+e.precision+\" float;\",\"precision \"+e.precision+\" int;\",t,e.supportsVertexTextures?\"#define VERTEX_TEXTURES\":\"\",b.gammaInput?\"#define GAMMA_INPUT\":\"\",b.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",\"#define MAX_DIR_LIGHTS \"+e.maxDirLights,\"#define MAX_POINT_LIGHTS \"+e.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+e.maxSpotLights,\"#define MAX_HEMI_LIGHTS \"+e.maxHemiLights,\"#define MAX_SHADOWS \"+e.maxShadows,\"#define MAX_BONES \"+\ne.maxBones,e.map?\"#define USE_MAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.vertexColors?\"#define USE_COLOR\":\"\",e.skinning?\"#define USE_SKINNING\":\"\",e.useVertexTexture?\"#define BONE_TEXTURE\":\"\",e.morphTargets?\"#define USE_MORPHTARGETS\":\"\",e.morphNormals?\"#define USE_MORPHNORMALS\":\"\",e.wrapAround?\"#define WRAP_AROUND\":\n\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+r:\"\",e.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",e.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",e.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",\"uniform mat4 modelMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\n\\tattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\n\\tattribute vec3 morphTarget0;\\n\\tattribute vec3 morphTarget1;\\n\\tattribute vec3 morphTarget2;\\n\\tattribute vec3 morphTarget3;\\n\\t#ifdef USE_MORPHNORMALS\\n\\t\\tattribute vec3 morphNormal0;\\n\\t\\tattribute vec3 morphNormal1;\\n\\t\\tattribute vec3 morphNormal2;\\n\\t\\tattribute vec3 morphNormal3;\\n\\t#else\\n\\t\\tattribute vec3 morphTarget4;\\n\\t\\tattribute vec3 morphTarget5;\\n\\t\\tattribute vec3 morphTarget6;\\n\\t\\tattribute vec3 morphTarget7;\\n\\t#endif\\n#endif\\n#ifdef USE_SKINNING\\n\\tattribute vec4 skinIndex;\\n\\tattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\"),\nb=[\"precision \"+e.precision+\" float;\",\"precision \"+e.precision+\" int;\",e.bumpMap||e.normalMap?\"#extension GL_OES_standard_derivatives : enable\":\"\",t,\"#define MAX_DIR_LIGHTS \"+e.maxDirLights,\"#define MAX_POINT_LIGHTS \"+e.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+e.maxSpotLights,\"#define MAX_HEMI_LIGHTS \"+e.maxHemiLights,\"#define MAX_SHADOWS \"+e.maxShadows,e.alphaTest?\"#define ALPHATEST \"+e.alphaTest:\"\",b.gammaInput?\"#define GAMMA_INPUT\":\"\",b.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",e.useFog&&e.fog?\"#define USE_FOG\":\n\"\",e.useFog&&e.fogExp?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.vertexColors?\"#define USE_COLOR\":\"\",e.metal?\"#define METAL\":\"\",e.wrapAround?\"#define WRAP_AROUND\":\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\n\"\",e.shadowMapEnabled?\"#define \"+r:\"\",e.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",e.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\"));l=new THREE.WebGLShader(f,f.VERTEX_SHADER,d+l);n=new THREE.WebGLShader(f,f.FRAGMENT_SHADER,b+n);f.attachShader(g,l);f.attachShader(g,n);void 0!==q&&f.bindAttribLocation(g,0,q);f.linkProgram(g);!1===f.getProgramParameter(g,f.LINK_STATUS)&&(console.error(\"THREE.WebGLProgram: Could not initialise shader.\"),\nconsole.error(\"gl.VALIDATE_STATUS\",f.getProgramParameter(g,f.VALIDATE_STATUS)),console.error(\"gl.getError()\",f.getError()));\"\"!==f.getProgramInfoLog(g)&&console.warn(\"THREE.WebGLProgram: gl.getProgramInfoLog()\",f.getProgramInfoLog(g));f.deleteShader(l);f.deleteShader(n);q=\"viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences bindMatrix bindMatrixInverse\".split(\" \");e.useVertexTexture?(q.push(\"boneTexture\"),q.push(\"boneTextureWidth\"),q.push(\"boneTextureHeight\")):\nq.push(\"boneGlobalMatrices\");e.logarithmicDepthBuffer&&q.push(\"logDepthBufFC\");for(var v in h)q.push(v);h=q;v={};q=0;for(b=h.length;q<b;q++)r=h[q],v[r]=f.getUniformLocation(g,r);this.uniforms=v;q=\"position normal uv uv2 tangent color skinIndex skinWeight lineDistance\".split(\" \");for(h=0;h<e.maxMorphTargets;h++)q.push(\"morphTarget\"+h);for(h=0;h<e.maxMorphNormals;h++)q.push(\"morphNormal\"+h);for(var w in k)q.push(w);e=q;k={};w=0;for(h=e.length;w<h;w++)v=e[w],k[v]=f.getAttribLocation(g,v);this.attributes=\nk;this.id=a++;this.code=c;this.usedTimes=1;this.program=g;this.vertexShader=l;this.fragmentShader=n;return this}}();\nTHREE.WebGLShader=function(){var a=function(a){a=a.split(\"\\n\");for(var c=0;c<a.length;c++)a[c]=c+1+\": \"+a[c];return a.join(\"\\n\")};return function(b,c,d){c=b.createShader(c);b.shaderSource(c,d);b.compileShader(c);!1===b.getShaderParameter(c,b.COMPILE_STATUS)&&console.error(\"THREE.WebGLShader: Shader couldn't compile.\");\"\"!==b.getShaderInfoLog(c)&&(console.warn(\"THREE.WebGLShader: gl.getShaderInfoLog()\",b.getShaderInfoLog(c)),console.warn(a(d)));return c}}();\nTHREE.RenderableVertex=function(){this.position=new THREE.Vector3;this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};\nTHREE.RenderableFace=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.normalModel=new THREE.Vector3;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsLength=0;this.color=new THREE.Color;this.material=null;this.uvs=[new THREE.Vector2,new THREE.Vector2,new THREE.Vector2];this.z=0};THREE.RenderableObject=function(){this.id=0;this.object=null;this.z=0};\nTHREE.RenderableSprite=function(){this.id=0;this.object=null;this.rotation=this.z=this.y=this.x=0;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.vertexColors=[new THREE.Color,new THREE.Color];this.material=null;this.z=0};\nTHREE.GeometryUtils={merge:function(a,b,c){console.warn(\"THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.\");var d;b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,b=b.geometry);a.merge(b,d,c)},center:function(a){console.warn(\"THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.\");return a.center()}};\nTHREE.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){var e=new THREE.ImageLoader;e.crossOrigin=this.crossOrigin;var f=new THREE.Texture(void 0,b);e.load(a,function(a){f.image=a;f.needsUpdate=!0;c&&c(f)},void 0,function(a){d&&d(a)});f.sourceFile=a;return f},loadTextureCube:function(a,b,c,d){var e=new THREE.ImageLoader;e.crossOrigin=this.crossOrigin;var f=new THREE.CubeTexture([],b);f.flipY=!1;var g=0;b=function(b){e.load(a[b],function(a){f.images[b]=a;g+=1;6===g&&(f.needsUpdate=!0,c&&\nc(f))})};d=0;for(var h=a.length;d<h;++d)b(d);return f},loadCompressedTexture:function(){console.error(\"THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.\")},loadCompressedTextureCube:function(){console.error(\"THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.\")},getNormalMap:function(a,b){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]};b|=1;var d=a.width,e=a.height,f=document.createElement(\"canvas\");\nf.width=d;f.height=e;var g=f.getContext(\"2d\");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,k=g.createImageData(d,e),l=k.data,n=0;n<d;n++)for(var q=0;q<e;q++){var r=0>q-1?0:q-1,t=q+1>e-1?e-1:q+1,s=0>n-1?0:n-1,p=n+1>d-1?d-1:n+1,v=[],w=[0,0,h[4*(q*d+n)]/255*b];v.push([-1,0,h[4*(q*d+s)]/255*b]);v.push([-1,-1,h[4*(r*d+s)]/255*b]);v.push([0,-1,h[4*(r*d+n)]/255*b]);v.push([1,-1,h[4*(r*d+p)]/255*b]);v.push([1,0,h[4*(q*d+p)]/255*b]);v.push([1,1,h[4*(t*d+p)]/255*b]);v.push([0,1,h[4*(t*d+n)]/255*\nb]);v.push([-1,1,h[4*(t*d+s)]/255*b]);r=[];s=v.length;for(t=0;t<s;t++){var p=v[t],u=v[(t+1)%s],p=[p[0]-w[0],p[1]-w[1],p[2]-w[2]],u=[u[0]-w[0],u[1]-w[1],u[2]-w[2]];r.push(c([p[1]*u[2]-p[2]*u[1],p[2]*u[0]-p[0]*u[2],p[0]*u[1]-p[1]*u[0]]))}v=[0,0,0];for(t=0;t<r.length;t++)v[0]+=r[t][0],v[1]+=r[t][1],v[2]+=r[t][2];v[0]/=r.length;v[1]/=r.length;v[2]/=r.length;w=4*(q*d+n);l[w]=(v[0]+1)/2*255|0;l[w+1]=(v[1]+1)/2*255|0;l[w+2]=255*v[2]|0;l[w+3]=255}g.putImageData(k,0,0);return f},generateDataTexture:function(a,\nb,c){var d=a*b,e=new Uint8Array(3*d),f=Math.floor(255*c.r),g=Math.floor(255*c.g);c=Math.floor(255*c.b);for(var h=0;h<d;h++)e[3*h]=f,e[3*h+1]=g,e[3*h+2]=c;a=new THREE.DataTexture(e,a,b,THREE.RGBFormat);a.needsUpdate=!0;return a}};\nTHREE.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new THREE.Object3D,d=0,e=b.length;d<e;d++)c.add(new THREE.Mesh(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);b.remove(a);c.add(a)}};\nTHREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){try{return this.faces[this.face][this.weight][this.style]}catch(a){throw\"The font \"+this.face+\" with \"+this.weight+\" weight and \"+this.style+\" style is missing.\";}},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=\na},drawText:function(a){var b=this.getFace(),c=this.size/b.resolution,d=0,e=String(a).split(\"\"),f=e.length,g=[];for(a=0;a<f;a++){var h=new THREE.Path,h=this.extractGlyphPoints(e[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,e){var f=[],g,h,k,l,n,q,r,t,s,p,v,w=b.glyphs[a]||b.glyphs[\"?\"];if(w){if(w.o)for(b=w._cachedOutline||(w._cachedOutline=w.o.split(\" \")),l=b.length,a=0;a<l;)switch(k=b[a++],k){case \"m\":k=b[a++]*c+d;n=b[a++]*c;e.moveTo(k,n);\nbreak;case \"l\":k=b[a++]*c+d;n=b[a++]*c;e.lineTo(k,n);break;case \"q\":k=b[a++]*c+d;n=b[a++]*c;t=b[a++]*c+d;s=b[a++]*c;e.quadraticCurveTo(t,s,k,n);if(g=f[f.length-1])for(q=g.x,r=g.y,g=1,h=this.divisions;g<=h;g++){var u=g/h;THREE.Shape.Utils.b2(u,q,t,k);THREE.Shape.Utils.b2(u,r,s,n)}break;case \"b\":if(k=b[a++]*c+d,n=b[a++]*c,t=b[a++]*c+d,s=b[a++]*c,p=b[a++]*c+d,v=b[a++]*c,e.bezierCurveTo(t,s,p,v,k,n),g=f[f.length-1])for(q=g.x,r=g.y,g=1,h=this.divisions;g<=h;g++)u=g/h,THREE.Shape.Utils.b3(u,q,t,p,k),THREE.Shape.Utils.b3(u,\nr,s,v,n)}return{offset:w.ha*c,path:e}}}};\nTHREE.FontUtils.generateShapes=function(a,b){b=b||{};var c=void 0!==b.curveSegments?b.curveSegments:4,d=void 0!==b.font?b.font:\"helvetiker\",e=void 0!==b.weight?b.weight:\"normal\",f=void 0!==b.style?b.style:\"normal\";THREE.FontUtils.size=void 0!==b.size?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=e;THREE.FontUtils.style=f;c=THREE.FontUtils.drawText(a).paths;d=[];e=0;for(f=c.length;e<f;e++)Array.prototype.push.apply(d,c[e].toShapes());return d};\n(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e+=a[f].x*a[g].y-a[g].x*a[f].y;return.5*e};a.Triangulate=function(a,d){var e=a.length;if(3>e)return null;var f=[],g=[],h=[],k,l,n;if(0<b(a))for(l=0;l<e;l++)g[l]=l;else for(l=0;l<e;l++)g[l]=e-1-l;var q=2*e;for(l=e-1;2<e;){if(0>=q--){console.log(\"Warning, unable to triangulate polygon!\");break}k=l;e<=k&&(k=0);l=k+1;e<=l&&(l=0);n=l+1;e<=n&&(n=0);var r;a:{var t=r=void 0,s=void 0,p=void 0,v=void 0,w=void 0,u=void 0,D=void 0,A=void 0,\nt=a[g[k]].x,s=a[g[k]].y,p=a[g[l]].x,v=a[g[l]].y,w=a[g[n]].x,u=a[g[n]].y;if(1E-10>(p-t)*(u-s)-(v-s)*(w-t))r=!1;else{var x=void 0,C=void 0,I=void 0,z=void 0,y=void 0,K=void 0,N=void 0,ba=void 0,P=void 0,O=void 0,P=ba=N=A=D=void 0,x=w-p,C=u-v,I=t-w,z=s-u,y=p-t,K=v-s;for(r=0;r<e;r++)if(D=a[g[r]].x,A=a[g[r]].y,!(D===t&&A===s||D===p&&A===v||D===w&&A===u)&&(N=D-t,ba=A-s,P=D-p,O=A-v,D-=w,A-=u,P=x*O-C*P,N=y*ba-K*N,ba=I*A-z*D,-1E-10<=P&&-1E-10<=ba&&-1E-10<=N)){r=!1;break a}r=!0}}if(r){f.push([a[g[k]],a[g[l]],\na[g[n]]]);h.push([g[k],g[l],g[n]]);k=l;for(n=l+1;n<e;k++,n++)g[k]=g[n];e--;q=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};THREE.typeface_js=self._typeface_js;THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(a){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(a){a=this.getUtoTmapping(a);return this.getPoint(a)};\nTHREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};THREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};\nTHREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++)c=this.getPoint(e/a),f+=c.distanceTo(d),b.push(f),d=c;return this.cacheArcLengths=b};THREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=!0;this.getLengths()};\nTHREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,k;g<=h;)if(d=Math.floor(g+(h-g)/2),k=c[d]-f,0>k)g=d+1;else if(0<k)h=d-1;else{h=d;break}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getTangent=function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()};\nTHREE.Curve.prototype.getTangentAt=function(a){a=this.getUtoTmapping(a);return this.getTangent(a)};\nTHREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a,b,c,d,e){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){a=.5*(c-a);d=.5*(d-b);var f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};\nTHREE.Curve.create=function(a,b){a.prototype=Object.create(THREE.Curve.prototype);a.prototype.getPoint=b;return a};THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=!1};THREE.CurvePath.prototype=Object.create(THREE.Curve.prototype);THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};\nTHREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],b=1-b/a.getLength(),a.getPointAt(b);a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};\nTHREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a};\nTHREE.CurvePath.prototype.getBoundingBox=function(){var a=this.getPoints(),b,c,d,e,f,g;b=c=Number.NEGATIVE_INFINITY;e=f=Number.POSITIVE_INFINITY;var h,k,l,n,q=a[0]instanceof THREE.Vector3;n=q?new THREE.Vector3:new THREE.Vector2;k=0;for(l=a.length;k<l;k++)h=a[k],h.x>b?b=h.x:h.x<e&&(e=h.x),h.y>c?c=h.y:h.y<f&&(f=h.y),q&&(h.z>d?d=h.z:h.z<g&&(g=h.z)),n.add(h);a={minX:e,minY:f,maxX:b,maxY:c};q&&(a.maxZ=d,a.minZ=g);return a};\nTHREE.CurvePath.prototype.createPointsGeometry=function(a){a=this.getPoints(a,!0);return this.createGeometry(a)};THREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){a=this.getSpacedPoints(a,!0);return this.createGeometry(a)};THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0;c<a.length;c++)b.vertices.push(new THREE.Vector3(a[c].x,a[c].y,a[c].z||0));return b};THREE.CurvePath.prototype.addWrapPath=function(a){this.bends.push(a)};\nTHREE.CurvePath.prototype.getTransformedPoints=function(a,b){var c=this.getPoints(a),d,e;b||(b=this.bends);d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(a,b){var c=this.getSpacedPoints(a),d,e;b||(b=this.bends);d=0;for(e=b.length;d<e;d++)c=this.getWrapPoints(c,b[d]);return c};\nTHREE.CurvePath.prototype.getWrapPoints=function(a,b){var c=this.getBoundingBox(),d,e,f,g,h,k;d=0;for(e=a.length;d<e;d++)f=a[d],g=f.x,h=f.y,k=g/c.maxX,k=b.getUtoTmapping(k,g),g=b.getPoint(k),k=b.getTangent(k),k.set(-k.y,k.x).multiplyScalar(h),f.x=g.x+k.x,f.y=g.y+k.y;return a};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)this.parent?(this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorld.decompose(this.translationWorld,this.quaternionWorld,this.scaleWorld),this.matrix.decompose(this.translationObject,this.quaternionObject,this.scaleObject),this.matrixWorld.compose(this.translationWorld,this.quaternionObject,this.scaleWorld)):this.matrixWorld.copy(this.matrix),\nthis.matrixWorldNeedsUpdate=!1,a=!0;for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.quaternionWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.quaternionObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;\nTHREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=Object.create(THREE.CurvePath.prototype);THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\",ELLIPSE:\"ellipse\"};THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};\nTHREE.Path.prototype.moveTo=function(a,b){var c=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:c})};THREE.Path.prototype.lineTo=function(a,b){var c=Array.prototype.slice.call(arguments),d=this.actions[this.actions.length-1].args,d=new THREE.LineCurve(new THREE.Vector2(d[d.length-2],d[d.length-1]),new THREE.Vector2(a,b));this.curves.push(d);this.actions.push({action:THREE.PathActions.LINE_TO,args:c})};\nTHREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=Array.prototype.slice.call(arguments),f=this.actions[this.actions.length-1].args,f=new THREE.QuadraticBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d));this.curves.push(f);this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:e})};\nTHREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,f){var g=Array.prototype.slice.call(arguments),h=this.actions[this.actions.length-1].args,h=new THREE.CubicBezierCurve(new THREE.Vector2(h[h.length-2],h[h.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,f));this.curves.push(h);this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:g})};\nTHREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);c=new THREE.SplineCurve(c);this.curves.push(c);this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:b})};THREE.Path.prototype.arc=function(a,b,c,d,e,f){var g=this.actions[this.actions.length-1].args;this.absarc(a+g[g.length-2],b+g[g.length-1],c,d,e,f)};\nTHREE.Path.prototype.absarc=function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)};THREE.Path.prototype.ellipse=function(a,b,c,d,e,f,g){var h=this.actions[this.actions.length-1].args;this.absellipse(a+h[h.length-2],b+h[h.length-1],c,d,e,f,g)};THREE.Path.prototype.absellipse=function(a,b,c,d,e,f,g){var h=Array.prototype.slice.call(arguments),k=new THREE.EllipseCurve(a,b,c,d,e,f,g);this.curves.push(k);k=k.getPoint(1);h.push(k.x);h.push(k.y);this.actions.push({action:THREE.PathActions.ELLIPSE,args:h})};\nTHREE.Path.prototype.getSpacedPoints=function(a,b){a||(a=40);for(var c=[],d=0;d<a;d++)c.push(this.getPoint(d/a));return c};\nTHREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints)return console.log(\"tata\"),this.getSpacedPoints(a,b);a=a||12;var c=[],d,e,f,g,h,k,l,n,q,r,t,s,p;d=0;for(e=this.actions.length;d<e;d++)switch(f=this.actions[d],g=f.action,f=f.args,g){case THREE.PathActions.MOVE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.LINE_TO:c.push(new THREE.Vector2(f[0],f[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:h=f[2];k=f[3];q=f[0];r=f[1];0<c.length?(g=c[c.length-1],t=g.x,\ns=g.y):(g=this.actions[d-1].args,t=g[g.length-2],s=g[g.length-1]);for(f=1;f<=a;f++)p=f/a,g=THREE.Shape.Utils.b2(p,t,q,h),p=THREE.Shape.Utils.b2(p,s,r,k),c.push(new THREE.Vector2(g,p));break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];k=f[5];q=f[0];r=f[1];l=f[2];n=f[3];0<c.length?(g=c[c.length-1],t=g.x,s=g.y):(g=this.actions[d-1].args,t=g[g.length-2],s=g[g.length-1]);for(f=1;f<=a;f++)p=f/a,g=THREE.Shape.Utils.b3(p,t,q,l,h),p=THREE.Shape.Utils.b3(p,s,r,n,k),c.push(new THREE.Vector2(g,p));break;case THREE.PathActions.CSPLINE_THRU:g=\nthis.actions[d-1].args;p=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;p=p.concat(f[0]);p=new THREE.SplineCurve(p);for(f=1;f<=g;f++)c.push(p.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];k=f[1];r=f[2];l=f[3];g=f[4];q=!!f[5];t=g-l;s=2*a;for(f=1;f<=s;f++)p=f/s,q||(p=1-p),p=l+p*t,g=h+r*Math.cos(p),p=k+r*Math.sin(p),c.push(new THREE.Vector2(g,p));break;case THREE.PathActions.ELLIPSE:for(h=f[0],k=f[1],r=f[2],n=f[3],l=f[4],g=f[5],q=!!f[6],t=g-l,s=2*a,f=1;f<=s;f++)p=f/s,q||\n(p=1-p),p=l+p*t,g=h+r*Math.cos(p),p=k+n*Math.sin(p),c.push(new THREE.Vector2(g,p))}d=c[c.length-1];1E-10>Math.abs(d.x-c[0].x)&&1E-10>Math.abs(d.y-c[0].y)&&c.splice(c.length-1,1);b&&c.push(c[0]);return c};\nTHREE.Path.prototype.toShapes=function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new THREE.Shape;f.actions=e.actions;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,l=h.y-g.y;if(1E-10<Math.abs(l)){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.y<g.y||a.y>h.y))if(a.y==g.y){if(a.x==g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0==e)return!0;0>e||(d=!d)}}else if(a.y==g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=\nh.x))return!0}return d}var e=function(a){var b,c,d,e,f=[],g=new THREE.Path;b=0;for(c=a.length;b<c;b++)d=a[b],e=d.args,d=d.action,d==THREE.PathActions.MOVE_TO&&0!=g.actions.length&&(f.push(g),g=new THREE.Path),g[d].apply(g,e);0!=g.actions.length&&f.push(g);return f}(this.actions);if(0==e.length)return[];if(!0===b)return c(e);var f,g,h,k=[];if(1==e.length)return g=e[0],h=new THREE.Shape,h.actions=g.actions,h.curves=g.curves,k.push(h),k;var l=!THREE.Shape.Utils.isClockWise(e[0].getPoints()),l=a?!l:l;\nh=[];var n=[],q=[],r=0,t;n[r]=void 0;q[r]=[];var s,p;s=0;for(p=e.length;s<p;s++)g=e[s],t=g.getPoints(),f=THREE.Shape.Utils.isClockWise(t),(f=a?!f:f)?(!l&&n[r]&&r++,n[r]={s:new THREE.Shape,p:t},n[r].s.actions=g.actions,n[r].s.curves=g.curves,l&&r++,q[r]=[]):q[r].push({h:g,p:t[0]});if(!n[0])return c(e);if(1<n.length){s=!1;p=[];g=0;for(e=n.length;g<e;g++)h[g]=[];g=0;for(e=n.length;g<e;g++)for(f=q[g],l=0;l<f.length;l++){r=f[l];t=!0;for(var v=0;v<n.length;v++)d(r.p,n[v].p)&&(g!=v&&p.push({froms:g,tos:v,\nhole:l}),t?(t=!1,h[v].push(r)):s=!0);t&&h[g].push(r)}0<p.length&&(s||(q=h))}s=0;for(p=n.length;s<p;s++)for(h=n[s].s,k.push(h),g=q[s],e=0,f=g.length;e<f;e++)h.holes.push(g[e].h);return k};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=Object.create(THREE.Path.prototype);THREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.makeGeometry=function(a){return new THREE.ShapeGeometry(this,a)};\nTHREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};THREE.Shape.prototype.getSpacedPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedSpacedPoints(a,this.bends);return d};THREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getTransformedPoints(a),holes:this.getPointsHoles(a)}};\nTHREE.Shape.prototype.extractPoints=function(a){return this.useSpacedPoints?this.extractAllSpacedPoints(a):this.extractAllPoints(a)};THREE.Shape.prototype.extractAllSpacedPoints=function(a){return{shape:this.getTransformedSpacedPoints(a),holes:this.getSpacedPointsHoles(a)}};\nTHREE.Shape.Utils={triangulateShape:function(a,b){function c(a,b,c){return a.x!=b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function d(a,b,d,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-d.x,l=e.y-d.y,n=a.x-d.x,q=a.y-d.y,I=h*k-g*l,z=h*n-g*q;if(1E-10<Math.abs(I)){if(0<I){if(0>z||z>I)return[];k=l*n-k*q;if(0>k||k>I)return[]}else{if(0<z||z<I)return[];k=l*n-k*q;if(0<k||k<I)return[]}if(0==k)return!f||0!=z&&z!=I?[a]:[];if(k==I)return!f||0!=z&&z!=I?[b]:[];if(0==z)return[d];\nif(z==I)return[e];f=k/I;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!=z||l*n!=k*q)return[];h=0==g&&0==h;k=0==k&&0==l;if(h&&k)return a.x!=d.x||a.y!=d.y?[]:[a];if(h)return c(d,e,a)?[a]:[];if(k)return c(a,b,d)?[d]:[];0!=g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),d.x<e.x?(b=d,I=d.x,l=e,d=e.x):(b=e,I=e.x,l=d,d=d.x)):(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),d.y<e.y?(b=d,I=d.y,l=e,d=e.y):(b=e,I=e.y,l=d,d=d.y));return k<=I?a<I?[]:a==I?f?[]:[b]:a<=d?[b,h]:[b,l]:k>d?[]:k==d?f?[]:[g]:a<=d?[g,h]:\n[g,l]}function e(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return 1E-10<Math.abs(a)?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}var f,g,h,k,l,n={};h=a.concat();f=0;for(g=b.length;f<g;f++)Array.prototype.push.apply(h,b[f]);f=0;for(g=h.length;f<g;f++)l=h[f].x+\":\"+h[f].y,void 0!==n[l]&&console.log(\"Duplicate point\",l),n[l]=f;f=function(a,b){function c(a,b){var d=h.length-1,f=a-1;0>f&&(f=d);var g=a+1;g>d&&(g=0);d=e(h[a],h[f],h[g],k[b]);if(!d)return!1;\nd=k.length-1;f=b-1;0>f&&(f=d);g=b+1;g>d&&(g=0);return(d=e(k[b],k[f],k[g],h[a]))?!0:!1}function f(a,b){var c,e;for(c=0;c<h.length;c++)if(e=c+1,e%=h.length,e=d(a,b,h[c],h[e],!0),0<e.length)return!0;return!1}function g(a,c){var e,f,h,k;for(e=0;e<l.length;e++)for(f=b[l[e]],h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=d(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=a.concat(),k,l=[],n,q,C,I,z,y=[],K,N,ba,P=0;for(n=b.length;P<n;P++)l.push(P);K=0;for(var O=2*l.length;0<l.length;){O--;if(0>O){console.log(\"Infinite Loop! Holes left:\"+\nl.length+\", Probably Hole outside Shape!\");break}for(q=K;q<h.length;q++){C=h[q];n=-1;for(P=0;P<l.length;P++)if(I=l[P],z=C.x+\":\"+C.y+\":\"+I,void 0===y[z]){k=b[I];for(N=0;N<k.length;N++)if(I=k[N],c(q,N)&&!f(C,I)&&!g(C,I)){n=N;l.splice(P,1);K=h.slice(0,q+1);I=h.slice(q);N=k.slice(n);ba=k.slice(0,n+1);h=K.concat(N).concat(ba).concat(I);K=q;break}if(0<=n)break;y[z]=!0}if(0<=n)break}}return h}(a,b);var q=THREE.FontUtils.Triangulate(f,!1);f=0;for(g=q.length;f<g;f++)for(k=q[f],h=0;3>h;h++)l=k[h].x+\":\"+k[h].y,\nl=n[l],void 0!==l&&(k[h]=l);return q.concat()},isClockWise:function(a){return 0>THREE.FontUtils.Triangulate.area(a)},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,\nb)+this.b3p1(a,c)+this.b3p2(a,d)+this.b3p3(a,e)}};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};\nTHREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};\nTHREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype);\nTHREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};THREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};\nTHREE.SplineCurve=function(a){this.points=void 0==a?[]:a};THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e-=a;c[0]=0==a?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};\nTHREE.EllipseCurve=function(a,b,c,d,e,f,g){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype);\nTHREE.EllipseCurve.prototype.getPoint=function(a){var b;b=this.aEndAngle-this.aStartAngle;0>b&&(b+=2*Math.PI);b>2*Math.PI&&(b-=2*Math.PI);b=!0===this.aClockwise?this.aEndAngle+(1-a)*(2*Math.PI-b):this.aStartAngle+a*b;a=this.aX+this.xRadius*Math.cos(b);b=this.aY+this.yRadius*Math.sin(b);return new THREE.Vector2(a,b)};THREE.ArcCurve=function(a,b,c,d,e,f){THREE.EllipseCurve.call(this,a,b,c,c,d,e,f)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype);\nTHREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b});THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)});\nTHREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)});\nTHREE.SplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;a*=d.length-1;e=Math.floor(a);a-=e;c[0]=0==e?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b});\nTHREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e-=a;a+=0<a?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length;c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z,\nd[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});\nTHREE.AnimationHandler={LINEAR:0,CATMULLROM:1,CATMULLROM_FORWARD:2,add:function(){console.warn(\"THREE.AnimationHandler.add() has been deprecated.\")},get:function(){console.warn(\"THREE.AnimationHandler.get() has been deprecated.\")},remove:function(){console.warn(\"THREE.AnimationHandler.remove() has been deprecated.\")},animations:[],init:function(a){if(!0!==a.initialized){for(var b=0;b<a.hierarchy.length;b++){for(var c=0;c<a.hierarchy[b].keys.length;c++)if(0>a.hierarchy[b].keys[c].time&&(a.hierarchy[b].keys[c].time=\n0),void 0!==a.hierarchy[b].keys[c].rot&&!(a.hierarchy[b].keys[c].rot instanceof THREE.Quaternion)){var d=a.hierarchy[b].keys[c].rot;a.hierarchy[b].keys[c].rot=(new THREE.Quaternion).fromArray(d)}if(a.hierarchy[b].keys.length&&void 0!==a.hierarchy[b].keys[0].morphTargets){d={};for(c=0;c<a.hierarchy[b].keys.length;c++)for(var e=0;e<a.hierarchy[b].keys[c].morphTargets.length;e++){var f=a.hierarchy[b].keys[c].morphTargets[e];d[f]=-1}a.hierarchy[b].usedMorphTargets=d;for(c=0;c<a.hierarchy[b].keys.length;c++){var g=\n{};for(f in d){for(e=0;e<a.hierarchy[b].keys[c].morphTargets.length;e++)if(a.hierarchy[b].keys[c].morphTargets[e]===f){g[f]=a.hierarchy[b].keys[c].morphTargetsInfluences[e];break}e===a.hierarchy[b].keys[c].morphTargets.length&&(g[f]=0)}a.hierarchy[b].keys[c].morphTargetsInfluences=g}}for(c=1;c<a.hierarchy[b].keys.length;c++)a.hierarchy[b].keys[c].time===a.hierarchy[b].keys[c-1].time&&(a.hierarchy[b].keys.splice(c,1),c--);for(c=0;c<a.hierarchy[b].keys.length;c++)a.hierarchy[b].keys[c].index=c}a.initialized=\n!0;return a}},parse:function(a){var b=function(a,c){c.push(a);for(var d=0;d<a.children.length;d++)b(a.children[d],c)},c=[];if(a instanceof THREE.SkinnedMesh)for(var d=0;d<a.skeleton.bones.length;d++)c.push(a.skeleton.bones[d]);else b(a,c);return c},play:function(a){-1===this.animations.indexOf(a)&&this.animations.push(a)},stop:function(a){a=this.animations.indexOf(a);-1!==a&&this.animations.splice(a,1)},update:function(a){for(var b=0;b<this.animations.length;b++)this.animations[b].update(a)}};\nTHREE.Animation=function(a,b){this.root=a;this.data=THREE.AnimationHandler.init(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=1;this.isPlaying=!1;this.loop=!0;this.weight=0;this.interpolationType=THREE.AnimationHandler.LINEAR};THREE.Animation.prototype.keyTypes=[\"pos\",\"rot\",\"scl\"];THREE.Animation.prototype.play=function(a,b){this.currentTime=void 0!==a?a:0;this.weight=void 0!==b?b:1;this.isPlaying=!0;this.reset();THREE.AnimationHandler.play(this)};\nTHREE.Animation.prototype.stop=function(){this.isPlaying=!1;THREE.AnimationHandler.stop(this)};\nTHREE.Animation.prototype.reset=function(){for(var a=0,b=this.hierarchy.length;a<b;a++){var c=this.hierarchy[a];c.matrixAutoUpdate=!0;void 0===c.animationCache&&(c.animationCache={});void 0===c.animationCache[this.data.name]&&(c.animationCache[this.data.name]={},c.animationCache[this.data.name].prevKey={pos:0,rot:0,scl:0},c.animationCache[this.data.name].nextKey={pos:0,rot:0,scl:0},c.animationCache[this.data.name].originalMatrix=c.matrix);for(var c=c.animationCache[this.data.name],d=0;3>d;d++){for(var e=\nthis.keyTypes[d],f=this.data.hierarchy[a].keys[0],g=this.getNextKeyWith(e,a,1);g.time<this.currentTime&&g.index>f.index;)f=g,g=this.getNextKeyWith(e,a,g.index+1);c.prevKey[e]=f;c.nextKey[e]=g}}};\nTHREE.Animation.prototype.update=function(){var a=[],b=new THREE.Vector3,c=new THREE.Vector3,d=new THREE.Quaternion,e=function(a,b){var c=[],d=[],e,q,r,t,s,p;e=(a.length-1)*b;q=Math.floor(e);e-=q;c[0]=0===q?q:q-1;c[1]=q;c[2]=q>a.length-2?q:q+1;c[3]=q>a.length-3?q:q+2;q=a[c[0]];t=a[c[1]];s=a[c[2]];p=a[c[3]];c=e*e;r=e*c;d[0]=f(q[0],t[0],s[0],p[0],e,c,r);d[1]=f(q[1],t[1],s[1],p[1],e,c,r);d[2]=f(q[2],t[2],s[2],p[2],e,c,r);return d},f=function(a,b,c,d,e,f,r){a=.5*(c-a);d=.5*(d-b);return(2*(b-c)+a+d)*r+\n(-3*(b-c)-2*a-d)*f+a*e+b};return function(f){if(!1!==this.isPlaying&&(this.currentTime+=f*this.timeScale,0!==this.weight)){f=this.data.length;if(!0===this.loop&&this.currentTime>f)this.currentTime%=f,this.reset();else if(!1===this.loop&&this.currentTime>f){this.stop();return}f=0;for(var h=this.hierarchy.length;f<h;f++)for(var k=this.hierarchy[f],l=k.animationCache[this.data.name],n=0;3>n;n++){var q=this.keyTypes[n],r=l.prevKey[q],t=l.nextKey[q];if(t.time<=this.currentTime){r=this.data.hierarchy[f].keys[0];\nfor(t=this.getNextKeyWith(q,f,1);t.time<this.currentTime&&t.index>r.index;)r=t,t=this.getNextKeyWith(q,f,t.index+1);l.prevKey[q]=r;l.nextKey[q]=t}k.matrixAutoUpdate=!0;k.matrixWorldNeedsUpdate=!0;var s=(this.currentTime-r.time)/(t.time-r.time),p=r[q],v=t[q];0>s&&(s=0);1<s&&(s=1);if(\"pos\"===q)if(this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=p[0]+(v[0]-p[0])*s,c.y=p[1]+(v[1]-p[1])*s,c.z=p[2]+(v[2]-p[2])*s,k instanceof THREE.Bone?(r=this.weight/(this.weight+k.accumulatedPosWeight),k.position.lerp(c,\nr),k.accumulatedPosWeight+=this.weight):k.position.copy(c);else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)a[0]=this.getPrevKeyWith(\"pos\",f,r.index-1).pos,a[1]=p,a[2]=v,a[3]=this.getNextKeyWith(\"pos\",f,t.index+1).pos,s=.33*s+.33,t=e(a,s),r=1,k instanceof THREE.Bone&&(r=this.weight/(this.weight+k.accumulatedPosWeight),k.accumulatedPosWeight+=this.weight),q=k.position,q.x+=(t[0]-q.x)*r,q.y+=(t[1]-q.y)*r,q.z+=(t[2]-\nq.z)*r,this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD&&(s=e(a,1.01*s),b.set(s[0],s[1],s[2]),b.sub(q),b.y=0,b.normalize(),s=Math.atan2(b.x,b.z),k.rotation.set(0,s,0))}else\"rot\"===q?(THREE.Quaternion.slerp(p,v,d,s),k instanceof THREE.Bone?0===k.accumulatedRotWeight?(k.quaternion.copy(d),k.accumulatedRotWeight=this.weight):(r=this.weight/(this.weight+k.accumulatedRotWeight),THREE.Quaternion.slerp(k.quaternion,d,k.quaternion,r),k.accumulatedRotWeight+=this.weight):k.quaternion.copy(d)):\n\"scl\"===q&&(c.x=p[0]+(v[0]-p[0])*s,c.y=p[1]+(v[1]-p[1])*s,c.z=p[2]+(v[2]-p[2])*s,k instanceof THREE.Bone?(r=this.weight/(this.weight+k.accumulatedSclWeight),k.scale.lerp(c,r),k.accumulatedSclWeight+=this.weight):k.scale.copy(c))}return!0}}}();\nTHREE.Animation.prototype.getNextKeyWith=function(a,b,c){var d=this.data.hierarchy[b].keys;for(c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c<d.length-1?c:d.length-1:c%d.length;c<d.length;c++)if(void 0!==d[c][a])return d[c];return this.data.hierarchy[b].keys[0]};\nTHREE.Animation.prototype.getPrevKeyWith=function(a,b,c){var d=this.data.hierarchy[b].keys;for(c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?0<c?c:0:0<=c?c:c+d.length;0<=c;c--)if(void 0!==d[c][a])return d[c];return this.data.hierarchy[b].keys[d.length-1]};\nTHREE.KeyFrameAnimation=function(a){this.root=a.node;this.data=THREE.AnimationHandler.init(a);this.hierarchy=THREE.AnimationHandler.parse(this.root);this.currentTime=0;this.timeScale=.001;this.isPlaying=!1;this.loop=this.isPaused=!0;a=0;for(var b=this.hierarchy.length;a<b;a++){var c=this.data.hierarchy[a].sids,d=this.hierarchy[a];if(this.data.hierarchy[a].keys.length&&c){for(var e=0;e<c.length;e++){var f=c[e],g=this.getNextKeyWith(f,a,0);g&&g.apply(f)}d.matrixAutoUpdate=!1;this.data.hierarchy[a].node.updateMatrix();\nd.matrixWorldNeedsUpdate=!0}}};\nTHREE.KeyFrameAnimation.prototype.play=function(a){this.currentTime=void 0!==a?a:0;if(!1===this.isPlaying){this.isPlaying=!0;var b=this.hierarchy.length,c,d;for(a=0;a<b;a++)c=this.hierarchy[a],d=this.data.hierarchy[a],void 0===d.animationCache&&(d.animationCache={},d.animationCache.prevKey=null,d.animationCache.nextKey=null,d.animationCache.originalMatrix=c.matrix),c=this.data.hierarchy[a].keys,c.length&&(d.animationCache.prevKey=c[0],d.animationCache.nextKey=c[1],this.startTime=Math.min(c[0].time,\nthis.startTime),this.endTime=Math.max(c[c.length-1].time,this.endTime));this.update(0)}this.isPaused=!1;THREE.AnimationHandler.play(this)};THREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=!1;THREE.AnimationHandler.stop(this);for(var a=0;a<this.data.hierarchy.length;a++){var b=this.hierarchy[a],c=this.data.hierarchy[a];if(void 0!==c.animationCache){var d=c.animationCache.originalMatrix;d.copy(b.matrix);b.matrix=d;delete c.animationCache}}};\nTHREE.KeyFrameAnimation.prototype.update=function(a){if(!1!==this.isPlaying){this.currentTime+=a*this.timeScale;a=this.data.length;!0===this.loop&&this.currentTime>a&&(this.currentTime%=a);this.currentTime=Math.min(this.currentTime,a);a=0;for(var b=this.hierarchy.length;a<b;a++){var c=this.hierarchy[a],d=this.data.hierarchy[a],e=d.keys,d=d.animationCache;if(e.length){var f=d.prevKey,g=d.nextKey;if(g.time<=this.currentTime){for(;g.time<this.currentTime&&g.index>f.index;)f=g,g=e[f.index+1];d.prevKey=\nf;d.nextKey=g}g.time>=this.currentTime?f.interpolate(g,this.currentTime):f.interpolate(g,g.time);this.data.hierarchy[a].node.updateMatrix();c.matrixWorldNeedsUpdate=!0}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c%=b.length;c<b.length;c++)if(b[c].hasTarget(a))return b[c];return b[0]};\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(a,b,c){b=this.data.hierarchy[b].keys;for(c=0<=c?c:c+b.length;0<=c;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]};THREE.MorphAnimation=function(a){this.mesh=a;this.frames=a.morphTargetInfluences.length;this.currentTime=0;this.duration=1E3;this.loop=!0;this.isPlaying=!1};\nTHREE.MorphAnimation.prototype={play:function(){this.isPlaying=!0},pause:function(){this.isPlaying=!1},update:function(){var a=0,b=0;return function(c){if(!1!==this.isPlaying){this.currentTime+=c;!0===this.loop&&this.currentTime>this.duration&&(this.currentTime%=this.duration);this.currentTime=Math.min(this.currentTime,this.duration);c=this.duration/this.frames;var d=Math.floor(this.currentTime/c);d!=b&&(this.mesh.morphTargetInfluences[a]=0,this.mesh.morphTargetInfluences[b]=1,this.mesh.morphTargetInfluences[d]=\n0,a=b,b=d);this.mesh.morphTargetInfluences[d]=this.currentTime%c/c;this.mesh.morphTargetInfluences[a]=1-this.mesh.morphTargetInfluences[d]}}}()};\nTHREE.BoxGeometry=function(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,p){var v,w=h.widthSegments,u=h.heightSegments,D=e/2,A=f/2,x=h.vertices.length;if(\"x\"===a&&\"y\"===b||\"y\"===a&&\"x\"===b)v=\"z\";else if(\"x\"===a&&\"z\"===b||\"z\"===a&&\"x\"===b)v=\"y\",u=h.depthSegments;else if(\"z\"===a&&\"y\"===b||\"y\"===a&&\"z\"===b)v=\"x\",w=h.depthSegments;var C=w+1,I=u+1,z=e/w,y=f/u,K=new THREE.Vector3;K[v]=0<g?1:-1;for(e=0;e<I;e++)for(f=0;f<C;f++){var N=new THREE.Vector3;N[a]=(f*z-D)*c;N[b]=(e*y-A)*d;N[v]=g;h.vertices.push(N)}for(e=\n0;e<u;e++)for(f=0;f<w;f++)A=f+C*e,a=f+C*(e+1),b=f+1+C*(e+1),c=f+1+C*e,d=new THREE.Vector2(f/w,1-e/u),g=new THREE.Vector2(f/w,1-(e+1)/u),v=new THREE.Vector2((f+1)/w,1-(e+1)/u),D=new THREE.Vector2((f+1)/w,1-e/u),A=new THREE.Face3(A+x,a+x,c+x),A.normal.copy(K),A.vertexNormals.push(K.clone(),K.clone(),K.clone()),A.materialIndex=p,h.faces.push(A),h.faceVertexUvs[0].push([d,g,D]),A=new THREE.Face3(a+x,b+x,c+x),A.normal.copy(K),A.vertexNormals.push(K.clone(),K.clone(),K.clone()),A.materialIndex=p,h.faces.push(A),\nh.faceVertexUvs[0].push([g.clone(),v,D.clone()])}THREE.Geometry.call(this);this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.widthSegments=d||1;this.heightSegments=e||1;this.depthSegments=f||1;var h=this;d=a/2;e=b/2;f=c/2;g(\"z\",\"y\",-1,-1,c,b,d,0);g(\"z\",\"y\",1,-1,c,b,-d,1);g(\"x\",\"z\",1,1,a,c,e,2);g(\"x\",\"z\",1,-1,a,c,-e,3);g(\"x\",\"y\",1,-1,a,b,f,4);g(\"x\",\"y\",-1,-1,a,b,-f,5);this.mergeVertices()};THREE.BoxGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.CircleGeometry=function(a,b,c,d){THREE.Geometry.call(this);this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||50;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e,f=[];e=new THREE.Vector3;var g=new THREE.Vector2(.5,.5);this.vertices.push(e);f.push(g);for(e=0;e<=b;e++){var h=new THREE.Vector3,k=c+e/b*d;h.x=a*Math.cos(k);h.y=a*Math.sin(k);this.vertices.push(h);f.push(new THREE.Vector2((h.x/a+1)/2,(h.y/a+1)/2))}c=new THREE.Vector3(0,0,1);for(e=1;e<=\nb;e++)this.faces.push(new THREE.Face3(e,e+1,0,[c.clone(),c.clone(),c.clone()])),this.faceVertexUvs[0].push([f[e].clone(),f[e+1].clone(),g.clone()]);this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,a)};THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CubeGeometry=function(a,b,c,d,e,f){console.warn(\"THEE.CubeGeometry has been renamed to THREE.BoxGeometry.\");return new THREE.BoxGeometry(a,b,c,d,e,f)};\nTHREE.CylinderGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f};a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=d||8;e=e||1;f=void 0!==f?f:!1;var g=c/2,h,k,l=[],n=[];for(k=0;k<=e;k++){var q=[],r=[],t=k/e,s=t*(b-a)+a;for(h=0;h<=d;h++){var p=h/d,v=new THREE.Vector3;v.x=s*Math.sin(p*Math.PI*2);v.y=-t*c+g;v.z=s*Math.cos(p*Math.PI*2);this.vertices.push(v);q.push(this.vertices.length-1);r.push(new THREE.Vector2(p,\n1-t))}l.push(q);n.push(r)}c=(b-a)/c;for(h=0;h<d;h++)for(0!==a?(q=this.vertices[l[0][h]].clone(),r=this.vertices[l[0][h+1]].clone()):(q=this.vertices[l[1][h]].clone(),r=this.vertices[l[1][h+1]].clone()),q.setY(Math.sqrt(q.x*q.x+q.z*q.z)*c).normalize(),r.setY(Math.sqrt(r.x*r.x+r.z*r.z)*c).normalize(),k=0;k<e;k++){var t=l[k][h],s=l[k+1][h],p=l[k+1][h+1],v=l[k][h+1],w=q.clone(),u=q.clone(),D=r.clone(),A=r.clone(),x=n[k][h].clone(),C=n[k+1][h].clone(),I=n[k+1][h+1].clone(),z=n[k][h+1].clone();this.faces.push(new THREE.Face3(t,\ns,v,[w,u,A]));this.faceVertexUvs[0].push([x,C,z]);this.faces.push(new THREE.Face3(s,p,v,[u.clone(),D,A.clone()]));this.faceVertexUvs[0].push([C.clone(),I,z.clone()])}if(!1===f&&0<a)for(this.vertices.push(new THREE.Vector3(0,g,0)),h=0;h<d;h++)t=l[0][h],s=l[0][h+1],p=this.vertices.length-1,w=new THREE.Vector3(0,1,0),u=new THREE.Vector3(0,1,0),D=new THREE.Vector3(0,1,0),x=n[0][h].clone(),C=n[0][h+1].clone(),I=new THREE.Vector2(C.x,0),this.faces.push(new THREE.Face3(t,s,p,[w,u,D])),this.faceVertexUvs[0].push([x,\nC,I]);if(!1===f&&0<b)for(this.vertices.push(new THREE.Vector3(0,-g,0)),h=0;h<d;h++)t=l[k][h+1],s=l[k][h],p=this.vertices.length-1,w=new THREE.Vector3(0,-1,0),u=new THREE.Vector3(0,-1,0),D=new THREE.Vector3(0,-1,0),x=n[k][h+1].clone(),C=n[k][h].clone(),I=new THREE.Vector2(C.x,1),this.faces.push(new THREE.Face3(t,s,p,[w,u,D])),this.faceVertexUvs[0].push([x,C,I]);this.computeFaceNormals()};THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.ExtrudeGeometry=function(a,b){\"undefined\"!==typeof a&&(THREE.Geometry.call(this),a=a instanceof Array?a:[a],this.addShapeList(a,b),this.computeFaceNormals())};THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};\nTHREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log(\"die\");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d=THREE.Math.sign,e=1,e=a.x-b.x,f=a.y-b.y,g=c.x-a.x,h=c.y-a.y,k=e*e+f*f;if(1E-10<Math.abs(e*h-f*g)){var l=Math.sqrt(k),d=Math.sqrt(g*g+h*h),k=b.x-f/l;b=b.y+e/l;g=((c.x-h/d-k)*h-(c.y+g/d-b)*g)/(e*h-f*g);c=k+e*g-a.x;a=b+f*g-a.y;e=c*c+a*a;if(2>=e)return new THREE.Vector2(c,a);e=Math.sqrt(e/2)}else a=!1,1E-10<e?1E-10<g&&(a=!0):-1E-10>e?-1E-10>g&&\n(a=!0):d(f)==d(h)&&(a=!0),a?(c=-f,a=e,e=Math.sqrt(k)):(c=e,a=f,e=Math.sqrt(k/2));return new THREE.Vector2(c/e,a/e)}function e(c,d){var e,f;for(H=c.length;0<=--H;){e=H;f=H-1;0>f&&(f=c.length-1);for(var g=0,h=t+2*n,g=0;g<h;g++){var k=S*g,l=S*(g+1),p=d+e+k,k=d+f+k,q=d+f+l,l=d+e+l,r=c,s=g,v=h,w=e,x=f,p=p+ba,k=k+ba,q=q+ba,l=l+ba;N.faces.push(new THREE.Face3(p,k,l,null,null,u));N.faces.push(new THREE.Face3(k,q,l,null,null,u));p=D.generateSideWallUV(N,a,r,b,p,k,q,l,s,v,w,x);N.faceVertexUvs[0].push([p[0],\np[1],p[3]]);N.faceVertexUvs[0].push([p[1],p[2],p[3]])}}}function f(a,b,c){N.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c+=ba;d+=ba;e+=ba;N.faces.push(new THREE.Face3(c,d,e,null,null,w));c=f?D.generateBottomUV(N,a,b,c,d,e):D.generateTopUV(N,a,b,c,d,e);N.faceVertexUvs[0].push(c)}var h=void 0!==b.amount?b.amount:100,k=void 0!==b.bevelThickness?b.bevelThickness:6,l=void 0!==b.bevelSize?b.bevelSize:k-2,n=void 0!==b.bevelSegments?b.bevelSegments:3,q=void 0!==b.bevelEnabled?b.bevelEnabled:\n!0,r=void 0!==b.curveSegments?b.curveSegments:12,t=void 0!==b.steps?b.steps:1,s=b.extrudePath,p,v=!1,w=b.material,u=b.extrudeMaterial,D=void 0!==b.UVGenerator?b.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator,A,x,C,I;s&&(p=s.getSpacedPoints(t),v=!0,q=!1,A=void 0!==b.frames?b.frames:new THREE.TubeGeometry.FrenetFrames(s,t,!1),x=new THREE.Vector3,C=new THREE.Vector3,I=new THREE.Vector3);q||(l=k=n=0);var z,y,K,N=this,ba=this.vertices.length,s=a.extractPoints(r),r=s.shape,P=s.holes;if(s=!THREE.Shape.Utils.isClockWise(r)){r=\nr.reverse();y=0;for(K=P.length;y<K;y++)z=P[y],THREE.Shape.Utils.isClockWise(z)&&(P[y]=z.reverse());s=!1}var O=THREE.Shape.Utils.triangulateShape(r,P),J=r;y=0;for(K=P.length;y<K;y++)z=P[y],r=r.concat(z);var E,Q,L,R,B,S=r.length,V,W=O.length,s=[],H=0;L=J.length;E=L-1;for(Q=H+1;H<L;H++,E++,Q++)E===L&&(E=0),Q===L&&(Q=0),s[H]=d(J[H],J[E],J[Q]);var oa=[],$,X=s.concat();y=0;for(K=P.length;y<K;y++){z=P[y];$=[];H=0;L=z.length;E=L-1;for(Q=H+1;H<L;H++,E++,Q++)E===L&&(E=0),Q===L&&(Q=0),$[H]=d(z[H],z[E],z[Q]);\noa.push($);X=X.concat($)}for(E=0;E<n;E++){L=E/n;R=k*(1-L);Q=l*Math.sin(L*Math.PI/2);H=0;for(L=J.length;H<L;H++)B=c(J[H],s[H],Q),f(B.x,B.y,-R);y=0;for(K=P.length;y<K;y++)for(z=P[y],$=oa[y],H=0,L=z.length;H<L;H++)B=c(z[H],$[H],Q),f(B.x,B.y,-R)}Q=l;for(H=0;H<S;H++)B=q?c(r[H],X[H],Q):r[H],v?(C.copy(A.normals[0]).multiplyScalar(B.x),x.copy(A.binormals[0]).multiplyScalar(B.y),I.copy(p[0]).add(C).add(x),f(I.x,I.y,I.z)):f(B.x,B.y,0);for(L=1;L<=t;L++)for(H=0;H<S;H++)B=q?c(r[H],X[H],Q):r[H],v?(C.copy(A.normals[L]).multiplyScalar(B.x),\nx.copy(A.binormals[L]).multiplyScalar(B.y),I.copy(p[L]).add(C).add(x),f(I.x,I.y,I.z)):f(B.x,B.y,h/t*L);for(E=n-1;0<=E;E--){L=E/n;R=k*(1-L);Q=l*Math.sin(L*Math.PI/2);H=0;for(L=J.length;H<L;H++)B=c(J[H],s[H],Q),f(B.x,B.y,h+R);y=0;for(K=P.length;y<K;y++)for(z=P[y],$=oa[y],H=0,L=z.length;H<L;H++)B=c(z[H],$[H],Q),v?f(B.x,B.y+p[t-1].y,p[t-1].x+R):f(B.x,B.y,h+R)}(function(){if(q){var a;a=0*S;for(H=0;H<W;H++)V=O[H],g(V[2]+a,V[1]+a,V[0]+a,!0);a=t+2*n;a*=S;for(H=0;H<W;H++)V=O[H],g(V[0]+a,V[1]+a,V[2]+a,!1)}else{for(H=\n0;H<W;H++)V=O[H],g(V[2],V[1],V[0],!0);for(H=0;H<W;H++)V=O[H],g(V[0]+S*t,V[1]+S*t,V[2]+S*t,!1)}})();(function(){var a=0;e(J,a);a+=J.length;y=0;for(K=P.length;y<K;y++)z=P[y],e(z,a),a+=z.length})()};\nTHREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.Vector2(a.vertices[d].x,a.vertices[d].y),new THREE.Vector2(b,e),new THREE.Vector2(c,f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h,k,l,n,q){b=a.vertices[e].x;c=a.vertices[e].y;e=a.vertices[e].z;d=a.vertices[f].x;k=a.vertices[f].y;f=a.vertices[f].z;l=a.vertices[g].x;\nn=a.vertices[g].y;g=a.vertices[g].z;q=a.vertices[h].x;var r=a.vertices[h].y;a=a.vertices[h].z;return.01>Math.abs(c-k)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(l,1-g),new THREE.Vector2(q,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(k,1-f),new THREE.Vector2(n,1-g),new THREE.Vector2(r,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;\nTHREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);!1===a instanceof Array&&(a=[a]);this.addShapeList(a,b);this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;c<d;c++)this.addShape(a[c],b);return this};\nTHREE.ShapeGeometry.prototype.addShape=function(a,b){void 0===b&&(b={});var c=b.material,d=void 0===b.UVGenerator?THREE.ExtrudeGeometry.WorldUVGenerator:b.UVGenerator,e,f,g,h=this.vertices.length;e=a.extractPoints(void 0!==b.curveSegments?b.curveSegments:12);var k=e.shape,l=e.holes;if(!THREE.Shape.Utils.isClockWise(k))for(k=k.reverse(),e=0,f=l.length;e<f;e++)g=l[e],THREE.Shape.Utils.isClockWise(g)&&(l[e]=g.reverse());var n=THREE.Shape.Utils.triangulateShape(k,l);e=0;for(f=l.length;e<f;e++)g=l[e],\nk=k.concat(g);l=k.length;f=n.length;for(e=0;e<l;e++)g=k[e],this.vertices.push(new THREE.Vector3(g.x,g.y,0));for(e=0;e<f;e++)l=n[e],k=l[0]+h,g=l[1]+h,l=l[2]+h,this.faces.push(new THREE.Face3(k,g,l,null,null,c)),this.faceVertexUvs[0].push(d.generateBottomUV(this,a,b,k,g,l))};\nTHREE.LatheGeometry=function(a,b,c,d){THREE.Geometry.call(this);b=b||12;c=c||0;d=d||2*Math.PI;for(var e=1/(a.length-1),f=1/b,g=0,h=b;g<=h;g++)for(var k=c+g*f*d,l=Math.cos(k),n=Math.sin(k),k=0,q=a.length;k<q;k++){var r=a[k],t=new THREE.Vector3;t.x=l*r.x-n*r.y;t.y=n*r.x+l*r.y;t.z=r.z;this.vertices.push(t)}c=a.length;g=0;for(h=b;g<h;g++)for(k=0,q=a.length-1;k<q;k++){b=n=k+c*g;d=n+c;var l=n+1+c,n=n+1,r=g*f,t=k*e,s=r+f,p=t+e;this.faces.push(new THREE.Face3(b,d,n));this.faceVertexUvs[0].push([new THREE.Vector2(r,\nt),new THREE.Vector2(s,t),new THREE.Vector2(r,p)]);this.faces.push(new THREE.Face3(d,l,n));this.faceVertexUvs[0].push([new THREE.Vector2(s,t),new THREE.Vector2(s,p),new THREE.Vector2(r,p)])}this.mergeVertices();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=c||1;d=d||1;var g=c+1,h=d+1,k=a/c,l=b/d,n=new THREE.Vector3(0,0,1);for(a=0;a<h;a++){var q=a*l-f;for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*k-e,-q,0))}for(a=0;a<d;a++)for(b=0;b<c;b++){var r=b+g*a,e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,k=new THREE.Vector2(b/c,1-a/d),l=new THREE.Vector2(b/c,1-(a+1)/d),q=new THREE.Vector2((b+1)/c,1-(a+1)/d),t=new THREE.Vector2((b+\n1)/c,1-a/d),r=new THREE.Face3(r,e,h);r.normal.copy(n);r.vertexNormals.push(n.clone(),n.clone(),n.clone());this.faces.push(r);this.faceVertexUvs[0].push([k,l,t]);r=new THREE.Face3(e,f,h);r.normal.copy(n);r.vertexNormals.push(n.clone(),n.clone(),n.clone());this.faces.push(r);this.faceVertexUvs[0].push([l.clone(),q,t.clone()])}};THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.RingGeometry=function(a,b,c,d,e,f){THREE.Geometry.call(this);a=a||0;b=b||50;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):8;var g,h=[],k=a,l=(b-a)/d;for(a=0;a<d+1;a++){for(g=0;g<c+1;g++){var n=new THREE.Vector3,q=e+g/c*f;n.x=k*Math.cos(q);n.y=k*Math.sin(q);this.vertices.push(n);h.push(new THREE.Vector2((n.x/b+1)/2,(n.y/b+1)/2))}k+=l}b=new THREE.Vector3(0,0,1);for(a=0;a<d;a++)for(e=a*(c+1),g=0;g<c;g++)f=q=g+e,l=q+c+1,n=q+c+2,this.faces.push(new THREE.Face3(f,\nl,n,[b.clone(),b.clone(),b.clone()])),this.faceVertexUvs[0].push([h[f].clone(),h[l].clone(),h[n].clone()]),f=q,l=q+c+2,n=q+1,this.faces.push(new THREE.Face3(f,l,n,[b.clone(),b.clone(),b.clone()])),this.faceVertexUvs[0].push([h[f].clone(),h[l].clone(),h[n].clone()]);this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,k)};THREE.RingGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.SphereGeometry=function(a,b,c,d,e,f,g){THREE.Geometry.call(this);this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||50;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h,k,l=[],n=[];for(k=0;k<=c;k++){var q=[],r=[];for(h=0;h<=b;h++){var t=h/b,s=k/c,p=new THREE.Vector3;p.x=-a*Math.cos(d+t*e)*Math.sin(f+s*g);p.y=a*Math.cos(f+s*g);p.z=\na*Math.sin(d+t*e)*Math.sin(f+s*g);this.vertices.push(p);q.push(this.vertices.length-1);r.push(new THREE.Vector2(t,1-s))}l.push(q);n.push(r)}for(k=0;k<c;k++)for(h=0;h<b;h++){d=l[k][h+1];e=l[k][h];f=l[k+1][h];g=l[k+1][h+1];var q=this.vertices[d].clone().normalize(),r=this.vertices[e].clone().normalize(),t=this.vertices[f].clone().normalize(),s=this.vertices[g].clone().normalize(),p=n[k][h+1].clone(),v=n[k][h].clone(),w=n[k+1][h].clone(),u=n[k+1][h+1].clone();Math.abs(this.vertices[d].y)===a?(p.x=(p.x+\nv.x)/2,this.faces.push(new THREE.Face3(d,f,g,[q,t,s])),this.faceVertexUvs[0].push([p,w,u])):Math.abs(this.vertices[f].y)===a?(w.x=(w.x+u.x)/2,this.faces.push(new THREE.Face3(d,e,f,[q,r,t])),this.faceVertexUvs[0].push([p,v,w])):(this.faces.push(new THREE.Face3(d,e,g,[q,r,s])),this.faceVertexUvs[0].push([p,v,u]),this.faces.push(new THREE.Face3(e,f,g,[r.clone(),t,s.clone()])),this.faceVertexUvs[0].push([v.clone(),w,u.clone()]))}this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,\na)};THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TextGeometry=function(a,b){b=b||{};var c=THREE.FontUtils.generateShapes(a,b);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=Object.create(THREE.ExtrudeGeometry.prototype);\nTHREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=b||40;c=c||8;d=d||6;e=e||2*Math.PI;for(var f=new THREE.Vector3,g=[],h=[],k=0;k<=c;k++)for(var l=0;l<=d;l++){var n=l/d*e,q=k/c*Math.PI*2;f.x=a*Math.cos(n);f.y=a*Math.sin(n);var r=new THREE.Vector3;r.x=(a+b*Math.cos(q))*Math.cos(n);r.y=(a+b*Math.cos(q))*Math.sin(n);r.z=b*Math.sin(q);this.vertices.push(r);g.push(new THREE.Vector2(l/d,k/c));h.push(r.clone().sub(f).normalize())}for(k=\n1;k<=c;k++)for(l=1;l<=d;l++)a=(d+1)*k+l-1,b=(d+1)*(k-1)+l-1,e=(d+1)*(k-1)+l,f=(d+1)*k+l,n=new THREE.Face3(a,b,f,[h[a].clone(),h[b].clone(),h[f].clone()]),this.faces.push(n),this.faceVertexUvs[0].push([g[a].clone(),g[b].clone(),g[f].clone()]),n=new THREE.Face3(b,e,f,[h[b].clone(),h[e].clone(),h[f].clone()]),this.faces.push(n),this.faceVertexUvs[0].push([g[b].clone(),g[e].clone(),g[f].clone()]);this.computeFaceNormals()};THREE.TorusGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.TorusKnotGeometry=function(a,b,c,d,e,f,g){function h(a,b,c,d,e){var f=Math.cos(a),g=Math.sin(a);a*=b/c;b=Math.cos(a);f*=d*(2+b)*.5;g=d*(2+b)*g*.5;d=e*d*Math.sin(a)*.5;return new THREE.Vector3(f,g,d)}THREE.Geometry.call(this);this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,p:e,q:f,heightScale:g};a=a||100;b=b||40;c=c||64;d=d||8;e=e||2;f=f||3;g=g||1;for(var k=Array(c),l=new THREE.Vector3,n=new THREE.Vector3,q=new THREE.Vector3,r=0;r<c;++r){k[r]=Array(d);var t=r/c*2*e*Math.PI,\ns=h(t,f,e,a,g),t=h(t+.01,f,e,a,g);l.subVectors(t,s);n.addVectors(t,s);q.crossVectors(l,n);n.crossVectors(q,l);q.normalize();n.normalize();for(t=0;t<d;++t){var p=t/d*2*Math.PI,v=-b*Math.cos(p),p=b*Math.sin(p),w=new THREE.Vector3;w.x=s.x+v*n.x+p*q.x;w.y=s.y+v*n.y+p*q.y;w.z=s.z+v*n.z+p*q.z;k[r][t]=this.vertices.push(w)-1}}for(r=0;r<c;++r)for(t=0;t<d;++t)e=(r+1)%c,f=(t+1)%d,a=k[r][t],b=k[e][t],e=k[e][f],f=k[r][f],g=new THREE.Vector2(r/c,t/d),l=new THREE.Vector2((r+1)/c,t/d),n=new THREE.Vector2((r+1)/\nc,(t+1)/d),q=new THREE.Vector2(r/c,(t+1)/d),this.faces.push(new THREE.Face3(a,b,f)),this.faceVertexUvs[0].push([g,l,q]),this.faces.push(new THREE.Face3(b,e,f)),this.faceVertexUvs[0].push([l.clone(),n,q.clone()]);this.computeFaceNormals();this.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.TubeGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.parameters={path:a,segments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var f=[],g,h,k=b+1,l,n,q,r,t=new THREE.Vector3,s,p,v;s=new THREE.TubeGeometry.FrenetFrames(a,b,e);p=s.normals;v=s.binormals;this.tangents=s.tangents;this.normals=p;this.binormals=v;for(s=0;s<k;s++)for(f[s]=[],l=s/(k-1),r=a.getPointAt(l),g=p[s],h=v[s],l=0;l<d;l++)n=l/d*2*Math.PI,q=-c*Math.cos(n),n=c*Math.sin(n),t.copy(r),t.x+=q*g.x+n*\nh.x,t.y+=q*g.y+n*h.y,t.z+=q*g.z+n*h.z,f[s][l]=this.vertices.push(new THREE.Vector3(t.x,t.y,t.z))-1;for(s=0;s<b;s++)for(l=0;l<d;l++)k=e?(s+1)%b:s+1,t=(l+1)%d,a=f[s][l],c=f[k][l],k=f[k][t],t=f[s][t],p=new THREE.Vector2(s/b,l/d),v=new THREE.Vector2((s+1)/b,l/d),g=new THREE.Vector2((s+1)/b,(l+1)/d),h=new THREE.Vector2(s/b,(l+1)/d),this.faces.push(new THREE.Face3(a,c,t)),this.faceVertexUvs[0].push([p,v,h]),this.faces.push(new THREE.Face3(c,k,t)),this.faceVertexUvs[0].push([v.clone(),g,h.clone()]);this.computeFaceNormals();\nthis.computeVertexNormals()};THREE.TubeGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.TubeGeometry.FrenetFrames=function(a,b,c){new THREE.Vector3;var d=new THREE.Vector3;new THREE.Vector3;var e=[],f=[],g=[],h=new THREE.Vector3,k=new THREE.Matrix4;b+=1;var l,n,q;this.tangents=e;this.normals=f;this.binormals=g;for(l=0;l<b;l++)n=l/(b-1),e[l]=a.getTangentAt(n),e[l].normalize();f[0]=new THREE.Vector3;g[0]=new THREE.Vector3;a=Number.MAX_VALUE;l=Math.abs(e[0].x);n=Math.abs(e[0].y);q=Math.abs(e[0].z);l<=a&&(a=l,d.set(1,0,0));n<=a&&(a=n,d.set(0,1,0));q<=a&&d.set(0,0,1);h.crossVectors(e[0],\nd).normalize();f[0].crossVectors(e[0],h);g[0].crossVectors(e[0],f[0]);for(l=1;l<b;l++)f[l]=f[l-1].clone(),g[l]=g[l-1].clone(),h.crossVectors(e[l-1],e[l]),1E-4<h.length()&&(h.normalize(),d=Math.acos(THREE.Math.clamp(e[l-1].dot(e[l]),-1,1)),f[l].applyMatrix4(k.makeRotationAxis(h,d))),g[l].crossVectors(e[l],f[l]);if(c)for(d=Math.acos(THREE.Math.clamp(f[0].dot(f[b-1]),-1,1)),d/=b-1,0<e[0].dot(h.crossVectors(f[0],f[b-1]))&&(d=-d),l=1;l<b;l++)f[l].applyMatrix4(k.makeRotationAxis(e[l],d*l)),g[l].crossVectors(e[l],\nf[l])};\nTHREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=k.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+.5;a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5;b.uv=new THREE.Vector2(c,1-a);return b}function f(a,b,c){var d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]);k.faces.push(d);v.copy(a).add(b).add(c).divideScalar(3);d=Math.atan2(v.z,-v.x);k.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}function g(a,b){var c=\nMath.pow(2,b);Math.pow(4,b);for(var d=e(k.vertices[a.a]),g=e(k.vertices[a.b]),h=e(k.vertices[a.c]),l=[],n=0;n<=c;n++){l[n]=[];for(var p=e(d.clone().lerp(h,n/c)),q=e(g.clone().lerp(h,n/c)),r=c-n,s=0;s<=r;s++)l[n][s]=0==s&&n==c?p:e(p.clone().lerp(q,s/r))}for(n=0;n<c;n++)for(s=0;s<2*(c-n)-1;s++)d=Math.floor(s/2),0==s%2?f(l[n][d+1],l[n+1][d],l[n][d]):f(l[n][d+1],l[n+1][d+1],l[n+1][d])}function h(a,b,c){0>c&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/2/Math.PI+.5,\na.y));return a.clone()}THREE.Geometry.call(this);c=c||1;d=d||0;for(var k=this,l=0,n=a.length;l<n;l+=3)e(new THREE.Vector3(a[l],a[l+1],a[l+2]));a=this.vertices;for(var q=[],r=l=0,n=b.length;l<n;l+=3,r++){var t=a[b[l]],s=a[b[l+1]],p=a[b[l+2]];q[r]=new THREE.Face3(t.index,s.index,p.index,[t.clone(),s.clone(),p.clone()])}for(var v=new THREE.Vector3,l=0,n=q.length;l<n;l++)g(q[l],d);l=0;for(n=this.faceVertexUvs[0].length;l<n;l++)b=this.faceVertexUvs[0][l],d=b[0].x,a=b[1].x,q=b[2].x,r=Math.max(d,Math.max(a,\nq)),t=Math.min(d,Math.min(a,q)),.9<r&&.1>t&&(.2>d&&(b[0].x+=1),.2>a&&(b[1].x+=1),.2>q&&(b[2].x+=1));l=0;for(n=this.vertices.length;l<n;l++)this.vertices[l].multiplyScalar(c);this.mergeVertices();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,c)};THREE.PolyhedronGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.IcosahedronGeometry=function(a,b){this.parameters={radius:a,detail:b};var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b)};THREE.IcosahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.OctahedronGeometry=function(a,b){this.parameters={radius:a,detail:b};THREE.PolyhedronGeometry.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b)};THREE.OctahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b)};THREE.TetrahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.ParametricGeometry=function(a,b,c){THREE.Geometry.call(this);var d=this.vertices,e=this.faces,f=this.faceVertexUvs[0],g,h,k,l,n=b+1;for(g=0;g<=c;g++)for(l=g/c,h=0;h<=b;h++)k=h/b,k=a(k,l),d.push(k);var q,r,t,s;for(g=0;g<c;g++)for(h=0;h<b;h++)a=g*n+h,d=g*n+h+1,l=(g+1)*n+h+1,k=(g+1)*n+h,q=new THREE.Vector2(h/b,g/c),r=new THREE.Vector2((h+1)/b,g/c),t=new THREE.Vector2((h+1)/b,(g+1)/c),s=new THREE.Vector2(h/b,(g+1)/c),e.push(new THREE.Face3(a,d,k)),f.push([q,r,s]),e.push(new THREE.Face3(d,l,k)),\nf.push([r.clone(),t,s.clone()]);this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=Object.create(THREE.Geometry.prototype);\nTHREE.AxisHelper=function(a){a=a||1;var b=new Float32Array([0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a]),c=new Float32Array([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1]);a=new THREE.BufferGeometry;a.addAttribute(\"position\",new THREE.BufferAttribute(b,3));a.addAttribute(\"color\",new THREE.BufferAttribute(c,3));b=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});THREE.Line.call(this,a,b,THREE.LinePieces)};THREE.AxisHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.ArrowHelper=function(){var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3(0,0,0),new THREE.Vector3(0,1,0));var b=new THREE.CylinderGeometry(0,.5,1,5,1);b.applyMatrix((new THREE.Matrix4).makeTranslation(0,-.5,0));return function(c,d,e,f,g,h){THREE.Object3D.call(this);void 0===f&&(f=16776960);void 0===e&&(e=1);void 0===g&&(g=.2*e);void 0===h&&(h=.2*g);this.position.copy(d);this.line=new THREE.Line(a,new THREE.LineBasicMaterial({color:f}));this.line.matrixAutoUpdate=!1;this.add(this.line);\nthis.cone=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:f}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(c);this.setLength(e,g,h)}}();THREE.ArrowHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.ArrowHelper.prototype.setDirection=function(){var a=new THREE.Vector3,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();\nTHREE.ArrowHelper.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,a,1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};\nTHREE.BoxHelper=function(a){var b=new THREE.BufferGeometry;b.addAttribute(\"position\",new THREE.BufferAttribute(new Float32Array(72),3));THREE.Line.call(this,b,new THREE.LineBasicMaterial({color:16776960}),THREE.LinePieces);void 0!==a&&this.update(a)};THREE.BoxHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.BoxHelper.prototype.update=function(a){var b=a.geometry;null===b.boundingBox&&b.computeBoundingBox();var c=b.boundingBox.min,b=b.boundingBox.max,d=this.geometry.attributes.position.array;d[0]=b.x;d[1]=b.y;d[2]=b.z;d[3]=c.x;d[4]=b.y;d[5]=b.z;d[6]=c.x;d[7]=b.y;d[8]=b.z;d[9]=c.x;d[10]=c.y;d[11]=b.z;d[12]=c.x;d[13]=c.y;d[14]=b.z;d[15]=b.x;d[16]=c.y;d[17]=b.z;d[18]=b.x;d[19]=c.y;d[20]=b.z;d[21]=b.x;d[22]=b.y;d[23]=b.z;d[24]=b.x;d[25]=b.y;d[26]=c.z;d[27]=c.x;d[28]=b.y;d[29]=c.z;d[30]=c.x;d[31]=b.y;\nd[32]=c.z;d[33]=c.x;d[34]=c.y;d[35]=c.z;d[36]=c.x;d[37]=c.y;d[38]=c.z;d[39]=b.x;d[40]=c.y;d[41]=c.z;d[42]=b.x;d[43]=c.y;d[44]=c.z;d[45]=b.x;d[46]=b.y;d[47]=c.z;d[48]=b.x;d[49]=b.y;d[50]=b.z;d[51]=b.x;d[52]=b.y;d[53]=c.z;d[54]=c.x;d[55]=b.y;d[56]=b.z;d[57]=c.x;d[58]=b.y;d[59]=c.z;d[60]=c.x;d[61]=c.y;d[62]=b.z;d[63]=c.x;d[64]=c.y;d[65]=c.z;d[66]=b.x;d[67]=c.y;d[68]=b.z;d[69]=b.x;d[70]=c.y;d[71]=c.z;this.geometry.attributes.position.needsUpdate=!0;this.geometry.computeBoundingSphere();this.matrixAutoUpdate=\n!1;this.matrixWorld=a.matrixWorld};THREE.BoundingBoxHelper=function(a,b){var c=void 0!==b?b:8947848;this.object=a;this.box=new THREE.Box3;THREE.Mesh.call(this,new THREE.BoxGeometry(1,1,1),new THREE.MeshBasicMaterial({color:c,wireframe:!0}))};THREE.BoundingBoxHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object);this.box.size(this.scale);this.box.center(this.position)};\nTHREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.vertices.push(new THREE.Vector3);d.colors.push(new THREE.Color(b));void 0===f[a]&&(f[a]=[]);f[a].push(d.vertices.length-1)}var d=new THREE.Geometry,e=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors}),f={};b(\"n1\",\"n2\",16755200);b(\"n2\",\"n4\",16755200);b(\"n4\",\"n3\",16755200);b(\"n3\",\"n1\",16755200);b(\"f1\",\"f2\",16755200);b(\"f2\",\"f4\",16755200);b(\"f4\",\"f3\",16755200);b(\"f3\",\"f1\",16755200);b(\"n1\",\"f1\",16755200);\nb(\"n2\",\"f2\",16755200);b(\"n3\",\"f3\",16755200);b(\"n4\",\"f4\",16755200);b(\"p\",\"n1\",16711680);b(\"p\",\"n2\",16711680);b(\"p\",\"n3\",16711680);b(\"p\",\"n4\",16711680);b(\"u1\",\"u2\",43775);b(\"u2\",\"u3\",43775);b(\"u3\",\"u1\",43775);b(\"c\",\"t\",16777215);b(\"p\",\"c\",3355443);b(\"cn1\",\"cn2\",3355443);b(\"cn3\",\"cn4\",3355443);b(\"cf1\",\"cf2\",3355443);b(\"cf3\",\"cf4\",3355443);THREE.Line.call(this,d,e,THREE.LinePieces);this.camera=a;this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=f;this.update()};\nTHREE.CameraHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.CameraHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Camera,c=new THREE.Projector;return function(){function d(d,g,h,k){a.set(g,h,k);c.unprojectVector(a,b);d=e.pointMap[d];if(void 0!==d)for(g=0,h=d.length;g<h;g++)e.geometry.vertices[d[g]].copy(a)}var e=this;b.projectionMatrix.copy(this.camera.projectionMatrix);d(\"c\",0,0,-1);d(\"t\",0,0,1);d(\"n1\",-1,-1,-1);d(\"n2\",1,-1,-1);d(\"n3\",-1,1,-1);d(\"n4\",1,1,-1);d(\"f1\",-1,-1,1);d(\"f2\",1,-1,1);d(\"f3\",-1,1,1);d(\"f4\",1,1,1);d(\"u1\",.7,\n1.1,-1);d(\"u2\",-.7,1.1,-1);d(\"u3\",0,2,-1);d(\"cf1\",-1,0,1);d(\"cf2\",1,0,1);d(\"cf3\",0,-1,1);d(\"cf4\",0,1,1);d(\"cn1\",-1,0,-1);d(\"cn2\",1,0,-1);d(\"cn3\",0,-1,-1);d(\"cn4\",0,1,-1);this.geometry.verticesNeedUpdate=!0}}();\nTHREE.DirectionalLightHelper=function(a,b){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;b=b||1;var c=new THREE.Geometry;c.vertices.push(new THREE.Vector3(-b,b,0),new THREE.Vector3(b,b,0),new THREE.Vector3(b,-b,0),new THREE.Vector3(-b,-b,0),new THREE.Vector3(-b,b,0));var d=new THREE.LineBasicMaterial({fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.lightPlane=new THREE.Line(c,d);this.add(this.lightPlane);\nc=new THREE.Geometry;c.vertices.push(new THREE.Vector3,new THREE.Vector3);d=new THREE.LineBasicMaterial({fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine=new THREE.Line(c,d);this.add(this.targetLine);this.update()};THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};\nTHREE.DirectionalLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);this.lightPlane.lookAt(c);this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine.geometry.vertices[1].copy(c);this.targetLine.geometry.verticesNeedUpdate=!0;this.targetLine.material.color.copy(this.lightPlane.material.color)}}();\nTHREE.EdgesHelper=function(a,b){var c=void 0!==b?b:16777215,d=[0,0],e={},f=function(a,b){return a-b},g=[\"a\",\"b\",\"c\"],h=new THREE.BufferGeometry,k=a.geometry.clone();k.mergeVertices();k.computeFaceNormals();for(var l=k.vertices,k=k.faces,n=0,q=0,r=k.length;q<r;q++)for(var t=k[q],s=0;3>s;s++){d[0]=t[g[s]];d[1]=t[g[(s+1)%3]];d.sort(f);var p=d.toString();void 0===e[p]?(e[p]={vert1:d[0],vert2:d[1],face1:q,face2:void 0},n++):e[p].face2=q}h.addAttribute(\"position\",new THREE.Float32Attribute(6*n,3));d=h.attributes.position.array;\nf=0;for(p in e)if(g=e[p],void 0===g.face2||.9999>k[g.face1].normal.dot(k[g.face2].normal))n=l[g.vert1],d[f++]=n.x,d[f++]=n.y,d[f++]=n.z,n=l[g.vert2],d[f++]=n.x,d[f++]=n.y,d[f++]=n.z;THREE.Line.call(this,h,new THREE.LineBasicMaterial({color:c}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld};THREE.EdgesHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.FaceNormalsHelper=function(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=new THREE.Geometry;c=0;for(var e=this.object.geometry.faces.length;c<e;c++)b.vertices.push(new THREE.Vector3,new THREE.Vector3);THREE.Line.call(this,b,new THREE.LineBasicMaterial({color:a,linewidth:d}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.normalMatrix=new THREE.Matrix3;this.update()};THREE.FaceNormalsHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.FaceNormalsHelper.prototype.update=function(){var a=this.geometry.vertices,b=this.object,c=b.geometry.vertices,d=b.geometry.faces,e=b.matrixWorld;b.updateMatrixWorld(!0);this.normalMatrix.getNormalMatrix(e);for(var f=b=0,g=d.length;b<g;b++,f+=2){var h=d[b];a[f].copy(c[h.a]).add(c[h.b]).add(c[h.c]).divideScalar(3).applyMatrix4(e);a[f+1].copy(h.normal).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size).add(a[f])}this.geometry.verticesNeedUpdate=!0;return this};\nTHREE.GridHelper=function(a,b){var c=new THREE.Geometry,d=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});this.color1=new THREE.Color(4473924);this.color2=new THREE.Color(8947848);for(var e=-a;e<=a;e+=b){c.vertices.push(new THREE.Vector3(-a,0,e),new THREE.Vector3(a,0,e),new THREE.Vector3(e,0,-a),new THREE.Vector3(e,0,a));var f=0===e?this.color1:this.color2;c.colors.push(f,f,f,f)}THREE.Line.call(this,c,d,THREE.LinePieces)};THREE.GridHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.GridHelper.prototype.setColors=function(a,b){this.color1.set(a);this.color2.set(b);this.geometry.colorsNeedUpdate=!0};\nTHREE.HemisphereLightHelper=function(a,b,c,d){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;this.colors=[new THREE.Color,new THREE.Color];a=new THREE.SphereGeometry(b,4,2);a.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI/2));for(b=0;8>b;b++)a.faces[b].color=this.colors[4>b?0:1];b=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(a,b);this.add(this.lightSphere);\nthis.update()};THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.HemisphereLightHelper.prototype.dispose=function(){this.lightSphere.geometry.dispose();this.lightSphere.material.dispose()};\nTHREE.HemisphereLightHelper.prototype.update=function(){var a=new THREE.Vector3;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);this.lightSphere.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());this.lightSphere.geometry.colorsNeedUpdate=!0}}();\nTHREE.PointLightHelper=function(a,b){this.light=a;this.light.updateMatrixWorld();var c=new THREE.SphereGeometry(b,4,2),d=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);THREE.Mesh.call(this,c,d);this.matrixWorld=this.light.matrixWorld;this.matrixAutoUpdate=!1};THREE.PointLightHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.PointLightHelper.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};\nTHREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)};\nTHREE.SkeletonHelper=function(a){this.bones=this.getBoneList(a);for(var b=new THREE.Geometry,c=0;c<this.bones.length;c++)this.bones[c].parent instanceof THREE.Bone&&(b.vertices.push(new THREE.Vector3),b.vertices.push(new THREE.Vector3),b.colors.push(new THREE.Color(0,0,1)),b.colors.push(new THREE.Color(0,1,0)));c=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors,depthTest:!1,depthWrite:!1,transparent:!0});THREE.Line.call(this,b,c,THREE.LinePieces);this.root=a;this.matrixWorld=a.matrixWorld;\nthis.matrixAutoUpdate=!1;this.update()};THREE.SkeletonHelper.prototype=Object.create(THREE.Line.prototype);THREE.SkeletonHelper.prototype.getBoneList=function(a){var b=[];a instanceof THREE.Bone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,this.getBoneList(a.children[c]));return b};\nTHREE.SkeletonHelper.prototype.update=function(){for(var a=this.geometry,b=(new THREE.Matrix4).getInverse(this.root.matrixWorld),c=new THREE.Matrix4,d=0,e=0;e<this.bones.length;e++){var f=this.bones[e];f.parent instanceof THREE.Bone&&(c.multiplyMatrices(b,f.matrixWorld),a.vertices[d].setFromMatrixPosition(c),c.multiplyMatrices(b,f.parent.matrixWorld),a.vertices[d+1].setFromMatrixPosition(c),d+=2)}a.verticesNeedUpdate=!0;a.computeBoundingSphere()};\nTHREE.SpotLightHelper=function(a){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;a=new THREE.CylinderGeometry(0,1,1,8,1,!0);a.applyMatrix((new THREE.Matrix4).makeTranslation(0,-.5,0));a.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI/2));var b=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});this.cone=new THREE.Mesh(a,b);this.add(this.cone);this.update()};THREE.SpotLightHelper.prototype=Object.create(THREE.Object3D.prototype);\nTHREE.SpotLightHelper.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};THREE.SpotLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){var c=this.light.distance?this.light.distance:1E4,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}}();\nTHREE.VertexNormalsHelper=function(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;b=void 0!==c?c:16711680;d=void 0!==d?d:1;c=new THREE.Geometry;a=a.geometry.faces;for(var e=0,f=a.length;e<f;e++)for(var g=0,h=a[e].vertexNormals.length;g<h;g++)c.vertices.push(new THREE.Vector3,new THREE.Vector3);THREE.Line.call(this,c,new THREE.LineBasicMaterial({color:b,linewidth:d}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.normalMatrix=new THREE.Matrix3;this.update()};THREE.VertexNormalsHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.VertexNormalsHelper.prototype.update=function(a){var b=new THREE.Vector3;return function(a){a=[\"a\",\"b\",\"c\",\"d\"];this.object.updateMatrixWorld(!0);this.normalMatrix.getNormalMatrix(this.object.matrixWorld);for(var d=this.geometry.vertices,e=this.object.geometry.vertices,f=this.object.geometry.faces,g=this.object.matrixWorld,h=0,k=0,l=f.length;k<l;k++)for(var n=f[k],q=0,r=n.vertexNormals.length;q<r;q++){var t=n.vertexNormals[q];d[h].copy(e[n[a[q]]]).applyMatrix4(g);b.copy(t).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size);\nb.add(d[h]);h+=1;d[h].copy(b);h+=1}this.geometry.verticesNeedUpdate=!0;return this}}();\nTHREE.VertexTangentsHelper=function(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;b=void 0!==c?c:255;d=void 0!==d?d:1;c=new THREE.Geometry;a=a.geometry.faces;for(var e=0,f=a.length;e<f;e++)for(var g=0,h=a[e].vertexTangents.length;g<h;g++)c.vertices.push(new THREE.Vector3),c.vertices.push(new THREE.Vector3);THREE.Line.call(this,c,new THREE.LineBasicMaterial({color:b,linewidth:d}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.update()};THREE.VertexTangentsHelper.prototype=Object.create(THREE.Line.prototype);\nTHREE.VertexTangentsHelper.prototype.update=function(a){var b=new THREE.Vector3;return function(a){a=[\"a\",\"b\",\"c\",\"d\"];this.object.updateMatrixWorld(!0);for(var d=this.geometry.vertices,e=this.object.geometry.vertices,f=this.object.geometry.faces,g=this.object.matrixWorld,h=0,k=0,l=f.length;k<l;k++)for(var n=f[k],q=0,r=n.vertexTangents.length;q<r;q++){var t=n.vertexTangents[q];d[h].copy(e[n[a[q]]]).applyMatrix4(g);b.copy(t).transformDirection(g).multiplyScalar(this.size);b.add(d[h]);h+=1;d[h].copy(b);\nh+=1}this.geometry.verticesNeedUpdate=!0;return this}}();\nTHREE.WireframeHelper=function(a,b){var c=void 0!==b?b:16777215,d=[0,0],e={},f=function(a,b){return a-b},g=[\"a\",\"b\",\"c\"],h=new THREE.BufferGeometry;if(a.geometry instanceof THREE.Geometry){for(var k=a.geometry.vertices,l=a.geometry.faces,n=0,q=new Uint32Array(6*l.length),r=0,t=l.length;r<t;r++)for(var s=l[r],p=0;3>p;p++){d[0]=s[g[p]];d[1]=s[g[(p+1)%3]];d.sort(f);var v=d.toString();void 0===e[v]&&(q[2*n]=d[0],q[2*n+1]=d[1],e[v]=!0,n++)}d=new Float32Array(6*n);r=0;for(t=n;r<t;r++)for(p=0;2>p;p++)n=\nk[q[2*r+p]],g=6*r+3*p,d[g+0]=n.x,d[g+1]=n.y,d[g+2]=n.z;h.addAttribute(\"position\",new THREE.BufferAttribute(d,3))}else if(a.geometry instanceof THREE.BufferGeometry){if(void 0!==a.geometry.attributes.index){for(var k=a.geometry.attributes.position.array,t=a.geometry.attributes.index.array,l=a.geometry.offsets,n=0,q=new Uint32Array(2*t.length),s=0,w=l.length;s<w;++s)for(var p=l[s].start,v=l[s].count,g=l[s].index,r=p,u=p+v;r<u;r+=3)for(p=0;3>p;p++)d[0]=g+t[r+p],d[1]=g+t[r+(p+1)%3],d.sort(f),v=d.toString(),\nvoid 0===e[v]&&(q[2*n]=d[0],q[2*n+1]=d[1],e[v]=!0,n++);d=new Float32Array(6*n);r=0;for(t=n;r<t;r++)for(p=0;2>p;p++)g=6*r+3*p,n=3*q[2*r+p],d[g+0]=k[n],d[g+1]=k[n+1],d[g+2]=k[n+2]}else for(k=a.geometry.attributes.position.array,n=k.length/3,q=n/3,d=new Float32Array(6*n),r=0,t=q;r<t;r++)for(p=0;3>p;p++)g=18*r+6*p,q=9*r+3*p,d[g+0]=k[q],d[g+1]=k[q+1],d[g+2]=k[q+2],n=9*r+(p+1)%3*3,d[g+3]=k[n],d[g+4]=k[n+1],d[g+5]=k[n+2];h.addAttribute(\"position\",new THREE.BufferAttribute(d,3))}THREE.Line.call(this,h,new THREE.LineBasicMaterial({color:c}),\nTHREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld};THREE.WireframeHelper.prototype=Object.create(THREE.Line.prototype);THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(a){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)};\nTHREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare.prototype.add=function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new THREE.Color(16777215));void 0===d&&(d=THREE.NormalBlending);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})};\nTHREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;a<b;a++)c=this.lensFlares[a],c.x=this.positionScreen.x+d*c.distance,c.y=this.positionScreen.y+e*c.distance,c.wantedRotation=c.x*Math.PI*.25,c.rotation+=.25*(c.wantedRotation-c.rotation)};\nTHREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=Object.create(THREE.Mesh.prototype);\nTHREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={startFrame:b,endFrame:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\\d+)/,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&1<h.length){var k=h[1];d[k]||(d[k]={start:Infinity,end:-Infinity});h=d[k];f<h.start&&(h.start=f);f>h.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};\nTHREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};\nTHREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn(\"animation[\"+a+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};\nTHREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time+=d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;\nf!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};\nTHREE.LensFlarePlugin=function(){function a(a,b){var d=c.createProgram(),e=c.createShader(c.FRAGMENT_SHADER),f=c.createShader(c.VERTEX_SHADER),g=\"precision \"+b+\" float;\\n\";c.shaderSource(e,g+a.fragmentShader);c.shaderSource(f,g+a.vertexShader);c.compileShader(e);c.compileShader(f);c.attachShader(d,e);c.attachShader(d,f);c.linkProgram(d);return d}var b=[],c,d,e,f,g,h,k,l,n,q,r,t,s;this.init=function(b){c=b.context;d=b;e=b.getPrecision();f=new Float32Array(16);g=new Uint16Array(6);b=0;f[b++]=-1;f[b++]=\n-1;f[b++]=0;f[b++]=0;f[b++]=1;f[b++]=-1;f[b++]=1;f[b++]=0;f[b++]=1;f[b++]=1;f[b++]=1;f[b++]=1;f[b++]=-1;f[b++]=1;f[b++]=0;f[b++]=1;b=0;g[b++]=0;g[b++]=1;g[b++]=2;g[b++]=0;g[b++]=2;g[b++]=3;h=c.createBuffer();k=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,h);c.bufferData(c.ARRAY_BUFFER,f,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,k);c.bufferData(c.ELEMENT_ARRAY_BUFFER,g,c.STATIC_DRAW);l=c.createTexture();n=c.createTexture();c.bindTexture(c.TEXTURE_2D,l);c.texImage2D(c.TEXTURE_2D,0,c.RGB,16,\n16,0,c.RGB,c.UNSIGNED_BYTE,null);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST);c.bindTexture(c.TEXTURE_2D,n);c.texImage2D(c.TEXTURE_2D,0,c.RGBA,16,16,0,c.RGBA,c.UNSIGNED_BYTE,null);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);\nc.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST);0>=c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(q=!1,r=a(THREE.ShaderFlares.lensFlare,e)):(q=!0,r=a(THREE.ShaderFlares.lensFlareVertexTexture,e));t={};s={};t.vertex=c.getAttribLocation(r,\"position\");t.uv=c.getAttribLocation(r,\"uv\");s.renderType=c.getUniformLocation(r,\"renderType\");s.map=c.getUniformLocation(r,\"map\");s.occlusionMap=c.getUniformLocation(r,\"occlusionMap\");s.opacity=\nc.getUniformLocation(r,\"opacity\");s.color=c.getUniformLocation(r,\"color\");s.scale=c.getUniformLocation(r,\"scale\");s.rotation=c.getUniformLocation(r,\"rotation\");s.screenPosition=c.getUniformLocation(r,\"screenPosition\")};this.render=function(a,e,f,g){b.length=0;a.traverseVisible(function(a){a instanceof THREE.LensFlare&&b.push(a)});if(0!==b.length){a=new THREE.Vector3;var D=g/f,A=.5*f,x=.5*g,C=16/g,I=new THREE.Vector2(C*D,C),z=new THREE.Vector3(1,1,0),y=new THREE.Vector2(1,1),K=s,C=t;c.useProgram(r);\nc.enableVertexAttribArray(t.vertex);c.enableVertexAttribArray(t.uv);c.uniform1i(K.occlusionMap,0);c.uniform1i(K.map,1);c.bindBuffer(c.ARRAY_BUFFER,h);c.vertexAttribPointer(C.vertex,2,c.FLOAT,!1,16,0);c.vertexAttribPointer(C.uv,2,c.FLOAT,!1,16,8);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,k);c.disable(c.CULL_FACE);c.depthMask(!1);for(var N=0,ba=b.length;N<ba;N++){C=16/g;I.set(C*D,C);var P=b[N];a.set(P.matrixWorld.elements[12],P.matrixWorld.elements[13],P.matrixWorld.elements[14]);a.applyMatrix4(e.matrixWorldInverse);\na.applyProjection(e.projectionMatrix);z.copy(a);y.x=z.x*A+A;y.y=z.y*x+x;if(q||0<y.x&&y.x<f&&0<y.y&&y.y<g){c.activeTexture(c.TEXTURE1);c.bindTexture(c.TEXTURE_2D,l);c.copyTexImage2D(c.TEXTURE_2D,0,c.RGB,y.x-8,y.y-8,16,16,0);c.uniform1i(K.renderType,0);c.uniform2f(K.scale,I.x,I.y);c.uniform3f(K.screenPosition,z.x,z.y,z.z);c.disable(c.BLEND);c.enable(c.DEPTH_TEST);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);c.activeTexture(c.TEXTURE0);c.bindTexture(c.TEXTURE_2D,n);c.copyTexImage2D(c.TEXTURE_2D,\n0,c.RGBA,y.x-8,y.y-8,16,16,0);c.uniform1i(K.renderType,1);c.disable(c.DEPTH_TEST);c.activeTexture(c.TEXTURE1);c.bindTexture(c.TEXTURE_2D,l);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);P.positionScreen.copy(z);P.customUpdateCallback?P.customUpdateCallback(P):P.updateLensFlares();c.uniform1i(K.renderType,2);c.enable(c.BLEND);for(var O=0,J=P.lensFlares.length;O<J;O++){var E=P.lensFlares[O];.001<E.opacity&&.001<E.scale&&(z.x=E.x,z.y=E.y,z.z=E.z,C=E.size*E.scale/g,I.x=C*D,I.y=C,c.uniform3f(K.screenPosition,\nz.x,z.y,z.z),c.uniform2f(K.scale,I.x,I.y),c.uniform1f(K.rotation,E.rotation),c.uniform1f(K.opacity,E.opacity),c.uniform3f(K.color,E.color.r,E.color.g,E.color.b),d.setBlending(E.blending,E.blendEquation,E.blendSrc,E.blendDst),d.setTexture(E.texture,1),c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0))}}}c.enable(c.CULL_FACE);c.enable(c.DEPTH_TEST);c.depthMask(!0)}}};\nTHREE.ShadowMapPlugin=function(){function a(b,c,d){if(c.visible){var e=b.__webglObjects[c.id];if(e&&c.castShadow&&(!1===c.frustumCulled||!0===h.intersectsObject(c)))for(var f=0,g=e.length;f<g;f++){var k=e[f];c._modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,c.matrixWorld);r.push(k)}f=0;for(g=c.children.length;f<g;f++)a(b,c.children[f],d)}}var b,c,d,e,f,g,h=new THREE.Frustum,k=new THREE.Matrix4,l=new THREE.Vector3,n=new THREE.Vector3,q=new THREE.Vector3,r=[];this.init=function(a){b=a.context;\nc=a;a=THREE.ShaderLib.depthRGBA;var h=THREE.UniformsUtils.clone(a.uniforms);d=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h});e=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h,morphTargets:!0});f=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h,skinning:!0});g=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h,\nmorphTargets:!0,skinning:!0});d._shadowPass=!0;e._shadowPass=!0;f._shadowPass=!0;g._shadowPass=!0};this.render=function(a,b){c.shadowMapEnabled&&c.shadowMapAutoUpdate&&this.update(a,b)};this.update=function(t,s){var p,v,w,u,D,A,x,C,I=[];u=0;b.clearColor(1,1,1,1);b.disable(b.BLEND);b.enable(b.CULL_FACE);b.frontFace(b.CCW);c.shadowMapCullFace===THREE.CullFaceFront?b.cullFace(b.FRONT):b.cullFace(b.BACK);c.setDepthTest(!0);p=0;for(v=t.__lights.length;p<v;p++)if(w=t.__lights[p],w.castShadow)if(w instanceof\nTHREE.DirectionalLight&&w.shadowCascade)for(D=0;D<w.shadowCascadeCount;D++){var z;if(w.shadowCascadeArray[D])z=w.shadowCascadeArray[D];else{x=w;var y=D;z=new THREE.DirectionalLight;z.isVirtual=!0;z.onlyShadow=!0;z.castShadow=!0;z.shadowCameraNear=x.shadowCameraNear;z.shadowCameraFar=x.shadowCameraFar;z.shadowCameraLeft=x.shadowCameraLeft;z.shadowCameraRight=x.shadowCameraRight;z.shadowCameraBottom=x.shadowCameraBottom;z.shadowCameraTop=x.shadowCameraTop;z.shadowCameraVisible=x.shadowCameraVisible;\nz.shadowDarkness=x.shadowDarkness;z.shadowBias=x.shadowCascadeBias[y];z.shadowMapWidth=x.shadowCascadeWidth[y];z.shadowMapHeight=x.shadowCascadeHeight[y];z.pointsWorld=[];z.pointsFrustum=[];C=z.pointsWorld;A=z.pointsFrustum;for(var K=0;8>K;K++)C[K]=new THREE.Vector3,A[K]=new THREE.Vector3;C=x.shadowCascadeNearZ[y];x=x.shadowCascadeFarZ[y];A[0].set(-1,-1,C);A[1].set(1,-1,C);A[2].set(-1,1,C);A[3].set(1,1,C);A[4].set(-1,-1,x);A[5].set(1,-1,x);A[6].set(-1,1,x);A[7].set(1,1,x);z.originalCamera=s;A=new THREE.Gyroscope;\nA.position.copy(w.shadowCascadeOffset);A.add(z);A.add(z.target);s.add(A);w.shadowCascadeArray[D]=z;console.log(\"Created virtualLight\",z)}y=w;C=D;x=y.shadowCascadeArray[C];x.position.copy(y.position);x.target.position.copy(y.target.position);x.lookAt(x.target);x.shadowCameraVisible=y.shadowCameraVisible;x.shadowDarkness=y.shadowDarkness;x.shadowBias=y.shadowCascadeBias[C];A=y.shadowCascadeNearZ[C];y=y.shadowCascadeFarZ[C];x=x.pointsFrustum;x[0].z=A;x[1].z=A;x[2].z=A;x[3].z=A;x[4].z=y;x[5].z=y;x[6].z=\ny;x[7].z=y;I[u]=z;u++}else I[u]=w,u++;p=0;for(v=I.length;p<v;p++){w=I[p];w.shadowMap||(D=THREE.LinearFilter,c.shadowMapType===THREE.PCFSoftShadowMap&&(D=THREE.NearestFilter),w.shadowMap=new THREE.WebGLRenderTarget(w.shadowMapWidth,w.shadowMapHeight,{minFilter:D,magFilter:D,format:THREE.RGBAFormat}),w.shadowMapSize=new THREE.Vector2(w.shadowMapWidth,w.shadowMapHeight),w.shadowMatrix=new THREE.Matrix4);if(!w.shadowCamera){if(w instanceof THREE.SpotLight)w.shadowCamera=new THREE.PerspectiveCamera(w.shadowCameraFov,\nw.shadowMapWidth/w.shadowMapHeight,w.shadowCameraNear,w.shadowCameraFar);else if(w instanceof THREE.DirectionalLight)w.shadowCamera=new THREE.OrthographicCamera(w.shadowCameraLeft,w.shadowCameraRight,w.shadowCameraTop,w.shadowCameraBottom,w.shadowCameraNear,w.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}t.add(w.shadowCamera);!0===t.autoUpdate&&t.updateMatrixWorld()}w.shadowCameraVisible&&!w.cameraHelper&&(w.cameraHelper=new THREE.CameraHelper(w.shadowCamera),w.shadowCamera.add(w.cameraHelper));\nif(w.isVirtual&&z.originalCamera==s){D=s;u=w.shadowCamera;A=w.pointsFrustum;x=w.pointsWorld;l.set(Infinity,Infinity,Infinity);n.set(-Infinity,-Infinity,-Infinity);for(y=0;8>y;y++)C=x[y],C.copy(A[y]),THREE.ShadowMapPlugin.__projector.unprojectVector(C,D),C.applyMatrix4(u.matrixWorldInverse),C.x<l.x&&(l.x=C.x),C.x>n.x&&(n.x=C.x),C.y<l.y&&(l.y=C.y),C.y>n.y&&(n.y=C.y),C.z<l.z&&(l.z=C.z),C.z>n.z&&(n.z=C.z);u.left=l.x;u.right=n.x;u.top=n.y;u.bottom=l.y;u.updateProjectionMatrix()}u=w.shadowMap;A=w.shadowMatrix;\nD=w.shadowCamera;D.position.setFromMatrixPosition(w.matrixWorld);q.setFromMatrixPosition(w.target.matrixWorld);D.lookAt(q);D.updateMatrixWorld();D.matrixWorldInverse.getInverse(D.matrixWorld);w.cameraHelper&&(w.cameraHelper.visible=w.shadowCameraVisible);w.shadowCameraVisible&&w.cameraHelper.update();A.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);A.multiply(D.projectionMatrix);A.multiply(D.matrixWorldInverse);k.multiplyMatrices(D.projectionMatrix,D.matrixWorldInverse);h.setFromMatrix(k);c.setRenderTarget(u);\nc.clear();r.length=0;a(t,t,D);w=0;for(u=r.length;w<u;w++)x=r[w],A=x.object,x=x.buffer,y=A.material instanceof THREE.MeshFaceMaterial?A.material.materials[0]:A.material,C=void 0!==A.geometry.morphTargets&&0<A.geometry.morphTargets.length&&y.morphTargets,K=A instanceof THREE.SkinnedMesh&&y.skinning,C=A.customDepthMaterial?A.customDepthMaterial:K?C?g:f:C?e:d,c.setMaterialFaces(y),x instanceof THREE.BufferGeometry?c.renderBufferDirect(D,t.__lights,null,C,x,A):c.renderBuffer(D,t.__lights,null,C,x,A);y=\nt.__webglObjectsImmediate;w=0;for(u=y.length;w<u;w++)x=y[w],A=x.object,A.visible&&A.castShadow&&(A._modelViewMatrix.multiplyMatrices(D.matrixWorldInverse,A.matrixWorld),c.renderImmediateObject(D,t.__lights,null,d,A))}p=c.getClearColor();v=c.getClearAlpha();b.clearColor(p.r,p.g,p.b,v);b.enable(b.BLEND);c.shadowMapCullFace===THREE.CullFaceFront&&b.cullFace(b.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;\nTHREE.SpritePlugin=function(){var a,b,c,d,e,f,g,h,k,l,n,q,r,t,s,p,v;function w(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}var u,D,A,x=[],C,I,z,y,K;this.init=function(w){u=w.context;D=w;C=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]);I=new Uint16Array([0,1,2,0,2,3]);z=u.createBuffer();y=u.createBuffer();u.bindBuffer(u.ARRAY_BUFFER,z);u.bufferData(u.ARRAY_BUFFER,C,u.STATIC_DRAW);u.bindBuffer(u.ELEMENT_ARRAY_BUFFER,y);u.bufferData(u.ELEMENT_ARRAY_BUFFER,I,u.STATIC_DRAW);w=u.createProgram();\nvar x=u.createShader(u.VERTEX_SHADER),P=u.createShader(u.FRAGMENT_SHADER);u.shaderSource(x,[\"precision \"+D.getPrecision()+\" float;\",\"uniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position * scale;\\nvec2 rotatedPosition;\\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\nvec4 finalPosition;\\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition;\\nfinalPosition = projectionMatrix * finalPosition;\\ngl_Position = finalPosition;\\n}\"].join(\"\\n\"));\nu.shaderSource(P,[\"precision \"+D.getPrecision()+\" float;\",\"uniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int fogType;\\nuniform vec3 fogColor;\\nuniform float fogDensity;\\nuniform float fogNear;\\nuniform float fogFar;\\nuniform float alphaTest;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\nif ( texture.a < alphaTest ) discard;\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\nif ( fogType > 0 ) {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat fogFactor = 0.0;\\nif ( fogType == 1 ) {\\nfogFactor = smoothstep( fogNear, fogFar, depth );\\n} else {\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n}\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n}\\n}\"].join(\"\\n\"));\nu.compileShader(x);u.compileShader(P);u.attachShader(w,x);u.attachShader(w,P);u.linkProgram(w);K=w;p=u.getAttribLocation(K,\"position\");v=u.getAttribLocation(K,\"uv\");a=u.getUniformLocation(K,\"uvOffset\");b=u.getUniformLocation(K,\"uvScale\");c=u.getUniformLocation(K,\"rotation\");d=u.getUniformLocation(K,\"scale\");e=u.getUniformLocation(K,\"color\");f=u.getUniformLocation(K,\"map\");g=u.getUniformLocation(K,\"opacity\");h=u.getUniformLocation(K,\"modelViewMatrix\");k=u.getUniformLocation(K,\"projectionMatrix\");l=\nu.getUniformLocation(K,\"fogType\");n=u.getUniformLocation(K,\"fogDensity\");q=u.getUniformLocation(K,\"fogNear\");r=u.getUniformLocation(K,\"fogFar\");t=u.getUniformLocation(K,\"fogColor\");s=u.getUniformLocation(K,\"alphaTest\");w=document.createElement(\"canvas\");w.width=8;w.height=8;x=w.getContext(\"2d\");x.fillStyle=\"white\";x.fillRect(0,0,8,8);A=new THREE.Texture(w);A.needsUpdate=!0};this.render=function(C,I,P,O){x.length=0;C.traverseVisible(function(a){a instanceof THREE.Sprite&&x.push(a)});if(0!==x.length){u.useProgram(K);\nu.enableVertexAttribArray(p);u.enableVertexAttribArray(v);u.disable(u.CULL_FACE);u.enable(u.BLEND);u.bindBuffer(u.ARRAY_BUFFER,z);u.vertexAttribPointer(p,2,u.FLOAT,!1,16,0);u.vertexAttribPointer(v,2,u.FLOAT,!1,16,8);u.bindBuffer(u.ELEMENT_ARRAY_BUFFER,y);u.uniformMatrix4fv(k,!1,I.projectionMatrix.elements);u.activeTexture(u.TEXTURE0);u.uniform1i(f,0);O=P=0;var J=C.fog;J?(u.uniform3f(t,J.color.r,J.color.g,J.color.b),J instanceof THREE.Fog?(u.uniform1f(q,J.near),u.uniform1f(r,J.far),u.uniform1i(l,1),\nO=P=1):J instanceof THREE.FogExp2&&(u.uniform1f(n,J.density),u.uniform1i(l,2),O=P=2)):(u.uniform1i(l,0),O=P=0);for(var J=0,E=x.length;J<E;J++){var Q=x[J],L=Q.material;Q._modelViewMatrix.multiplyMatrices(I.matrixWorldInverse,Q.matrixWorld);Q.z=-Q._modelViewMatrix.elements[14]}x.sort(w);I=[];J=0;for(E=x.length;J<E;J++)Q=x[J],L=Q.material,u.uniform1f(s,L.alphaTest),u.uniformMatrix4fv(h,!1,Q._modelViewMatrix.elements),I[0]=Q.scale.x,I[1]=Q.scale.y,Q=0,C.fog&&L.fog&&(Q=O),P!==Q&&(u.uniform1i(l,Q),P=Q),\nnull!==L.map?(u.uniform2f(a,L.map.offset.x,L.map.offset.y),u.uniform2f(b,L.map.repeat.x,L.map.repeat.y)):(u.uniform2f(a,0,0),u.uniform2f(b,1,1)),u.uniform1f(g,L.opacity),u.uniform3f(e,L.color.r,L.color.g,L.color.b),u.uniform1f(c,L.rotation),u.uniform2fv(d,I),D.setBlending(L.blending,L.blendEquation,L.blendSrc,L.blendDst),D.setDepthTest(L.depthTest),D.setDepthWrite(L.depthWrite),L.map&&L.map.image&&L.map.image.width?D.setTexture(L.map,0):D.setTexture(A,0),u.drawElements(u.TRIANGLES,6,u.UNSIGNED_SHORT,\n0);u.enable(u.CULL_FACE)}}};\nTHREE.DepthPassPlugin=function(){function a(b,c,d){if(c.visible){var e=b.__webglObjects[c.id];if(e&&(!1===c.frustumCulled||!0===h.intersectsObject(c)))for(var f=0,g=e.length;f<g;f++){var k=e[f];c._modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,c.matrixWorld);l.push(k)}f=0;for(g=c.children.length;f<g;f++)a(b,c.children[f],d)}}this.enabled=!1;this.renderTarget=null;var b,c,d,e,f,g,h=new THREE.Frustum,k=new THREE.Matrix4,l=[];this.init=function(a){b=a.context;c=a;a=THREE.ShaderLib.depthRGBA;var h=\nTHREE.UniformsUtils.clone(a.uniforms);d=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h});e=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h,morphTargets:!0});f=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h,skinning:!0});g=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:h,morphTargets:!0,skinning:!0});d._shadowPass=\n!0;e._shadowPass=!0;f._shadowPass=!0;g._shadowPass=!0};this.render=function(a,b){this.enabled&&this.update(a,b)};this.update=function(n,q){var r,t,s,p,v;b.clearColor(1,1,1,1);b.disable(b.BLEND);c.setDepthTest(!0);!0===n.autoUpdate&&n.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld);k.multiplyMatrices(q.projectionMatrix,q.matrixWorldInverse);h.setFromMatrix(k);c.setRenderTarget(this.renderTarget);c.clear();l.length=0;a(n,n,q);var w;r=0;for(t=l.length;r<t;r++)s=l[r],v=s.object,s=s.buffer,\nv instanceof THREE.PointCloud&&!v.customDepthMaterial||((w=v.material instanceof THREE.MeshFaceMaterial?v.material.materials[0]:v.material)&&c.setMaterialFaces(v.material),p=void 0!==v.geometry.morphTargets&&0<v.geometry.morphTargets.length&&w.morphTargets,w=v instanceof THREE.SkinnedMesh&&w.skinning,p=v.customDepthMaterial?v.customDepthMaterial:w?p?g:f:p?e:d,s instanceof THREE.BufferGeometry?c.renderBufferDirect(q,n.__lights,null,p,s,v):c.renderBuffer(q,n.__lights,null,p,s,v));p=n.__webglObjectsImmediate;\nr=0;for(t=p.length;r<t;r++)s=p[r],v=s.object,v.visible&&(v._modelViewMatrix.multiplyMatrices(q.matrixWorldInverse,v.matrixWorld),c.renderImmediateObject(q,n.__lights,null,d,v));r=c.getClearColor();t=c.getClearAlpha();b.clearColor(r.r,r.g,r.b,t);b.enable(b.BLEND)}};\nTHREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform lowp int renderType;\\nuniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = visibility.r / 9.0;\\nvVisibility *= 1.0 - visibility.g / 9.0;\\nvVisibility *= visibility.b / 9.0;\\nvVisibility *= 1.0 - visibility.a / 9.0;\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"uniform lowp int renderType;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},\nlensFlare:{vertexShader:\"uniform lowp int renderType;\\nuniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",\nfragmentShader:\"precision mediump float;\\nuniform lowp int renderType;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};\n\nexports.THREE = THREE;})();\n"
},
"$:/plugins/rboue/Three.js/Lib/config.css": {
"type": "text/css",
"title": "$:/plugins/rboue/Three.js/Lib/config.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* Stats module */\n#stats {}\n#stats #fps {background: transparent !important}\n#stats #fps #fpsText {color: #aaa !important}\n#stats #fps #fpsGraph {}"
},
"$:/plugins/rboue/Three.js/Lib/stringview.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/stringview.js",
"module-type": "library",
"text": "(function(){\n\"use strict\";\n/*\nThe aims of this library are:\n\n to create a C-like interface for strings (i.e., an array of character codes — an\n ArrayBufferView in JavaScript) based upon the JavaScript ArrayBuffer interface\n to create a highly extensible library that anyone can extend by adding methods to\n the object StringView.prototype\n to create a collection of methods for such string-like objects (since now: stringViews)\n which work strictly on arrays of numbers rather than on creating new immutable\n JavaScript strings\n to work with Unicode encodings other than JavaScript's default UTF-16 DOMStrings\n*/\n\n/*\\\n|*|\n|*| :: Number.isInteger() polyfill ::\n|*|\n|*| https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n|*|\n\\*/\n\nif (!Number.isInteger) {\n Number.isInteger = function isInteger (nVal) {\n return typeof nVal === \"number\" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal;\n };\n}\n\n/*\\\n|*|\n|*| StringView - Mozilla Developer Network\n|*|\n|*| Revision #8, October 6, 2014\n|*|\n|*| https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays/StringView\n|*| https://developer.mozilla.org/en-US/docs/User:fusionchess\n|*|\n|*| This framework is released under the GNU Lesser General Public License, version 3 or later.\n|*| http://www.gnu.org/licenses/lgpl-3.0.html\n|*|\n\\*/\n\nfunction StringView (vInput, sEncoding /* optional (default: UTF-8) */, nOffset /* optional */, nLength /* optional */) {\n\n var fTAView, aWhole, aRaw, fPutOutptCode, fGetOutptChrSize, nInptLen, nStartIdx = isFinite(nOffset) ? nOffset : 0, nTranscrType = 15;\n\n if (sEncoding) { this.encoding = sEncoding.toString(); }\n\n encSwitch: switch (this.encoding) {\n case \"UTF-8\":\n fPutOutptCode = StringView.putUTF8CharCode;\n fGetOutptChrSize = StringView.getUTF8CharLength;\n fTAView = Uint8Array;\n break encSwitch;\n case \"UTF-16\":\n fPutOutptCode = StringView.putUTF16CharCode;\n fGetOutptChrSize = StringView.getUTF16CharLength;\n fTAView = Uint16Array;\n break encSwitch;\n case \"UTF-32\":\n fTAView = Uint32Array;\n nTranscrType &= 14;\n break encSwitch;\n default:\n /* case \"ASCII\", or case \"BinaryString\" or unknown cases */\n fTAView = Uint8Array;\n nTranscrType &= 14;\n }\n\n typeSwitch: switch (typeof vInput) {\n case \"string\":\n /* the input argument is a primitive string: a new buffer will be created. */\n nTranscrType &= 7;\n break typeSwitch;\n case \"object\":\n classSwitch: switch (vInput.constructor) {\n case StringView:\n /* the input argument is a stringView: a new buffer will be created. */\n nTranscrType &= 3;\n break typeSwitch;\n case String:\n /* the input argument is an objectified string: a new buffer will be created. */\n nTranscrType &= 7;\n break typeSwitch;\n case ArrayBuffer:\n /* the input argument is an arrayBuffer: the buffer will be shared. */\n aWhole = new fTAView(vInput);\n nInptLen = this.encoding === \"UTF-32\" ?\n vInput.byteLength >>> 2\n : this.encoding === \"UTF-16\" ?\n vInput.byteLength >>> 1\n :\n vInput.byteLength;\n aRaw = nStartIdx === 0 && (!isFinite(nLength) || nLength === nInptLen) ?\n aWhole\n : new fTAView(vInput, nStartIdx, !isFinite(nLength) ? nInptLen - nStartIdx : nLength);\n\n break typeSwitch;\n case Uint32Array:\n case Uint16Array:\n case Uint8Array:\n /* the input argument is a typedArray: the buffer, and possibly the array itself, will be shared. */\n fTAView = vInput.constructor;\n nInptLen = vInput.length;\n aWhole = vInput.byteOffset === 0 && vInput.length === (\n fTAView === Uint32Array ?\n vInput.buffer.byteLength >>> 2\n : fTAView === Uint16Array ?\n vInput.buffer.byteLength >>> 1\n :\n vInput.buffer.byteLength\n ) ? vInput : new fTAView(vInput.buffer);\n aRaw = nStartIdx === 0 && (!isFinite(nLength) || nLength === nInptLen) ?\n vInput\n : vInput.subarray(nStartIdx, isFinite(nLength) ? nStartIdx + nLength : nInptLen);\n\n break typeSwitch;\n default:\n /* the input argument is an array or another serializable object: a new typedArray will be created. */\n aWhole = new fTAView(vInput);\n nInptLen = aWhole.length;\n aRaw = nStartIdx === 0 && (!isFinite(nLength) || nLength === nInptLen) ?\n aWhole\n : aWhole.subarray(nStartIdx, isFinite(nLength) ? nStartIdx + nLength : nInptLen);\n }\n break typeSwitch;\n default:\n /* the input argument is a number, a boolean or a function: a new typedArray will be created. */\n aWhole = aRaw = new fTAView(Number(vInput) || 0);\n\n }\n\n if (nTranscrType < 8) {\n\n var vSource, nOutptLen, nCharStart, nCharEnd, nEndIdx, fGetInptChrSize, fGetInptChrCode;\n\n if (nTranscrType & 4) { /* input is string */\n\n vSource = vInput;\n nOutptLen = nInptLen = vSource.length;\n nTranscrType ^= this.encoding === \"UTF-32\" ? 0 : 2;\n /* ...or...: nTranscrType ^= Number(this.encoding !== \"UTF-32\") << 1; */\n nStartIdx = nCharStart = nOffset ? Math.max((nOutptLen + nOffset) % nOutptLen, 0) : 0;\n nEndIdx = nCharEnd = (Number.isInteger(nLength) ? Math.min(Math.max(nLength, 0) + nStartIdx, nOutptLen) : nOutptLen) - 1;\n\n } else { /* input is stringView */\n\n vSource = vInput.rawData;\n nInptLen = vInput.makeIndex();\n nStartIdx = nCharStart = nOffset ? Math.max((nInptLen + nOffset) % nInptLen, 0) : 0;\n nOutptLen = Number.isInteger(nLength) ? Math.min(Math.max(nLength, 0), nInptLen - nCharStart) : nInptLen;\n nEndIdx = nCharEnd = nOutptLen + nCharStart;\n\n if (vInput.encoding === \"UTF-8\") {\n fGetInptChrSize = StringView.getUTF8CharLength;\n fGetInptChrCode = StringView.loadUTF8CharCode;\n } else if (vInput.encoding === \"UTF-16\") {\n fGetInptChrSize = StringView.getUTF16CharLength;\n fGetInptChrCode = StringView.loadUTF16CharCode;\n } else {\n nTranscrType &= 1;\n }\n\n }\n\n if (nOutptLen === 0 || nTranscrType < 4 && vSource.encoding === this.encoding && nCharStart === 0 && nOutptLen === nInptLen) {\n\n /* the encoding is the same, the length too and the offset is 0... or the input is empty! */\n\n nTranscrType = 7;\n\n }\n\n conversionSwitch: switch (nTranscrType) {\n\n case 0:\n\n /* both the source and the new StringView have a fixed-length encoding... */\n\n aWhole = new fTAView(nOutptLen);\n for (var nOutptIdx = 0; nOutptIdx < nOutptLen; aWhole[nOutptIdx] = vSource[nStartIdx + nOutptIdx++]);\n break conversionSwitch;\n\n case 1:\n\n /* the source has a fixed-length encoding but the new StringView has a variable-length encoding... */\n\n /* mapping... */\n\n nOutptLen = 0;\n\n for (var nInptIdx = nStartIdx; nInptIdx < nEndIdx; nInptIdx++) {\n nOutptLen += fGetOutptChrSize(vSource[nInptIdx]);\n }\n\n aWhole = new fTAView(nOutptLen);\n\n /* transcription of the source... */\n\n for (var nInptIdx = nStartIdx, nOutptIdx = 0; nOutptIdx < nOutptLen; nInptIdx++) {\n nOutptIdx = fPutOutptCode(aWhole, vSource[nInptIdx], nOutptIdx);\n }\n\n break conversionSwitch;\n\n case 2:\n\n /* the source has a variable-length encoding but the new StringView has a fixed-length encoding... */\n\n /* mapping... */\n\n nStartIdx = 0;\n\n var nChrCode;\n\n for (nChrIdx = 0; nChrIdx < nCharStart; nChrIdx++) {\n nChrCode = fGetInptChrCode(vSource, nStartIdx);\n nStartIdx += fGetInptChrSize(nChrCode);\n }\n\n aWhole = new fTAView(nOutptLen);\n\n /* transcription of the source... */\n\n for (var nInptIdx = nStartIdx, nOutptIdx = 0; nOutptIdx < nOutptLen; nInptIdx += fGetInptChrSize(nChrCode), nOutptIdx++) {\n nChrCode = fGetInptChrCode(vSource, nInptIdx);\n aWhole[nOutptIdx] = nChrCode;\n }\n\n break conversionSwitch;\n\n case 3:\n\n /* both the source and the new StringView have a variable-length encoding... */\n\n /* mapping... */\n\n nOutptLen = 0;\n\n var nChrCode;\n\n for (var nChrIdx = 0, nInptIdx = 0; nChrIdx < nCharEnd; nInptIdx += fGetInptChrSize(nChrCode)) {\n nChrCode = fGetInptChrCode(vSource, nInptIdx);\n if (nChrIdx === nCharStart) { nStartIdx = nInptIdx; }\n if (++nChrIdx > nCharStart) { nOutptLen += fGetOutptChrSize(nChrCode); }\n }\n\n aWhole = new fTAView(nOutptLen);\n\n /* transcription... */\n\n for (var nInptIdx = nStartIdx, nOutptIdx = 0; nOutptIdx < nOutptLen; nInptIdx += fGetInptChrSize(nChrCode)) {\n nChrCode = fGetInptChrCode(vSource, nInptIdx);\n nOutptIdx = fPutOutptCode(aWhole, nChrCode, nOutptIdx);\n }\n\n break conversionSwitch;\n\n case 4:\n\n /* DOMString to ASCII or BinaryString or other unknown encodings */\n\n aWhole = new fTAView(nOutptLen);\n\n /* transcription... */\n\n for (var nIdx = 0; nIdx < nOutptLen; nIdx++) {\n aWhole[nIdx] = vSource.charCodeAt(nIdx) & 0xff;\n }\n\n break conversionSwitch;\n\n case 5:\n\n /* DOMString to UTF-8 or to UTF-16 */\n\n /* mapping... */\n\n nOutptLen = 0;\n\n for (var nMapIdx = 0; nMapIdx < nInptLen; nMapIdx++) {\n if (nMapIdx === nCharStart) { nStartIdx = nOutptLen; }\n nOutptLen += fGetOutptChrSize(vSource.charCodeAt(nMapIdx));\n if (nMapIdx === nCharEnd) { nEndIdx = nOutptLen; }\n }\n\n aWhole = new fTAView(nOutptLen);\n\n /* transcription... */\n\n for (var nOutptIdx = 0, nChrIdx = 0; nOutptIdx < nOutptLen; nChrIdx++) {\n nOutptIdx = fPutOutptCode(aWhole, vSource.charCodeAt(nChrIdx), nOutptIdx);\n }\n\n break conversionSwitch;\n\n case 6:\n\n /* DOMString to UTF-32 */\n\n aWhole = new fTAView(nOutptLen);\n\n /* transcription... */\n\n for (var nIdx = 0; nIdx < nOutptLen; nIdx++) {\n aWhole[nIdx] = vSource.charCodeAt(nIdx);\n }\n\n break conversionSwitch;\n\n case 7:\n\n aWhole = new fTAView(nOutptLen ? vSource : 0);\n break conversionSwitch;\n\n }\n\n aRaw = nTranscrType > 3 && (nStartIdx > 0 || nEndIdx < aWhole.length - 1) ? aWhole.subarray(nStartIdx, nEndIdx) : aWhole;\n\n }\n\n this.buffer = aWhole.buffer;\n this.bufferView = aWhole;\n this.rawData = aRaw;\n\n Object.freeze(this);\n\n}\n\n/* CONSTRUCTOR'S METHODS */\n\nStringView.loadUTF8CharCode = function (aChars, nIdx) {\n\n var nLen = aChars.length, nPart = aChars[nIdx];\n\n return nPart > 251 && nPart < 254 && nIdx + 5 < nLen ?\n /* (nPart - 252 << 30) may be not safe in ECMAScript! So...: */\n /* six bytes */ (nPart - 252) * 1073741824 + (aChars[nIdx + 1] - 128 << 24) + (aChars[nIdx + 2] - 128 << 18) + (aChars[nIdx + 3] - 128 << 12) + (aChars[nIdx + 4] - 128 << 6) + aChars[nIdx + 5] - 128\n : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ?\n /* five bytes */ (nPart - 248 << 24) + (aChars[nIdx + 1] - 128 << 18) + (aChars[nIdx + 2] - 128 << 12) + (aChars[nIdx + 3] - 128 << 6) + aChars[nIdx + 4] - 128\n : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ?\n /* four bytes */(nPart - 240 << 18) + (aChars[nIdx + 1] - 128 << 12) + (aChars[nIdx + 2] - 128 << 6) + aChars[nIdx + 3] - 128\n : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ?\n /* three bytes */ (nPart - 224 << 12) + (aChars[nIdx + 1] - 128 << 6) + aChars[nIdx + 2] - 128\n : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ?\n /* two bytes */ (nPart - 192 << 6) + aChars[nIdx + 1] - 128\n :\n /* one byte */ nPart;\n\n};\n\nStringView.putUTF8CharCode = function (aTarget, nChar, nPutAt) {\n\n var nIdx = nPutAt;\n\n if (nChar < 0x80 /* 128 */) {\n /* one byte */\n aTarget[nIdx++] = nChar;\n } else if (nChar < 0x800 /* 2048 */) {\n /* two bytes */\n aTarget[nIdx++] = 0xc0 /* 192 */ + (nChar >>> 6);\n aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */);\n } else if (nChar < 0x10000 /* 65536 */) {\n /* three bytes */\n aTarget[nIdx++] = 0xe0 /* 224 */ + (nChar >>> 12);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */);\n } else if (nChar < 0x200000 /* 2097152 */) {\n /* four bytes */\n aTarget[nIdx++] = 0xf0 /* 240 */ + (nChar >>> 18);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 12) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */);\n } else if (nChar < 0x4000000 /* 67108864 */) {\n /* five bytes */\n aTarget[nIdx++] = 0xf8 /* 248 */ + (nChar >>> 24);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 18) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 12) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */);\n } else /* if (nChar <= 0x7fffffff) */ { /* 2147483647 */\n /* six bytes */\n aTarget[nIdx++] = 0xfc /* 252 */ + /* (nChar >>> 30) may be not safe in ECMAScript! So...: */ (nChar / 1073741824);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 24) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 18) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 12) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + ((nChar >>> 6) & 0x3f /* 63 */);\n aTarget[nIdx++] = 0x80 /* 128 */ + (nChar & 0x3f /* 63 */);\n }\n\n return nIdx;\n\n};\n\nStringView.getUTF8CharLength = function (nChar) {\n return nChar < 0x80 ? 1 : nChar < 0x800 ? 2 : nChar < 0x10000 ? 3 : nChar < 0x200000 ? 4 : nChar < 0x4000000 ? 5 : 6;\n};\n\nStringView.loadUTF16CharCode = function (aChars, nIdx) {\n\n /* UTF-16 to DOMString decoding algorithm */\n var nFrstChr = aChars[nIdx];\n\n return nFrstChr > 0xD7BF /* 55231 */ && nIdx + 1 < aChars.length ?\n (nFrstChr - 0xD800 /* 55296 */ << 10) + aChars[nIdx + 1] + 0x2400 /* 9216 */\n : nFrstChr;\n\n};\n\nStringView.putUTF16CharCode = function (aTarget, nChar, nPutAt) {\n\n var nIdx = nPutAt;\n\n if (nChar < 0x10000 /* 65536 */) {\n /* one element */\n aTarget[nIdx++] = nChar;\n } else {\n /* two elements */\n aTarget[nIdx++] = 0xD7C0 /* 55232 */ + (nChar >>> 10);\n aTarget[nIdx++] = 0xDC00 /* 56320 */ + (nChar & 0x3FF /* 1023 */);\n }\n\n return nIdx;\n\n};\n\nStringView.getUTF16CharLength = function (nChar) {\n return nChar < 0x10000 ? 1 : 2;\n};\n\n/* Array of bytes to base64 string decoding */\n\nStringView.b64ToUint6 = function (nChr) {\n\n return nChr > 64 && nChr < 91 ?\n nChr - 65\n : nChr > 96 && nChr < 123 ?\n nChr - 71\n : nChr > 47 && nChr < 58 ?\n nChr + 4\n : nChr === 43 ?\n 62\n : nChr === 47 ?\n 63\n :\n 0;\n\n};\n\nStringView.uint6ToB64 = function (nUint6) {\n\n return nUint6 < 26 ?\n nUint6 + 65\n : nUint6 < 52 ?\n nUint6 + 71\n : nUint6 < 62 ?\n nUint6 - 4\n : nUint6 === 62 ?\n 43\n : nUint6 === 63 ?\n 47\n :\n 65;\n\n};\n\n/* Base64 string to array encoding */\n\nStringView.bytesToBase64 = function (aBytes) {\n\n var sB64Enc = \"\";\n\n for (var nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n nMod3 = nIdx % 3;\n if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += \"\\r\\n\"; }\n nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);\n if (nMod3 === 2 || aBytes.length - nIdx === 1) {\n sB64Enc += String.fromCharCode(StringView.uint6ToB64(nUint24 >>> 18 & 63), StringView.uint6ToB64(nUint24 >>> 12 & 63), StringView.uint6ToB64(nUint24 >>> 6 & 63), StringView.uint6ToB64(nUint24 & 63));\n nUint24 = 0;\n }\n }\n\n return sB64Enc.replace(/A(?=A$|$)/g, \"=\");\n\n};\n\n\nStringView.base64ToBytes = function (sBase64, nBlockBytes) {\n\n var\n sB64Enc = sBase64.replace(/[^A-Za-z0-9\\+\\/]/g, \"\"), nInLen = sB64Enc.length,\n nOutLen = nBlockBytes ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockBytes) * nBlockBytes : nInLen * 3 + 1 >>> 2, aBytes = new Uint8Array(nOutLen);\n\n for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {\n nMod4 = nInIdx & 3;\n nUint24 |= StringView.b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;\n if (nMod4 === 3 || nInLen - nInIdx === 1) {\n for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {\n aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;\n }\n nUint24 = 0;\n }\n }\n\n return aBytes;\n\n};\n\nStringView.makeFromBase64 = function (sB64Inpt, sEncoding, nByteOffset, nLength) {\n\n return new StringView(sEncoding === \"UTF-16\" || sEncoding === \"UTF-32\" ? StringView.base64ToBytes(sB64Inpt, sEncoding === \"UTF-16\" ? 2 : 4).buffer : StringView.base64ToBytes(sB64Inpt), sEncoding, nByteOffset, nLength);\n\n};\n\n/* DEFAULT VALUES */\n\nStringView.prototype.encoding = \"UTF-8\"; /* Default encoding... */\n\n/* INSTANCES' METHODS */\n\nStringView.prototype.makeIndex = function (nChrLength, nStartFrom) {\n\n var\n\n aTarget = this.rawData, nChrEnd, nRawLength = aTarget.length,\n nStartIdx = nStartFrom || 0, nIdxEnd = nStartIdx, nStopAtChr = isNaN(nChrLength) ? Infinity : nChrLength;\n\n if (nChrLength + 1 > aTarget.length) { throw new RangeError(\"StringView.prototype.makeIndex - The offset can\\'t be major than the length of the array - 1.\"); }\n\n switch (this.encoding) {\n\n case \"UTF-8\":\n\n var nPart;\n\n for (nChrEnd = 0; nIdxEnd < nRawLength && nChrEnd < nStopAtChr; nChrEnd++) {\n nPart = aTarget[nIdxEnd];\n nIdxEnd += nPart > 251 && nPart < 254 && nIdxEnd + 5 < nRawLength ? 6\n : nPart > 247 && nPart < 252 && nIdxEnd + 4 < nRawLength ? 5\n : nPart > 239 && nPart < 248 && nIdxEnd + 3 < nRawLength ? 4\n : nPart > 223 && nPart < 240 && nIdxEnd + 2 < nRawLength ? 3\n : nPart > 191 && nPart < 224 && nIdxEnd + 1 < nRawLength ? 2\n : 1;\n }\n\n break;\n\n case \"UTF-16\":\n\n for (nChrEnd = nStartIdx; nIdxEnd < nRawLength && nChrEnd < nStopAtChr; nChrEnd++) {\n nIdxEnd += aTarget[nIdxEnd] > 0xD7BF /* 55231 */ && nIdxEnd + 1 < aTarget.length ? 2 : 1;\n }\n\n break;\n\n default:\n\n nIdxEnd = nChrEnd = isFinite(nChrLength) ? nChrLength : nRawLength - 1;\n\n }\n\n if (nChrLength) { return nIdxEnd; }\n\n return nChrEnd;\n\n};\n\nStringView.prototype.toBase64 = function (bWholeBuffer) {\n\n return StringView.bytesToBase64(\n bWholeBuffer ?\n (\n this.bufferView.constructor === Uint8Array ?\n this.bufferView\n :\n new Uint8Array(this.buffer)\n )\n : this.rawData.constructor === Uint8Array ?\n this.rawData\n :\n new Uint8Array(this.buffer, this.rawData.byteOffset, this.rawData.length << (this.rawData.constructor === Uint16Array ? 1 : 2))\n );\n\n};\n\nStringView.prototype.subview = function (nCharOffset /* optional */, nCharLength /* optional */) {\n\n var\n\n nChrLen, nCharStart, nStrLen, bVariableLen = this.encoding === \"UTF-8\" || this.encoding === \"UTF-16\",\n nStartOffset = nCharOffset, nStringLength, nRawLen = this.rawData.length;\n\n if (nRawLen === 0) {\n return new StringView(this.buffer, this.encoding);\n }\n\n nStringLength = bVariableLen ? this.makeIndex() : nRawLen;\n nCharStart = nCharOffset ? Math.max((nStringLength + nCharOffset) % nStringLength, 0) : 0;\n nStrLen = Number.isInteger(nCharLength) ? Math.max(nCharLength, 0) + nCharStart > nStringLength ? nStringLength - nCharStart : nCharLength : nStringLength;\n\n if (nCharStart === 0 && nStrLen === nStringLength) { return this; }\n\n if (bVariableLen) {\n nStartOffset = this.makeIndex(nCharStart);\n nChrLen = this.makeIndex(nStrLen, nStartOffset) - nStartOffset;\n } else {\n nStartOffset = nCharStart;\n nChrLen = nStrLen - nCharStart;\n }\n\n if (this.encoding === \"UTF-16\") {\n nStartOffset <<= 1;\n } else if (this.encoding === \"UTF-32\") {\n nStartOffset <<= 2;\n }\n\n return new StringView(this.buffer, this.encoding, nStartOffset, nChrLen);\n\n};\n\nStringView.prototype.forEachChar = function (fCallback, oThat, nChrOffset, nChrLen) {\n\n var aSource = this.rawData, nRawEnd, nRawIdx;\n\n if (this.encoding === \"UTF-8\" || this.encoding === \"UTF-16\") {\n\n var fGetInptChrSize, fGetInptChrCode;\n\n if (this.encoding === \"UTF-8\") {\n fGetInptChrSize = StringView.getUTF8CharLength;\n fGetInptChrCode = StringView.loadUTF8CharCode;\n } else if (this.encoding === \"UTF-16\") {\n fGetInptChrSize = StringView.getUTF16CharLength;\n fGetInptChrCode = StringView.loadUTF16CharCode;\n }\n\n nRawIdx = isFinite(nChrOffset) ? this.makeIndex(nChrOffset) : 0;\n nRawEnd = isFinite(nChrLen) ? this.makeIndex(nChrLen, nRawIdx) : aSource.length;\n\n for (var nChrCode, nChrIdx = 0; nRawIdx < nRawEnd; nChrIdx++) {\n nChrCode = fGetInptChrCode(aSource, nRawIdx);\n fCallback.call(oThat || null, nChrCode, nChrIdx, nRawIdx, aSource);\n nRawIdx += fGetInptChrSize(nChrCode);\n }\n\n } else {\n\n nRawIdx = isFinite(nChrOffset) ? nChrOffset : 0;\n nRawEnd = isFinite(nChrLen) ? nChrLen + nRawIdx : aSource.length;\n\n for (nRawIdx; nRawIdx < nRawEnd; nRawIdx++) {\n fCallback.call(oThat || null, aSource[nRawIdx], nRawIdx, nRawIdx, aSource);\n }\n\n }\n\n};\n\nStringView.prototype.valueOf = StringView.prototype.toString = function () {\n\n if (this.encoding !== \"UTF-8\" && this.encoding !== \"UTF-16\") {\n /* ASCII, UTF-32 or BinaryString to DOMString */\n return String.fromCharCode.apply(null, this.rawData);\n }\n\n var fGetCode, fGetIncr, sView = \"\";\n\n if (this.encoding === \"UTF-8\") {\n fGetIncr = StringView.getUTF8CharLength;\n fGetCode = StringView.loadUTF8CharCode;\n } else if (this.encoding === \"UTF-16\") {\n fGetIncr = StringView.getUTF16CharLength;\n fGetCode = StringView.loadUTF16CharCode;\n }\n\n for (var nChr, nLen = this.rawData.length, nIdx = 0; nIdx < nLen; nIdx += fGetIncr(nChr)) {\n nChr = fGetCode(this.rawData, nIdx);\n sView += String.fromCharCode(nChr);\n }\n\n return sView;\n\n};\nexports.StringView = StringView;})();\n"
},
"$:/plugins/rboue/Three.js/Lib/tools.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/tools.js",
"module-type": "library",
"text": "// Tools for playing more easily with Three.js library.\n//\n\n(function() {\n\n var Tools = {};\n\n Tools.Stats = require(\"$:/plugins/rboue/Three.js/Lib/stats-min.js\").Stats;\n Tools.dat = require(\"$:/plugins/rboue/Three.js/Lib/dat-gui-min.js\").dat;\n\n // Resolve PATH\n Tools.resolvePath = function(path) {\n if (!tiddlyWiki) return null;\n return(tiddlyWiki.resolvePath(path));\n };\n\n // Debug tools\n //\n Tools.log = function() {\n this.flagActive = true;\n };\n Tools.log.prototype = {\n start: function() {this.flagActive = true;},\n stop: function() {this.flagActive = false;},\n log: function(mess, flagNoLog, fonc) {\n if (!this.flagActive || flagNoLog) return;\n console.log((fonc ? fonc+\": \" : \"\")+mess);\n },\n logPoint: function(x,y) {return \"(\"+x+\",\"+y+\")\";}\n };\n\n // Animation object\n //\n Tools.Animation = function(node, renderFunc, flagStartStopOnClick, flagLog) {\n var func = \"Tools.Animation\";\n this.flagNoLog = !flagLog;\n this.node = node; // Container DOM node\n this.renderFunc = renderFunc; // rendering\n this.idAnimation = null; // Internal id used by cancelAnimationFrame() to stop animation\n this.flagAnimation = true;\n\n this.nodeId = this.node.getAttribute(\"id\");\n if (!this.nodeId)\n alert(\"Tools.Animation error: DOM node has no \\\"id\\\" attribute. Can't stop animation !\");\n\n // Start/Stop on click\n if (flagStartStopOnClick) {\n var self = this;\n this.node.addEventListener(\"mousedown\", function(event) {\n func = \"Tools.Animation.onMouseDown\";\n self.startStop();\n }, false);\n }\n };\n Tools.Animation.prototype = {\n start: function() {\n var func = \"Tools.Animation.start\";\n hack.log(\"\", this.flagNoLog, func);\n this.flagAnimation = true;\n var self = this;\n var animate = function() {\n var func = \"Tools.Animation.start.animate\";\n // Cancel animation when tiddler has been closed (i.e. widget's DOM node disappears, cf.\n // Jeremy Ruston 14/12/07 in TiddlyWikiDev group).\n if (!document.getElementById(self.nodeId)) {\n hack.log(\"animation canceled: tiddler closes\", self.flagNoLog, func);\n self.stop();\n return;\n }\n self.idAnimation = window.requestAnimationFrame(animate);\n self.renderFunc();\n };\n animate();\n },\n isClosed: function() {\n var func = \"Tools.Animation.isClosed\";\n // Cancel animation when tiddler has been closed (i.e. widget's DOM node disappears, cf.\n // Jeremy Ruston 14/12/07 in TiddlyWikiDev group).\n if (this.nodeId && ! document.getElementById(this.nodeId)) {\n hack.log(\"animation canceled: tiddler closes\", this.flagNoLog, func);\n this.stop();\n return true;\n }\n return false;\n },\n stop: function() {\n var func = \"Tools.Animation.stop\";\n hack.log(\"\", this.flagNoLog, func);\n window.cancelAnimationFrame(this.idAnimation);\n this.flagAnimation = false;\n },\n startStop: function() {\n if (this.flagAnimation)\n this.stop();\n else\n this.start();\n }\n };\n\n // Toolbar container for stats and menu\n //\n Tools.toolbarId = \"toolbar\"; // id of toolbar \n Tools.toolbarGet = function(node) {\n var nodeId = node.getAttribute(\"id\");\n if (!nodeId) return null;\n var toolbarId = nodeId + \"-\" + Tools.toolbarId;\n var toolbar = document.getElementById(toolbarId);\n if (!toolbar) {\n var toolbar = document.createElement(\"div\");\n toolbar.setAttribute(\"id\", toolbarId);\n toolbar.style.position = \"relative\";\n toolbar.style.top = \"\" + (-node.offsetHeight - 5) + \"px\";\n toolbar.style.zIndex = 10;\n node.appendChild(toolbar);\n }\n return toolbar;\n };\n\n // Statistic viewer at upper left corner of widget DOM <node>\n //\n Tools.addStats = function(node) {\n var stats = new Tools.Stats();\n stats.domElement.style.position = \"relative\";\n stats.domElement.style.display = \"inline-block\";\n stats.domElement.style.verticalAlign = \"top\";\n\n // Install stats in toolbar\n var toolbar = Tools.toolbarGet(node);\n if (toolbar.firstChild)\n toolbar.insertBefore(stats.domElement, toolbar.firstChild);\n else\n toolbar.appendChild(stats.domElement);\n return stats;\n };\n\n // GUI menu at upper right corner of widget DOM <node> \n //\n Tools.Gui = function(node, flagOpen) {\n this.node = node;\n this.gui = new Tools.dat.GUI({autoPlace: false});\n this.gui.domElement.style.position = \"relative\";\n this.gui.domElement.style.display = \"inline-block\";\n this.gui.domElement.style.verticalAlign = \"top\";\n this.gui.domElement.style.zIndex = 20;\n //this.onTiddlerRefresh();\n if (flagOpen)\n this.gui.open();\n else\n this.gui.close();\n\n // Install menu in toolbar\n this.toolbar = Tools.toolbarGet(this.node);\n this.toolbar.appendChild(this.gui.domElement);\n };\n Tools.Gui.prototype = {\n get: function() {\n return this.gui;\n },\n onTiddlerRefresh: function() {\n var offset = this.toolbar.childNodes.length >= 2 ? this.toolbar.firstChild.offsetWidth : 0;\n var left = this.toolbar.offsetWidth - offset < 245 ? 0 : this.toolbar.offsetWidth - offset - 245;\n this.gui.domElement.style.left = \"\" + left + \"px\";\n }\n };\n\n // Export renderer's view to tiddler\n // Parameters :\n // <renderer> : renderer.\n // <tiddlerTitle> : title of the target tiddler with respect to the filesystem mode configuration.\n // <type> : type of tiddler : \"image/png\" (default), \"image/jpeg\" or \"image/svg+xml\".\n // <flagOverwrite> : if true, overwrite existing tiddler without asking.\n // Saves renderer's wiew as a tiddler with required type.\n //\n Tools.exportView = function(renderer, tiddlerTitle, type, flagOverwrite) {\n var func = \"Tools.exportView\";\n if (!renderer.domElement) return;\n var tag = renderer.domElement.tagName.toUpperCase();\n if ((((type == \"image/png\") || (type == \"image/jpeg\")) && (tag != \"CANVAS\")) ||\n ((type == \"image/svg+xml\") && (tag != \"SVG\"))) {\n console.error(func+\": bad tiddler type : \"+type)\n return;\n }\n TiddlyWiki.exportToTiddler(renderer.domElement, \"tw:\"+tiddlerTitle, type, flagOverwrite);\n };\n\n // Execute code when a condition is fulfilled\n // Parameters :\n // <funcTest> : returns true when the condition is fulfilled, false otherwise.\n // <funcExec> : code to execute.\n // <periodicity> : periodicity of the active waiting mechanism (250 ms by default).\n //\n Tools.wait = function(funcTest, funcExec, periodicity) {\n var func = \"Tools.wait\", flagNoLog = true;\n var period = 250; // periodicity in ms\n if (periodicity) period = periodicity;\n var timerId = null;\n var doWait = function() {\n var func = \"Tools.wait/doWait\";\n if (!funcTest()) return;\n\n // Test OK\n hack.log(\"test OK !\", flagNoLog, func);\n clearInterval(timerId);\n funcExec();\n };\n timerId = setInterval(doWait, period);\n };\n\n exports.Tools = Tools;\n})();"
},
"$:/plugins/rboue/Three.js/Lib/stats-min.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/stats-min.js",
"module-type": "library",
"text": "(function(){\n// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:11,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\n\nexports.Stats = Stats;})();\n"
},
"$:/plugins/rboue/Three.js/Lib/dat-gui-min.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/dat-gui-min.js",
"module-type": "library",
"text": "(function(){\n/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\nvar dat=dat||{};dat.gui=dat.gui||{};dat.utils=dat.utils||{};dat.controllers=dat.controllers||{};dat.dom=dat.dom||{};dat.color=dat.color||{};dat.utils.css=function(){return{load:function(e,a){var a=a||document,c=a.createElement(\"link\");c.type=\"text/css\";c.rel=\"stylesheet\";c.href=e;a.getElementsByTagName(\"head\")[0].appendChild(c)},inject:function(e,a){var a=a||document,c=document.createElement(\"style\");c.type=\"text/css\";c.innerHTML=e;a.getElementsByTagName(\"head\")[0].appendChild(c)}}}();\ndat.utils.common=function(){var e=Array.prototype.forEach,a=Array.prototype.slice;return{BREAK:{},extend:function(c){this.each(a.call(arguments,1),function(a){for(var f in a)this.isUndefined(a[f])||(c[f]=a[f])},this);return c},defaults:function(c){this.each(a.call(arguments,1),function(a){for(var f in a)this.isUndefined(c[f])&&(c[f]=a[f])},this);return c},compose:function(){var c=a.call(arguments);return function(){for(var d=a.call(arguments),f=c.length-1;f>=0;f--)d=[c[f].apply(this,d)];return d[0]}},\neach:function(a,d,f){if(e&&a.forEach===e)a.forEach(d,f);else if(a.length===a.length+0)for(var b=0,n=a.length;b<n;b++){if(b in a&&d.call(f,a[b],b)===this.BREAK)break}else for(b in a)if(d.call(f,a[b],b)===this.BREAK)break},defer:function(a){setTimeout(a,0)},toArray:function(c){return c.toArray?c.toArray():a.call(c)},isUndefined:function(a){return a===void 0},isNull:function(a){return a===null},isNaN:function(a){return a!==a},isArray:Array.isArray||function(a){return a.constructor===Array},isObject:function(a){return a===\nObject(a)},isNumber:function(a){return a===a+0},isString:function(a){return a===a+\"\"},isBoolean:function(a){return a===false||a===true},isFunction:function(a){return Object.prototype.toString.call(a)===\"[object Function]\"}}}();\ndat.controllers.Controller=function(e){var a=function(a,d){this.initialValue=a[d];this.domElement=document.createElement(\"div\");this.object=a;this.property=d;this.__onFinishChange=this.__onChange=void 0};e.extend(a.prototype,{onChange:function(a){this.__onChange=a;return this},onFinishChange:function(a){this.__onFinishChange=a;return this},setValue:function(a){this.object[this.property]=a;this.__onChange&&this.__onChange.call(this,a);this.updateDisplay();return this},getValue:function(){return this.object[this.property]},\nupdateDisplay:function(){return this},isModified:function(){return this.initialValue!==this.getValue()}});return a}(dat.utils.common);\ndat.dom.dom=function(e){function a(b){if(b===\"0\"||e.isUndefined(b))return 0;b=b.match(d);return!e.isNull(b)?parseFloat(b[1]):0}var c={};e.each({HTMLEvents:[\"change\"],MouseEvents:[\"click\",\"mousemove\",\"mousedown\",\"mouseup\",\"mouseover\"],KeyboardEvents:[\"keydown\"]},function(b,a){e.each(b,function(b){c[b]=a})});var d=/(\\d+(\\.\\d+)?)px/,f={makeSelectable:function(b,a){if(!(b===void 0||b.style===void 0))b.onselectstart=a?function(){return false}:function(){},b.style.MozUserSelect=a?\"auto\":\"none\",b.style.KhtmlUserSelect=\na?\"auto\":\"none\",b.unselectable=a?\"on\":\"off\"},makeFullscreen:function(b,a,d){e.isUndefined(a)&&(a=true);e.isUndefined(d)&&(d=true);b.style.position=\"absolute\";if(a)b.style.left=0,b.style.right=0;if(d)b.style.top=0,b.style.bottom=0},fakeEvent:function(b,a,d,f){var d=d||{},m=c[a];if(!m)throw Error(\"Event type \"+a+\" not supported.\");var l=document.createEvent(m);switch(m){case \"MouseEvents\":l.initMouseEvent(a,d.bubbles||false,d.cancelable||true,window,d.clickCount||1,0,0,d.x||d.clientX||0,d.y||d.clientY||\n0,false,false,false,false,0,null);break;case \"KeyboardEvents\":m=l.initKeyboardEvent||l.initKeyEvent;e.defaults(d,{cancelable:true,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false,keyCode:void 0,charCode:void 0});m(a,d.bubbles||false,d.cancelable,window,d.ctrlKey,d.altKey,d.shiftKey,d.metaKey,d.keyCode,d.charCode);break;default:l.initEvent(a,d.bubbles||false,d.cancelable||true)}e.defaults(l,f);b.dispatchEvent(l)},bind:function(b,a,d,c){b.addEventListener?b.addEventListener(a,d,c||false):b.attachEvent&&\nb.attachEvent(\"on\"+a,d);return f},unbind:function(b,a,d,c){b.removeEventListener?b.removeEventListener(a,d,c||false):b.detachEvent&&b.detachEvent(\"on\"+a,d);return f},addClass:function(b,a){if(b.className===void 0)b.className=a;else if(b.className!==a){var d=b.className.split(/ +/);if(d.indexOf(a)==-1)d.push(a),b.className=d.join(\" \").replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")}return f},removeClass:function(b,a){if(a){if(b.className!==void 0)if(b.className===a)b.removeAttribute(\"class\");else{var d=b.className.split(/ +/),\nc=d.indexOf(a);if(c!=-1)d.splice(c,1),b.className=d.join(\" \")}}else b.className=void 0;return f},hasClass:function(a,d){return RegExp(\"(?:^|\\\\s+)\"+d+\"(?:\\\\s+|$)\").test(a.className)||false},getWidth:function(b){b=getComputedStyle(b);return a(b[\"border-left-width\"])+a(b[\"border-right-width\"])+a(b[\"padding-left\"])+a(b[\"padding-right\"])+a(b.width)},getHeight:function(b){b=getComputedStyle(b);return a(b[\"border-top-width\"])+a(b[\"border-bottom-width\"])+a(b[\"padding-top\"])+a(b[\"padding-bottom\"])+a(b.height)},\ngetOffset:function(a){var d={left:0,top:0};if(a.offsetParent){do d.left+=a.offsetLeft,d.top+=a.offsetTop;while(a=a.offsetParent)}return d},isActive:function(a){return a===document.activeElement&&(a.type||a.href)}};return f}(dat.utils.common);\ndat.controllers.OptionController=function(e,a,c){var d=function(f,b,e){d.superclass.call(this,f,b);var h=this;this.__select=document.createElement(\"select\");if(c.isArray(e)){var j={};c.each(e,function(a){j[a]=a});e=j}c.each(e,function(a,b){var d=document.createElement(\"option\");d.innerHTML=b;d.setAttribute(\"value\",a);h.__select.appendChild(d)});this.updateDisplay();a.bind(this.__select,\"change\",function(){h.setValue(this.options[this.selectedIndex].value)});this.domElement.appendChild(this.__select)};\nd.superclass=e;c.extend(d.prototype,e.prototype,{setValue:function(a){a=d.superclass.prototype.setValue.call(this,a);this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue());return a},updateDisplay:function(){this.__select.value=this.getValue();return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common);\ndat.controllers.NumberController=function(e,a){var c=function(d,f,b){c.superclass.call(this,d,f);b=b||{};this.__min=b.min;this.__max=b.max;this.__step=b.step;d=this.__impliedStep=a.isUndefined(this.__step)?this.initialValue==0?1:Math.pow(10,Math.floor(Math.log(this.initialValue)/Math.LN10))/10:this.__step;d=d.toString();this.__precision=d.indexOf(\".\")>-1?d.length-d.indexOf(\".\")-1:0};c.superclass=e;a.extend(c.prototype,e.prototype,{setValue:function(a){if(this.__min!==void 0&&a<this.__min)a=this.__min;\nelse if(this.__max!==void 0&&a>this.__max)a=this.__max;this.__step!==void 0&&a%this.__step!=0&&(a=Math.round(a/this.__step)*this.__step);return c.superclass.prototype.setValue.call(this,a)},min:function(a){this.__min=a;return this},max:function(a){this.__max=a;return this},step:function(a){this.__step=a;return this}});return c}(dat.controllers.Controller,dat.utils.common);\ndat.controllers.NumberControllerBox=function(e,a,c){var d=function(f,b,e){function h(){var a=parseFloat(l.__input.value);c.isNaN(a)||l.setValue(a)}function j(a){var b=o-a.clientY;l.setValue(l.getValue()+b*l.__impliedStep);o=a.clientY}function m(){a.unbind(window,\"mousemove\",j);a.unbind(window,\"mouseup\",m)}this.__truncationSuspended=false;d.superclass.call(this,f,b,e);var l=this,o;this.__input=document.createElement(\"input\");this.__input.setAttribute(\"type\",\"text\");a.bind(this.__input,\"change\",h);\na.bind(this.__input,\"blur\",function(){h();l.__onFinishChange&&l.__onFinishChange.call(l,l.getValue())});a.bind(this.__input,\"mousedown\",function(b){a.bind(window,\"mousemove\",j);a.bind(window,\"mouseup\",m);o=b.clientY});a.bind(this.__input,\"keydown\",function(a){if(a.keyCode===13)l.__truncationSuspended=true,this.blur(),l.__truncationSuspended=false});this.updateDisplay();this.domElement.appendChild(this.__input)};d.superclass=e;c.extend(d.prototype,e.prototype,{updateDisplay:function(){var a=this.__input,\nb;if(this.__truncationSuspended)b=this.getValue();else{b=this.getValue();var c=Math.pow(10,this.__precision);b=Math.round(b*c)/c}a.value=b;return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.NumberController,dat.dom.dom,dat.utils.common);\ndat.controllers.NumberControllerSlider=function(e,a,c,d,f){var b=function(d,c,f,e,l){function o(b){b.preventDefault();var d=a.getOffset(g.__background),c=a.getWidth(g.__background);g.setValue(g.__min+(g.__max-g.__min)*((b.clientX-d.left)/(d.left+c-d.left)));return false}function y(){a.unbind(window,\"mousemove\",o);a.unbind(window,\"mouseup\",y);g.__onFinishChange&&g.__onFinishChange.call(g,g.getValue())}b.superclass.call(this,d,c,{min:f,max:e,step:l});var g=this;this.__background=document.createElement(\"div\");\nthis.__foreground=document.createElement(\"div\");a.bind(this.__background,\"mousedown\",function(b){a.bind(window,\"mousemove\",o);a.bind(window,\"mouseup\",y);o(b)});a.addClass(this.__background,\"slider\");a.addClass(this.__foreground,\"slider-fg\");this.updateDisplay();this.__background.appendChild(this.__foreground);this.domElement.appendChild(this.__background)};b.superclass=e;b.useDefaultStyles=function(){c.inject(f)};d.extend(b.prototype,e.prototype,{updateDisplay:function(){this.__foreground.style.width=\n(this.getValue()-this.__min)/(this.__max-this.__min)*100+\"%\";return b.superclass.prototype.updateDisplay.call(this)}});return b}(dat.controllers.NumberController,dat.dom.dom,dat.utils.css,dat.utils.common,\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\ndat.controllers.FunctionController=function(e,a,c){var d=function(c,b,e){d.superclass.call(this,c,b);var h=this;this.__button=document.createElement(\"div\");this.__button.innerHTML=e===void 0?\"Fire\":e;a.bind(this.__button,\"click\",function(a){a.preventDefault();h.fire();return false});a.addClass(this.__button,\"button\");this.domElement.appendChild(this.__button)};d.superclass=e;c.extend(d.prototype,e.prototype,{fire:function(){this.__onChange&&this.__onChange.call(this);this.__onFinishChange&&this.__onFinishChange.call(this,\nthis.getValue());this.getValue().call(this.object)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common);\ndat.controllers.BooleanController=function(e,a,c){var d=function(c,b){d.superclass.call(this,c,b);var e=this;this.__prev=this.getValue();this.__checkbox=document.createElement(\"input\");this.__checkbox.setAttribute(\"type\",\"checkbox\");a.bind(this.__checkbox,\"change\",function(){e.setValue(!e.__prev)},false);this.domElement.appendChild(this.__checkbox);this.updateDisplay()};d.superclass=e;c.extend(d.prototype,e.prototype,{setValue:function(a){a=d.superclass.prototype.setValue.call(this,a);this.__onFinishChange&&\nthis.__onFinishChange.call(this,this.getValue());this.__prev=this.getValue();return a},updateDisplay:function(){this.getValue()===true?(this.__checkbox.setAttribute(\"checked\",\"checked\"),this.__checkbox.checked=true):this.__checkbox.checked=false;return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common);\ndat.color.toString=function(e){return function(a){if(a.a==1||e.isUndefined(a.a)){for(a=a.hex.toString(16);a.length<6;)a=\"0\"+a;return\"#\"+a}else return\"rgba(\"+Math.round(a.r)+\",\"+Math.round(a.g)+\",\"+Math.round(a.b)+\",\"+a.a+\")\"}}(dat.utils.common);\ndat.color.interpret=function(e,a){var c,d,f=[{litmus:a.isString,conversions:{THREE_CHAR_HEX:{read:function(a){a=a.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return a===null?false:{space:\"HEX\",hex:parseInt(\"0x\"+a[1].toString()+a[1].toString()+a[2].toString()+a[2].toString()+a[3].toString()+a[3].toString())}},write:e},SIX_CHAR_HEX:{read:function(a){a=a.match(/^#([A-F0-9]{6})$/i);return a===null?false:{space:\"HEX\",hex:parseInt(\"0x\"+a[1].toString())}},write:e},CSS_RGB:{read:function(a){a=a.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\nreturn a===null?false:{space:\"RGB\",r:parseFloat(a[1]),g:parseFloat(a[2]),b:parseFloat(a[3])}},write:e},CSS_RGBA:{read:function(a){a=a.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);return a===null?false:{space:\"RGB\",r:parseFloat(a[1]),g:parseFloat(a[2]),b:parseFloat(a[3]),a:parseFloat(a[4])}},write:e}}},{litmus:a.isNumber,conversions:{HEX:{read:function(a){return{space:\"HEX\",hex:a,conversionName:\"HEX\"}},write:function(a){return a.hex}}}},{litmus:a.isArray,conversions:{RGB_ARRAY:{read:function(a){return a.length!=\n3?false:{space:\"RGB\",r:a[0],g:a[1],b:a[2]}},write:function(a){return[a.r,a.g,a.b]}},RGBA_ARRAY:{read:function(a){return a.length!=4?false:{space:\"RGB\",r:a[0],g:a[1],b:a[2],a:a[3]}},write:function(a){return[a.r,a.g,a.b,a.a]}}}},{litmus:a.isObject,conversions:{RGBA_OBJ:{read:function(b){return a.isNumber(b.r)&&a.isNumber(b.g)&&a.isNumber(b.b)&&a.isNumber(b.a)?{space:\"RGB\",r:b.r,g:b.g,b:b.b,a:b.a}:false},write:function(a){return{r:a.r,g:a.g,b:a.b,a:a.a}}},RGB_OBJ:{read:function(b){return a.isNumber(b.r)&&\na.isNumber(b.g)&&a.isNumber(b.b)?{space:\"RGB\",r:b.r,g:b.g,b:b.b}:false},write:function(a){return{r:a.r,g:a.g,b:a.b}}},HSVA_OBJ:{read:function(b){return a.isNumber(b.h)&&a.isNumber(b.s)&&a.isNumber(b.v)&&a.isNumber(b.a)?{space:\"HSV\",h:b.h,s:b.s,v:b.v,a:b.a}:false},write:function(a){return{h:a.h,s:a.s,v:a.v,a:a.a}}},HSV_OBJ:{read:function(b){return a.isNumber(b.h)&&a.isNumber(b.s)&&a.isNumber(b.v)?{space:\"HSV\",h:b.h,s:b.s,v:b.v}:false},write:function(a){return{h:a.h,s:a.s,v:a.v}}}}}];return function(){d=\nfalse;var b=arguments.length>1?a.toArray(arguments):arguments[0];a.each(f,function(e){if(e.litmus(b))return a.each(e.conversions,function(e,f){c=e.read(b);if(d===false&&c!==false)return d=c,c.conversionName=f,c.conversion=e,a.BREAK}),a.BREAK});return d}}(dat.color.toString,dat.utils.common);\ndat.GUI=dat.gui.GUI=function(e,a,c,d,f,b,n,h,j,m,l,o,y,g,i){function q(a,b,r,c){if(b[r]===void 0)throw Error(\"Object \"+b+' has no property \"'+r+'\"');c.color?b=new l(b,r):(b=[b,r].concat(c.factoryArgs),b=d.apply(a,b));if(c.before instanceof f)c.before=c.before.__li;t(a,b);g.addClass(b.domElement,\"c\");r=document.createElement(\"span\");g.addClass(r,\"property-name\");r.innerHTML=b.property;var e=document.createElement(\"div\");e.appendChild(r);e.appendChild(b.domElement);c=s(a,e,c.before);g.addClass(c,k.CLASS_CONTROLLER_ROW);\ng.addClass(c,typeof b.getValue());p(a,c,b);a.__controllers.push(b);return b}function s(a,b,d){var c=document.createElement(\"li\");b&&c.appendChild(b);d?a.__ul.insertBefore(c,params.before):a.__ul.appendChild(c);a.onResize();return c}function p(a,d,c){c.__li=d;c.__gui=a;i.extend(c,{options:function(b){if(arguments.length>1)return c.remove(),q(a,c.object,c.property,{before:c.__li.nextElementSibling,factoryArgs:[i.toArray(arguments)]});if(i.isArray(b)||i.isObject(b))return c.remove(),q(a,c.object,c.property,\n{before:c.__li.nextElementSibling,factoryArgs:[b]})},name:function(a){c.__li.firstElementChild.firstElementChild.innerHTML=a;return c},listen:function(){c.__gui.listen(c);return c},remove:function(){c.__gui.remove(c);return c}});if(c instanceof j){var e=new h(c.object,c.property,{min:c.__min,max:c.__max,step:c.__step});i.each([\"updateDisplay\",\"onChange\",\"onFinishChange\"],function(a){var b=c[a],H=e[a];c[a]=e[a]=function(){var a=Array.prototype.slice.call(arguments);b.apply(c,a);return H.apply(e,a)}});\ng.addClass(d,\"has-slider\");c.domElement.insertBefore(e.domElement,c.domElement.firstElementChild)}else if(c instanceof h){var f=function(b){return i.isNumber(c.__min)&&i.isNumber(c.__max)?(c.remove(),q(a,c.object,c.property,{before:c.__li.nextElementSibling,factoryArgs:[c.__min,c.__max,c.__step]})):b};c.min=i.compose(f,c.min);c.max=i.compose(f,c.max)}else if(c instanceof b)g.bind(d,\"click\",function(){g.fakeEvent(c.__checkbox,\"click\")}),g.bind(c.__checkbox,\"click\",function(a){a.stopPropagation()});\nelse if(c instanceof n)g.bind(d,\"click\",function(){g.fakeEvent(c.__button,\"click\")}),g.bind(d,\"mouseover\",function(){g.addClass(c.__button,\"hover\")}),g.bind(d,\"mouseout\",function(){g.removeClass(c.__button,\"hover\")});else if(c instanceof l)g.addClass(d,\"color\"),c.updateDisplay=i.compose(function(a){d.style.borderLeftColor=c.__color.toString();return a},c.updateDisplay),c.updateDisplay();c.setValue=i.compose(function(b){a.getRoot().__preset_select&&c.isModified()&&B(a.getRoot(),true);return b},c.setValue)}\nfunction t(a,b){var c=a.getRoot(),d=c.__rememberedObjects.indexOf(b.object);if(d!=-1){var e=c.__rememberedObjectIndecesToControllers[d];e===void 0&&(e={},c.__rememberedObjectIndecesToControllers[d]=e);e[b.property]=b;if(c.load&&c.load.remembered){c=c.load.remembered;if(c[a.preset])c=c[a.preset];else if(c[w])c=c[w];else return;if(c[d]&&c[d][b.property]!==void 0)d=c[d][b.property],b.initialValue=d,b.setValue(d)}}}function I(a){var b=a.__save_row=document.createElement(\"li\");g.addClass(a.domElement,\n\"has-save\");a.__ul.insertBefore(b,a.__ul.firstChild);g.addClass(b,\"save-row\");var c=document.createElement(\"span\");c.innerHTML=\" \";g.addClass(c,\"button gears\");var d=document.createElement(\"span\");d.innerHTML=\"Save\";g.addClass(d,\"button\");g.addClass(d,\"save\");var e=document.createElement(\"span\");e.innerHTML=\"New\";g.addClass(e,\"button\");g.addClass(e,\"save-as\");var f=document.createElement(\"span\");f.innerHTML=\"Revert\";g.addClass(f,\"button\");g.addClass(f,\"revert\");var m=a.__preset_select=document.createElement(\"select\");\na.load&&a.load.remembered?i.each(a.load.remembered,function(b,c){C(a,c,c==a.preset)}):C(a,w,false);g.bind(m,\"change\",function(){for(var b=0;b<a.__preset_select.length;b++)a.__preset_select[b].innerHTML=a.__preset_select[b].value;a.preset=this.value});b.appendChild(m);b.appendChild(c);b.appendChild(d);b.appendChild(e);b.appendChild(f);if(u){var b=document.getElementById(\"dg-save-locally\"),l=document.getElementById(\"dg-local-explain\");b.style.display=\"block\";b=document.getElementById(\"dg-local-storage\");\nlocalStorage.getItem(document.location.href+\".isLocal\")===\"true\"&&b.setAttribute(\"checked\",\"checked\");var o=function(){l.style.display=a.useLocalStorage?\"block\":\"none\"};o();g.bind(b,\"change\",function(){a.useLocalStorage=!a.useLocalStorage;o()})}var h=document.getElementById(\"dg-new-constructor\");g.bind(h,\"keydown\",function(a){a.metaKey&&(a.which===67||a.keyCode==67)&&x.hide()});g.bind(c,\"click\",function(){h.innerHTML=JSON.stringify(a.getSaveObject(),void 0,2);x.show();h.focus();h.select()});g.bind(d,\n\"click\",function(){a.save()});g.bind(e,\"click\",function(){var b=prompt(\"Enter a new preset name.\");b&&a.saveAs(b)});g.bind(f,\"click\",function(){a.revert()})}function J(a){function b(f){f.preventDefault();e=f.clientX;g.addClass(a.__closeButton,k.CLASS_DRAG);g.bind(window,\"mousemove\",c);g.bind(window,\"mouseup\",d);return false}function c(b){b.preventDefault();a.width+=e-b.clientX;a.onResize();e=b.clientX;return false}function d(){g.removeClass(a.__closeButton,k.CLASS_DRAG);g.unbind(window,\"mousemove\",\nc);g.unbind(window,\"mouseup\",d)}a.__resize_handle=document.createElement(\"div\");i.extend(a.__resize_handle.style,{width:\"6px\",marginLeft:\"-3px\",height:\"200px\",cursor:\"ew-resize\",position:\"absolute\"});var e;g.bind(a.__resize_handle,\"mousedown\",b);g.bind(a.__closeButton,\"mousedown\",b);a.domElement.insertBefore(a.__resize_handle,a.domElement.firstElementChild)}function D(a,b){a.domElement.style.width=b+\"px\";if(a.__save_row&&a.autoPlace)a.__save_row.style.width=b+\"px\";if(a.__closeButton)a.__closeButton.style.width=\nb+\"px\"}function z(a,b){var c={};i.each(a.__rememberedObjects,function(d,e){var f={};i.each(a.__rememberedObjectIndecesToControllers[e],function(a,c){f[c]=b?a.initialValue:a.getValue()});c[e]=f});return c}function C(a,b,c){var d=document.createElement(\"option\");d.innerHTML=b;d.value=b;a.__preset_select.appendChild(d);if(c)a.__preset_select.selectedIndex=a.__preset_select.length-1}function B(a,b){var c=a.__preset_select[a.__preset_select.selectedIndex];c.innerHTML=b?c.value+\"*\":c.value}function E(a){a.length!=\n0&&o(function(){E(a)});i.each(a,function(a){a.updateDisplay()})}e.inject(c);var w=\"Default\",u;try{u=\"localStorage\"in window&&window.localStorage!==null}catch(K){u=false}var x,F=true,v,A=false,G=[],k=function(a){function b(){localStorage.setItem(document.location.href+\".gui\",JSON.stringify(d.getSaveObject()))}function c(){var a=d.getRoot();a.width+=1;i.defer(function(){a.width-=1})}var d=this;this.domElement=document.createElement(\"div\");this.__ul=document.createElement(\"ul\");this.domElement.appendChild(this.__ul);\ng.addClass(this.domElement,\"dg\");this.__folders={};this.__controllers=[];this.__rememberedObjects=[];this.__rememberedObjectIndecesToControllers=[];this.__listening=[];a=a||{};a=i.defaults(a,{autoPlace:true,width:k.DEFAULT_WIDTH});a=i.defaults(a,{resizable:a.autoPlace,hideable:a.autoPlace});if(i.isUndefined(a.load))a.load={preset:w};else if(a.preset)a.load.preset=a.preset;i.isUndefined(a.parent)&&a.hideable&&G.push(this);a.resizable=i.isUndefined(a.parent)&&a.resizable;if(a.autoPlace&&i.isUndefined(a.scrollable))a.scrollable=\ntrue;var e=u&&localStorage.getItem(document.location.href+\".isLocal\")===\"true\";Object.defineProperties(this,{parent:{get:function(){return a.parent}},scrollable:{get:function(){return a.scrollable}},autoPlace:{get:function(){return a.autoPlace}},preset:{get:function(){return d.parent?d.getRoot().preset:a.load.preset},set:function(b){d.parent?d.getRoot().preset=b:a.load.preset=b;for(b=0;b<this.__preset_select.length;b++)if(this.__preset_select[b].value==this.preset)this.__preset_select.selectedIndex=\nb;d.revert()}},width:{get:function(){return a.width},set:function(b){a.width=b;D(d,b)}},name:{get:function(){return a.name},set:function(b){a.name=b;if(m)m.innerHTML=a.name}},closed:{get:function(){return a.closed},set:function(b){a.closed=b;a.closed?g.addClass(d.__ul,k.CLASS_CLOSED):g.removeClass(d.__ul,k.CLASS_CLOSED);this.onResize();if(d.__closeButton)d.__closeButton.innerHTML=b?k.TEXT_OPEN:k.TEXT_CLOSED}},load:{get:function(){return a.load}},useLocalStorage:{get:function(){return e},set:function(a){u&&\n((e=a)?g.bind(window,\"unload\",b):g.unbind(window,\"unload\",b),localStorage.setItem(document.location.href+\".isLocal\",a))}}});if(i.isUndefined(a.parent)){a.closed=false;g.addClass(this.domElement,k.CLASS_MAIN);g.makeSelectable(this.domElement,false);if(u&&e){d.useLocalStorage=true;var f=localStorage.getItem(document.location.href+\".gui\");if(f)a.load=JSON.parse(f)}this.__closeButton=document.createElement(\"div\");this.__closeButton.innerHTML=k.TEXT_CLOSED;g.addClass(this.__closeButton,k.CLASS_CLOSE_BUTTON);\nthis.domElement.appendChild(this.__closeButton);g.bind(this.__closeButton,\"click\",function(){d.closed=!d.closed})}else{if(a.closed===void 0)a.closed=true;var m=document.createTextNode(a.name);g.addClass(m,\"controller-name\");f=s(d,m);g.addClass(this.__ul,k.CLASS_CLOSED);g.addClass(f,\"title\");g.bind(f,\"click\",function(a){a.preventDefault();d.closed=!d.closed;return false});if(!a.closed)this.closed=false}a.autoPlace&&(i.isUndefined(a.parent)&&(F&&(v=document.createElement(\"div\"),g.addClass(v,\"dg\"),g.addClass(v,\nk.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(v),F=false),v.appendChild(this.domElement),g.addClass(this.domElement,k.CLASS_AUTO_PLACE)),this.parent||D(d,a.width));g.bind(window,\"resize\",function(){d.onResize()});g.bind(this.__ul,\"webkitTransitionEnd\",function(){d.onResize()});g.bind(this.__ul,\"transitionend\",function(){d.onResize()});g.bind(this.__ul,\"oTransitionEnd\",function(){d.onResize()});this.onResize();a.resizable&&J(this);d.getRoot();a.parent||c()};k.toggleHide=function(){A=!A;i.each(G,\nfunction(a){a.domElement.style.zIndex=A?-999:999;a.domElement.style.opacity=A?0:1})};k.CLASS_AUTO_PLACE=\"a\";k.CLASS_AUTO_PLACE_CONTAINER=\"ac\";k.CLASS_MAIN=\"main\";k.CLASS_CONTROLLER_ROW=\"cr\";k.CLASS_TOO_TALL=\"taller-than-window\";k.CLASS_CLOSED=\"closed\";k.CLASS_CLOSE_BUTTON=\"close-button\";k.CLASS_DRAG=\"drag\";k.DEFAULT_WIDTH=245;k.TEXT_CLOSED=\"Close Controls\";k.TEXT_OPEN=\"Open Controls\";g.bind(window,\"keydown\",function(a){document.activeElement.type!==\"text\"&&(a.which===72||a.keyCode==72)&&k.toggleHide()},\nfalse);i.extend(k.prototype,{add:function(a,b){return q(this,a,b,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(a,b){return q(this,a,b,{color:true})},remove:function(a){this.__ul.removeChild(a.__li);this.__controllers.slice(this.__controllers.indexOf(a),1);var b=this;i.defer(function(){b.onResize()})},destroy:function(){this.autoPlace&&v.removeChild(this.domElement)},addFolder:function(a){if(this.__folders[a]!==void 0)throw Error('You already have a folder in this GUI by the name \"'+\na+'\"');var b={name:a,parent:this};b.autoPlace=this.autoPlace;if(this.load&&this.load.folders&&this.load.folders[a])b.closed=this.load.folders[a].closed,b.load=this.load.folders[a];b=new k(b);this.__folders[a]=b;a=s(this,b.domElement);g.addClass(a,\"folder\");return b},open:function(){this.closed=false},close:function(){this.closed=true},onResize:function(){var a=this.getRoot();if(a.scrollable){var b=g.getOffset(a.__ul).top,c=0;i.each(a.__ul.childNodes,function(b){a.autoPlace&&b===a.__save_row||(c+=\ng.getHeight(b))});window.innerHeight-b-20<c?(g.addClass(a.domElement,k.CLASS_TOO_TALL),a.__ul.style.height=window.innerHeight-b-20+\"px\"):(g.removeClass(a.domElement,k.CLASS_TOO_TALL),a.__ul.style.height=\"auto\")}a.__resize_handle&&i.defer(function(){a.__resize_handle.style.height=a.__ul.offsetHeight+\"px\"});if(a.__closeButton)a.__closeButton.style.width=a.width+\"px\"},remember:function(){if(i.isUndefined(x))x=new y,x.domElement.innerHTML=a;if(this.parent)throw Error(\"You can only call remember on a top level GUI.\");\nvar b=this;i.each(Array.prototype.slice.call(arguments),function(a){b.__rememberedObjects.length==0&&I(b);b.__rememberedObjects.indexOf(a)==-1&&b.__rememberedObjects.push(a)});this.autoPlace&&D(this,this.width)},getRoot:function(){for(var a=this;a.parent;)a=a.parent;return a},getSaveObject:function(){var a=this.load;a.closed=this.closed;if(this.__rememberedObjects.length>0){a.preset=this.preset;if(!a.remembered)a.remembered={};a.remembered[this.preset]=z(this)}a.folders={};i.each(this.__folders,function(b,\nc){a.folders[c]=b.getSaveObject()});return a},save:function(){if(!this.load.remembered)this.load.remembered={};this.load.remembered[this.preset]=z(this);B(this,false)},saveAs:function(a){if(!this.load.remembered)this.load.remembered={},this.load.remembered[w]=z(this,true);this.load.remembered[a]=z(this);this.preset=a;C(this,a,true)},revert:function(a){i.each(this.__controllers,function(b){this.getRoot().load.remembered?t(a||this.getRoot(),b):b.setValue(b.initialValue)},this);i.each(this.__folders,\nfunction(a){a.revert(a)});a||B(this.getRoot(),false)},listen:function(a){var b=this.__listening.length==0;this.__listening.push(a);b&&E(this.__listening)}});return k}(dat.utils.css,'<div id=\"dg-save\" class=\"dg dialogue\">\\n\\n Here\\'s the new load parameter for your <code>GUI</code>\\'s constructor:\\n\\n <textarea id=\"dg-new-constructor\"></textarea>\\n\\n <div id=\"dg-save-locally\">\\n\\n <input id=\"dg-local-storage\" type=\"checkbox\"/> Automatically save\\n values to <code>localStorage</code> on exit.\\n\\n <div id=\"dg-local-explain\">The values saved to <code>localStorage</code> will\\n override those passed to <code>dat.GUI</code>\\'s constructor. This makes it\\n easier to work incrementally, but <code>localStorage</code> is fragile,\\n and your friends may not see the same values you do.\\n \\n </div>\\n \\n </div>\\n\\n</div>',\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory=function(e,a,c,d,f,b,n){return function(h,j,m,l){var o=h[j];if(n.isArray(m)||n.isObject(m))return new e(h,j,m);if(n.isNumber(o))return n.isNumber(m)&&n.isNumber(l)?new c(h,j,m,l):new a(h,j,{min:m,max:l});if(n.isString(o))return new d(h,j);if(n.isFunction(o))return new f(h,j,\"\");if(n.isBoolean(o))return new b(h,j)}}(dat.controllers.OptionController,dat.controllers.NumberControllerBox,dat.controllers.NumberControllerSlider,dat.controllers.StringController=function(e,a,c){var d=\nfunction(c,b){function e(){h.setValue(h.__input.value)}d.superclass.call(this,c,b);var h=this;this.__input=document.createElement(\"input\");this.__input.setAttribute(\"type\",\"text\");a.bind(this.__input,\"keyup\",e);a.bind(this.__input,\"change\",e);a.bind(this.__input,\"blur\",function(){h.__onFinishChange&&h.__onFinishChange.call(h,h.getValue())});a.bind(this.__input,\"keydown\",function(a){a.keyCode===13&&this.blur()});this.updateDisplay();this.domElement.appendChild(this.__input)};d.superclass=e;c.extend(d.prototype,\ne.prototype,{updateDisplay:function(){if(!a.isActive(this.__input))this.__input.value=this.getValue();return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common),dat.controllers.FunctionController,dat.controllers.BooleanController,dat.utils.common),dat.controllers.Controller,dat.controllers.BooleanController,dat.controllers.FunctionController,dat.controllers.NumberControllerBox,dat.controllers.NumberControllerSlider,dat.controllers.OptionController,\ndat.controllers.ColorController=function(e,a,c,d,f){function b(a,b,c,d){a.style.background=\"\";f.each(j,function(e){a.style.cssText+=\"background: \"+e+\"linear-gradient(\"+b+\", \"+c+\" 0%, \"+d+\" 100%); \"})}function n(a){a.style.background=\"\";a.style.cssText+=\"background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);\";a.style.cssText+=\"background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);\";\na.style.cssText+=\"background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);\";a.style.cssText+=\"background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);\";a.style.cssText+=\"background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);\"}var h=function(e,l){function o(b){q(b);a.bind(window,\"mousemove\",q);a.bind(window,\n\"mouseup\",j)}function j(){a.unbind(window,\"mousemove\",q);a.unbind(window,\"mouseup\",j)}function g(){var a=d(this.value);a!==false?(p.__color.__state=a,p.setValue(p.__color.toOriginal())):this.value=p.__color.toString()}function i(){a.unbind(window,\"mousemove\",s);a.unbind(window,\"mouseup\",i)}function q(b){b.preventDefault();var c=a.getWidth(p.__saturation_field),d=a.getOffset(p.__saturation_field),e=(b.clientX-d.left+document.body.scrollLeft)/c,b=1-(b.clientY-d.top+document.body.scrollTop)/c;b>1?b=\n1:b<0&&(b=0);e>1?e=1:e<0&&(e=0);p.__color.v=b;p.__color.s=e;p.setValue(p.__color.toOriginal());return false}function s(b){b.preventDefault();var c=a.getHeight(p.__hue_field),d=a.getOffset(p.__hue_field),b=1-(b.clientY-d.top+document.body.scrollTop)/c;b>1?b=1:b<0&&(b=0);p.__color.h=b*360;p.setValue(p.__color.toOriginal());return false}h.superclass.call(this,e,l);this.__color=new c(this.getValue());this.__temp=new c(0);var p=this;this.domElement=document.createElement(\"div\");a.makeSelectable(this.domElement,\nfalse);this.__selector=document.createElement(\"div\");this.__selector.className=\"selector\";this.__saturation_field=document.createElement(\"div\");this.__saturation_field.className=\"saturation-field\";this.__field_knob=document.createElement(\"div\");this.__field_knob.className=\"field-knob\";this.__field_knob_border=\"2px solid \";this.__hue_knob=document.createElement(\"div\");this.__hue_knob.className=\"hue-knob\";this.__hue_field=document.createElement(\"div\");this.__hue_field.className=\"hue-field\";this.__input=\ndocument.createElement(\"input\");this.__input.type=\"text\";this.__input_textShadow=\"0 1px 1px \";a.bind(this.__input,\"keydown\",function(a){a.keyCode===13&&g.call(this)});a.bind(this.__input,\"blur\",g);a.bind(this.__selector,\"mousedown\",function(){a.addClass(this,\"drag\").bind(window,\"mouseup\",function(){a.removeClass(p.__selector,\"drag\")})});var t=document.createElement(\"div\");f.extend(this.__selector.style,{width:\"122px\",height:\"102px\",padding:\"3px\",backgroundColor:\"#222\",boxShadow:\"0px 1px 3px rgba(0,0,0,0.3)\"});\nf.extend(this.__field_knob.style,{position:\"absolute\",width:\"12px\",height:\"12px\",border:this.__field_knob_border+(this.__color.v<0.5?\"#fff\":\"#000\"),boxShadow:\"0px 1px 3px rgba(0,0,0,0.5)\",borderRadius:\"12px\",zIndex:1});f.extend(this.__hue_knob.style,{position:\"absolute\",width:\"15px\",height:\"2px\",borderRight:\"4px solid #fff\",zIndex:1});f.extend(this.__saturation_field.style,{width:\"100px\",height:\"100px\",border:\"1px solid #555\",marginRight:\"3px\",display:\"inline-block\",cursor:\"pointer\"});f.extend(t.style,\n{width:\"100%\",height:\"100%\",background:\"none\"});b(t,\"top\",\"rgba(0,0,0,0)\",\"#000\");f.extend(this.__hue_field.style,{width:\"15px\",height:\"100px\",display:\"inline-block\",border:\"1px solid #555\",cursor:\"ns-resize\"});n(this.__hue_field);f.extend(this.__input.style,{outline:\"none\",textAlign:\"center\",color:\"#fff\",border:0,fontWeight:\"bold\",textShadow:this.__input_textShadow+\"rgba(0,0,0,0.7)\"});a.bind(this.__saturation_field,\"mousedown\",o);a.bind(this.__field_knob,\"mousedown\",o);a.bind(this.__hue_field,\"mousedown\",\nfunction(b){s(b);a.bind(window,\"mousemove\",s);a.bind(window,\"mouseup\",i)});this.__saturation_field.appendChild(t);this.__selector.appendChild(this.__field_knob);this.__selector.appendChild(this.__saturation_field);this.__selector.appendChild(this.__hue_field);this.__hue_field.appendChild(this.__hue_knob);this.domElement.appendChild(this.__input);this.domElement.appendChild(this.__selector);this.updateDisplay()};h.superclass=e;f.extend(h.prototype,e.prototype,{updateDisplay:function(){var a=d(this.getValue());\nif(a!==false){var e=false;f.each(c.COMPONENTS,function(b){if(!f.isUndefined(a[b])&&!f.isUndefined(this.__color.__state[b])&&a[b]!==this.__color.__state[b])return e=true,{}},this);e&&f.extend(this.__color.__state,a)}f.extend(this.__temp.__state,this.__color.__state);this.__temp.a=1;var h=this.__color.v<0.5||this.__color.s>0.5?255:0,j=255-h;f.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+\"px\",marginTop:100*(1-this.__color.v)-7+\"px\",backgroundColor:this.__temp.toString(),border:this.__field_knob_border+\n\"rgb(\"+h+\",\"+h+\",\"+h+\")\"});this.__hue_knob.style.marginTop=(1-this.__color.h/360)*100+\"px\";this.__temp.s=1;this.__temp.v=1;b(this.__saturation_field,\"left\",\"#fff\",this.__temp.toString());f.extend(this.__input.style,{backgroundColor:this.__input.value=this.__color.toString(),color:\"rgb(\"+h+\",\"+h+\",\"+h+\")\",textShadow:this.__input_textShadow+\"rgba(\"+j+\",\"+j+\",\"+j+\",.7)\"})}});var j=[\"-moz-\",\"-o-\",\"-webkit-\",\"-ms-\",\"\"];return h}(dat.controllers.Controller,dat.dom.dom,dat.color.Color=function(e,a,c,d){function f(a,\nb,c){Object.defineProperty(a,b,{get:function(){if(this.__state.space===\"RGB\")return this.__state[b];n(this,b,c);return this.__state[b]},set:function(a){if(this.__state.space!==\"RGB\")n(this,b,c),this.__state.space=\"RGB\";this.__state[b]=a}})}function b(a,b){Object.defineProperty(a,b,{get:function(){if(this.__state.space===\"HSV\")return this.__state[b];h(this);return this.__state[b]},set:function(a){if(this.__state.space!==\"HSV\")h(this),this.__state.space=\"HSV\";this.__state[b]=a}})}function n(b,c,e){if(b.__state.space===\n\"HEX\")b.__state[c]=a.component_from_hex(b.__state.hex,e);else if(b.__state.space===\"HSV\")d.extend(b.__state,a.hsv_to_rgb(b.__state.h,b.__state.s,b.__state.v));else throw\"Corrupted color state\";}function h(b){var c=a.rgb_to_hsv(b.r,b.g,b.b);d.extend(b.__state,{s:c.s,v:c.v});if(d.isNaN(c.h)){if(d.isUndefined(b.__state.h))b.__state.h=0}else b.__state.h=c.h}var j=function(){this.__state=e.apply(this,arguments);if(this.__state===false)throw\"Failed to interpret color arguments\";this.__state.a=this.__state.a||\n1};j.COMPONENTS=\"r,g,b,h,s,v,hex,a\".split(\",\");d.extend(j.prototype,{toString:function(){return c(this)},toOriginal:function(){return this.__state.conversion.write(this)}});f(j.prototype,\"r\",2);f(j.prototype,\"g\",1);f(j.prototype,\"b\",0);b(j.prototype,\"h\");b(j.prototype,\"s\");b(j.prototype,\"v\");Object.defineProperty(j.prototype,\"a\",{get:function(){return this.__state.a},set:function(a){this.__state.a=a}});Object.defineProperty(j.prototype,\"hex\",{get:function(){if(!this.__state.space!==\"HEX\")this.__state.hex=\na.rgb_to_hex(this.r,this.g,this.b);return this.__state.hex},set:function(a){this.__state.space=\"HEX\";this.__state.hex=a}});return j}(dat.color.interpret,dat.color.math=function(){var e;return{hsv_to_rgb:function(a,c,d){var e=a/60-Math.floor(a/60),b=d*(1-c),n=d*(1-e*c),c=d*(1-(1-e)*c),a=[[d,c,b],[n,d,b],[b,d,c],[b,n,d],[c,b,d],[d,b,n]][Math.floor(a/60)%6];return{r:a[0]*255,g:a[1]*255,b:a[2]*255}},rgb_to_hsv:function(a,c,d){var e=Math.min(a,c,d),b=Math.max(a,c,d),e=b-e;if(b==0)return{h:NaN,s:0,v:0};\na=a==b?(c-d)/e:c==b?2+(d-a)/e:4+(a-c)/e;a/=6;a<0&&(a+=1);return{h:a*360,s:e/b,v:b/255}},rgb_to_hex:function(a,c,d){a=this.hex_with_component(0,2,a);a=this.hex_with_component(a,1,c);return a=this.hex_with_component(a,0,d)},component_from_hex:function(a,c){return a>>c*8&255},hex_with_component:function(a,c,d){return d<<(e=c*8)|a&~(255<<e)}}}(),dat.color.toString,dat.utils.common),dat.color.interpret,dat.utils.common),dat.utils.requestAnimationFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||\nwindow.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1E3/60)}}(),dat.dom.CenteredDiv=function(e,a){var c=function(){this.backgroundElement=document.createElement(\"div\");a.extend(this.backgroundElement.style,{backgroundColor:\"rgba(0,0,0,0.8)\",top:0,left:0,display:\"none\",zIndex:\"1000\",opacity:0,WebkitTransition:\"opacity 0.2s linear\"});e.makeFullscreen(this.backgroundElement);this.backgroundElement.style.position=\"fixed\";this.domElement=\ndocument.createElement(\"div\");a.extend(this.domElement.style,{position:\"fixed\",display:\"none\",zIndex:\"1001\",opacity:0,WebkitTransition:\"-webkit-transform 0.2s ease-out, opacity 0.2s linear\"});document.body.appendChild(this.backgroundElement);document.body.appendChild(this.domElement);var c=this;e.bind(this.backgroundElement,\"click\",function(){c.hide()})};c.prototype.show=function(){var c=this;this.backgroundElement.style.display=\"block\";this.domElement.style.display=\"block\";this.domElement.style.opacity=\n0;this.domElement.style.webkitTransform=\"scale(1.1)\";this.layout();a.defer(function(){c.backgroundElement.style.opacity=1;c.domElement.style.opacity=1;c.domElement.style.webkitTransform=\"scale(1)\"})};c.prototype.hide=function(){var a=this,c=function(){a.domElement.style.display=\"none\";a.backgroundElement.style.display=\"none\";e.unbind(a.domElement,\"webkitTransitionEnd\",c);e.unbind(a.domElement,\"transitionend\",c);e.unbind(a.domElement,\"oTransitionEnd\",c)};e.bind(this.domElement,\"webkitTransitionEnd\",\nc);e.bind(this.domElement,\"transitionend\",c);e.bind(this.domElement,\"oTransitionEnd\",c);this.backgroundElement.style.opacity=0;this.domElement.style.opacity=0;this.domElement.style.webkitTransform=\"scale(1.1)\"};c.prototype.layout=function(){this.domElement.style.left=window.innerWidth/2-e.getWidth(this.domElement)/2+\"px\";this.domElement.style.top=window.innerHeight/2-e.getHeight(this.domElement)/2+\"px\"};return c}(dat.dom.dom,dat.utils.common),dat.dom.dom,dat.utils.common);\nexports.dat = dat;})();\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/AssimpJSONLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/AssimpJSONLoader.js",
"module-type": "library",
"text": "/**\n * @author Alexander Gessler / http://www.greentoken.de/\n * https://github.com/acgessler\n *\n * Loader for models imported with Open Asset Import Library (http://assimp.sf.net)\n * through assimp2json (https://github.com/acgessler/assimp2json).\n *\n * Supports any input format that assimp supports, including 3ds, obj, dae, blend,\n * fbx, x, ms3d, lwo (and many more).\n *\n * See webgl_loader_assimp2json example.\n */\n\nTHREE.AssimpJSONLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n};\n\nTHREE.AssimpJSONLoader.prototype = {\n\n\tconstructor: THREE.AssimpJSONLoader,\n\n\ttexturePath : '',\n\n\tload: function ( url, onLoad, onProgress, onError, texturePath ) {\n var fonc = \"THREE.AssimpJSONLoader.load\";\n hack.log(\"url: \"+url+\": crossOrigin = \"+this.crossOrigin, hack.loader, fonc);\n\n\t\tvar scope = this;\n\n\t\tthis.texturePath = texturePath && ( typeof texturePath === \"string\" ) ? texturePath : this.extractUrlBase( url );\n\n\t\tvar loader = new THREE.XHRLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.load( url, function ( text ) {\n\t\t\tvar scene = scope.parse( JSON.parse( text ) );\n\t\t\tonLoad( scene );\n\t\t} );\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\t\tthis.crossOrigin = value;\n\t},\n\n\textractUrlBase: function ( url ) { // from three/src/loaders/Loader.js\n\t\tvar parts = url.split( '/' );\n\t\tparts.pop();\n\t\treturn ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';\n\t},\n\n\tparse: function ( json ) {\n\t\tvar meshes = this.parseList ( json.meshes, this.parseMesh );\n\t\tvar materials = this.parseList ( json.materials, this.parseMaterial );\n\t\treturn this.parseObject( json, json.rootnode, meshes, materials );\n\t},\n\n\tparseList : function(json, handler) {\n\t\tvar meshes = new Array(json.length);\n\t\tfor(var i = 0; i < json.length; ++i) {\n\t\t\tmeshes[i] = handler.call(this, json[i]);\n\t\t}\n\t\treturn meshes;\n\t},\n\n\tparseMesh : function(json) {\n\t\tvar vertex, geometry, i, e, in_data, src;\n\n\n\t\tgeometry = new THREE.Geometry();\n\n\t\t// read vertex positions\n\t\tfor(in_data = json.vertices, i = 0, e = in_data.length; i < e; ) {\n\t\t\tgeometry.vertices.push( new THREE.Vector3( in_data[ i++ ], in_data[ i++ ], in_data[ i++ ] ) );\n\t\t}\n\n\t\t// read faces\n\t\tvar cnt = 0;\n\t\tfor(in_data = json.faces, i = 0, e = in_data.length; i < e; ++i) {\n\t\t\tface = new THREE.Face3();\n\t\t\tsrc = in_data[i];\n\t\t\tface.a = src[0];\n\t\t\tface.b = src[1];\n\t\t\tface.c = src[2];\n\n\t\t\tface.materialIndex = 0; //json.materialindex;\n\t\t\tgeometry.faces.push(face);\n\t\t}\n\n\t\t// read texture coordinates - three.js attaches them to its faces\n\t\tjson.texturecoords = json.texturecoords || [];\n\t\tfor(i = 0, e = json.texturecoords.length; i < e; ++i) {\n\n\t\t\tfunction convertTextureCoords(in_uv, out_faces, out_vertex_uvs) {\n\t\t\t\tvar i, e, face, a, b, c;\n\n\t\t\t\tfor(i = 0, e = out_faces.length; i < e; ++i) {\n\t\t\t\t\tface = out_faces[i];\n\t\t\t\t\ta = face.a * 2;\n\t\t\t\t\tb = face.b * 2;\n\t\t\t\t\tc = face.c * 2;\n\t\t\t\t\tout_vertex_uvs.push([\n\t\t\t\t\t\tnew THREE.Vector2( in_uv[ a ], in_uv[ a + 1 ] ),\n\t\t\t\t\t\tnew THREE.Vector2( in_uv[ b ], in_uv[ b + 1 ] ),\n\t\t\t\t\t\tnew THREE.Vector2( in_uv[ c ], in_uv[ c + 1 ] )\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconvertTextureCoords(json.texturecoords[i], geometry.faces, geometry.faceVertexUvs[i]);\n\t\t}\n\n\t\t// read normals - three.js also attaches them to its faces\n\t\tif(json.normals) {\n\n\t\t\tfunction convertNormals(in_nor, out_faces) {\n\t\t\t\tvar i, e, face, a, b, c;\n\n\t\t\t\tfor(i = 0, e = out_faces.length; i < e; ++i) {\n\t\t\t\t\tface = out_faces[i];\n\t\t\t\t\ta = face.a * 3;\n\t\t\t\t\tb = face.b * 3;\n\t\t\t\t\tc = face.c * 3;\n\t\t\t\t\tface.vertexNormals = [\n\t\t\t\t\t\tnew THREE.Vector3( in_nor[ a ], in_nor[ a + 1 ], in_nor[ a + 2 ] ),\n\t\t\t\t\t\tnew THREE.Vector3( in_nor[ b ], in_nor[ b + 1 ], in_nor[ b + 2 ] ),\n\t\t\t\t\t\tnew THREE.Vector3( in_nor[ c ], in_nor[ c + 1 ], in_nor[ c + 2 ] )\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconvertNormals(json.normals, geometry.faces);\n\t\t}\n\n\t\t// read vertex colors - three.js also attaches them to its faces\n\t\tif(json.colors && json.colors[0]) {\n\n\t\t\tfunction convertColors(in_color, out_faces) {\n\t\t\t\tvar i, e, face, a, b, c;\n\n\t\t\t\tfunction makeColor(start) {\n\t\t\t\t\tvar col = new THREE.Color( );\n\t\t\t\t\tcol.setRGB( arr[0], arr[1], arr[2] );\n\t\t\t\t\t// TODO: what about alpha?\n\t\t\t\t\treturn col;\n\t\t\t\t}\n\n\t\t\t\tfor(i = 0, e = out_faces.length; i < e; ++i) {\n\t\t\t\t\tface = out_faces[i];\n\t\t\t\t\ta = face.a * 4;\n\t\t\t\t\tb = face.b * 4;\n\t\t\t\t\tc = face.c * 4;\n\t\t\t\t\tface.vertexColors = [\n\t\t\t\t\t\tmakeColor( a ),\n\t\t\t\t\t\tmakeColor( b ),\n\t\t\t\t\t\tmakeColor( c )\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconvertColors(json.colors[0], geometry.faces);\n\t\t}\n\n\n\t\t//geometry.computeFaceNormals();\n\t\t//geometry.computeVertexNormals();\n\t\t//geometry.computeTangents();\n\t\tgeometry.computeBoundingSphere();\n\n\t\t// TODO: tangents\n\t\treturn geometry;\n\t},\n\n\tparseMaterial : function(json) {\n var func = \"THREE.AssimpJSONLoader.parseMaterial\";\n // *tiddlywiki*\n // It seems that this algorithm has bugs !\n // Due to the fact that images are asynchronously loaded, it made the assumption\n // that textures are loaded after all json is parsed. With TiddlyWiki, it's not the\n // case because image Tiddler's file are immediately and synchronously loaded.\n // The result is that <mat> variable is null and clashes when the onLoad() callback of the\n // image loader tries to make something of the texture with <mat>.\n //\n // The fix : cancel the texture loading and wait till all json is parsed\n // and <mat> is initialized with a coherent THREE.MeshPhongMaterial instance. After\n // that, a second pass resumes the normal loading of the textures.\n\n\t\tvar mat = null, \n\t\tscope = this, i, prop, has_textures = [],\n\n\t\tinit_props = {\n\t\t\tshading : THREE.SmoothShading\n\t\t};\n\n\t\tfunction toColor(value_arr) {\n\t\t\tvar col = new THREE.Color();\n\t\t\tcol.setRGB(value_arr[0],value_arr[1],value_arr[2]);\n\t\t\treturn col;\n\t\t}\n\n\t\tfunction defaultTexture() {\n\t\t\tvar im = new Image();\n\t\t\tim.width = 1;\n\t\t\tim.height = 1;\n\t\t\treturn new THREE.Texture(im);\n\t\t}\n\n // *tiddlywiki*\n var flagTiddler = false;\n\n\t\tfor (var i in json.properties) {\n\t\t\tprop = json.properties[i];\n\n\t\t\tif(prop.key === '$tex.file') {\n\t\t\t\t// prop.semantic gives the type of the texture\n\t\t\t\t// 1: diffuse\n\t\t\t\t// 2: specular mao\n\t\t\t\t// 5: height map (bumps)\n\t\t\t\t// 6: normal map\n\t\t\t\t// more values (i.e. emissive, environment) are known by assimp and may be relevant\n\t\t\t\tif(prop.semantic === 1 || prop.semantic === 5 || prop.semantic === 6 || prop.semantic === 2) {\n\t\t\t\t\t(function(semantic) {\n\t\t\t\t\t\tvar loader = new THREE.TextureLoader(scope.manager),\n\t\t\t\t\t\tkeyname;\n\n\t\t\t\t\t\tif(semantic === 1) {\n\t\t\t\t\t\t\tkeyname = 'map';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(semantic === 5) {\n\t\t\t\t\t\t\tkeyname = 'bumpMap';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(semantic === 6) {\n\t\t\t\t\t\t\tkeyname = 'normalMap';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(semantic === 2) {\n\t\t\t\t\t\t\tkeyname = 'specularMap';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thas_textures.push(keyname);\n\n\t\t\t\t\t\tloader.setCrossOrigin(this.crossOrigin);\n\t\t\t\t\t\tvar material_url = scope.texturePath + '/' + prop.value\n\t\t\t\t\t\tmaterial_url = material_url.replace(/\\\\/g, '/');\n\n if (TiddlyWiki && material_url.match(/^tw:/)) {\n flagTiddler = true;\n hack.log(\"PASS 1: ignoring textures in tiddler's file\", hack.loader, func);\n return;\n }\n\t\t\t\t\t\tloader.load(material_url, function(tex) {\n\t\t\t\t\t\t\tif(tex) {\n\t\t\t\t\t\t\t\t// TODO: read texture settings from assimp.\n\t\t\t\t\t\t\t\t// Wrapping is the default, though.\n\t\t\t\t\t\t\t\ttex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n\n if (TiddlyWiki) {\n if (mat) {\n\t\t\t\t\t\t\t mat[keyname] = tex;\n\t\t\t\t\t\t\t mat.needsUpdate = true;\n }\n } else {\n\t\t\t\t\t\t\t\tmat[keyname] = tex;\n\t\t\t\t\t\t\t\tmat.needsUpdate = true;\n }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})(prop.semantic);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(prop.key === '?mat.name') {\n\t\t\t\tinit_props.name = prop.value;\n\t\t\t}\n\t\t\telse if(prop.key === '$clr.diffuse') {\n\t\t\t\tinit_props.color = toColor(prop.value);\n\t\t\t}\n\t\t\telse if(prop.key === '$clr.specular') {\n\t\t\t\tinit_props.specular = toColor(prop.value);\n\t\t\t}\n\t\t\telse if(prop.key === '$clr.ambient') {\n\t\t\t\tinit_props.ambient = toColor(prop.value);\n\t\t\t}\n\t\t\telse if(prop.key === '$clr.emissive') {\n\t\t\t\tinit_props.emissive = toColor(prop.value);\n\t\t\t}\n\t\t\telse if(prop.key === '$mat.shadingm') {\n\t\t\t\t// aiShadingMode_Flat\n\t\t\t\tif (prop.value === 1) {\n\t\t\t\t\tinit_props.shading = THREE.FlatShading;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (prop.key === '$mat.shininess') {\n\t\t\t\tinit_props.shininess = prop.value;\n\t\t\t}\n\t\t}\n\n\t\tif(!init_props.ambient) {\n\t\t\tinit_props.ambient = init_props.color;\n\t\t}\n\n\t\t// note: three.js does not like it when a texture is added after the geometry\n\t\t// has been rendered once, see http://stackoverflow.com/questions/16531759/.\n\t\t// for this reason we fill all slots upfront with default textures\n\t\tif(has_textures.length) {\n\t\t\tfor(i = has_textures.length-1; i >= 0; --i) {\n\t\t\t\tinit_props[has_textures[i]] = defaultTexture();\n\t\t\t}\n\t\t}\n\n mat = new THREE.MeshPhongMaterial( init_props );\n\n if (TiddlyWiki && flagTiddler) {\n // New pass to handle tiddler files\n hack.log(\"PASS 2: loading textures in tiddler's file\", hack.loader, func);\n\n\t has_textures = [];\n\n\t for (var i in json.properties) {\n\t prop = json.properties[i];\n\t if(prop.key === '$tex.file') {\n\t\t// prop.semantic gives the type of the texture\n\t\t// 1: diffuse\n\t\t// 2: specular mao\n\t\t// 5: height map (bumps)\n\t\t// 6: normal map\n\t\t// more values (i.e. emissive, environment) are known by assimp and may be relevant\n\t\tif(prop.semantic === 1 || prop.semantic === 5 || prop.semantic === 6 || prop.semantic === 2) {\n\t\t (function(semantic) {\n\t\t var loader = new THREE.TextureLoader(scope.manager), keyname;\n\t\t if(semantic === 1) keyname = 'map';\n\t\t else if(semantic === 5) keyname = 'bumpMap';\n\t\t else if(semantic === 6) keyname = 'normalMap';\n\t\t else if(semantic === 2) keyname = 'specularMap';\n\t\t has_textures.push(keyname);\n\t\t loader.setCrossOrigin(this.crossOrigin);\n\t\t var material_url = scope.texturePath + '/' + prop.value\n\t\t material_url = material_url.replace(/\\\\/g, '/');\n\t\t loader.load(material_url, function(tex) {\n\t\t if(tex) {\n\t\t\t// TODO: read texture settings from assimp.\n\t\t\t// Wrapping is the default, though.\n\t\t\ttex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n if (mat) {\n\t\t\t mat[keyname] = tex;\n\t\t\t mat.needsUpdate = true;\n }\n\t\t }\n\t\t });\n\t\t })(prop.semantic);\n\t\t}\n\t }\n }\n }\n \n\t return mat;\n\t},\n\n\tparseObject : function(json, node, meshes, materials) {\n\t\tvar obj = new THREE.Object3D()\n\t\t,\ti\n\t\t,\tidx\n\t\t;\n\n\t\tobj.name = node.name || \"\";\n\t\tobj.matrix = new THREE.Matrix4().fromArray(node.transformation).transpose();\n\t\tobj.matrix.decompose( obj.position, obj.quaternion, obj.scale );\n\n\t\tfor(i = 0; node.meshes && i < node.meshes.length; ++i) {\n\t\t\tidx = node.meshes[i];\n\t\t\tobj.add(new THREE.Mesh( meshes[idx], materials[json.meshes[idx].materialindex] ));\n\t\t}\n\n\t\tfor(i = 0; node.children && i < node.children.length; ++i) {\n\t\t\tobj.add(this.parseObject(json, node.children[i], meshes, materials));\n\t\t}\n\n\t\treturn obj;\n\t},\n};\n\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/AWDLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/AWDLoader.js",
"module-type": "library",
"text": "/**\n * Author: Pierre Lepers\n * Date: 09/12/2013 17:21\n */\n\nTHREE.AWDLoader = (function (){\n\n\n\n var UNCOMPRESSED = 0,\n DEFLATE = 1,\n LZMA = 2,\n\n AWD_FIELD_INT8 = 1,\n AWD_FIELD_INT16 = 2,\n AWD_FIELD_INT32 = 3,\n AWD_FIELD_UINT8 = 4,\n AWD_FIELD_UINT16 = 5,\n AWD_FIELD_UINT32 = 6,\n AWD_FIELD_FLOAT32 = 7,\n AWD_FIELD_FLOAT64 = 8,\n AWD_FIELD_BOOL = 21,\n AWD_FIELD_COLOR = 22,\n AWD_FIELD_BADDR = 23,\n AWD_FIELD_STRING = 31,\n AWD_FIELD_BYTEARRAY = 32,\n AWD_FIELD_VECTOR2x1 = 41,\n AWD_FIELD_VECTOR3x1 = 42,\n AWD_FIELD_VECTOR4x1 = 43,\n AWD_FIELD_MTX3x2 = 44,\n AWD_FIELD_MTX3x3 = 45,\n AWD_FIELD_MTX4x3 = 46,\n AWD_FIELD_MTX4x4 = 47,\n\n BOOL = 21,\n COLOR = 22,\n BADDR = 23,\n\n INT8 = 1,\n INT16 = 2,\n INT32 = 3,\n UINT8 = 4,\n UINT16 = 5,\n UINT32 = 6,\n FLOAT32 = 7,\n FLOAT64 = 8;\n\n\n var littleEndian = true;\n\n // ResourcesLoader\n // =============\n // handle loading for external resources\n function ResourcesLoader( awdUrl ){\n var func = \"THREE.AWDLoader.ResourcesLoader\";\n\n this._baseDir = awdUrl.substr( 0, awdUrl.lastIndexOf( '/' )+1 );\n\n this._loadingManager = new THREE.LoadingManager();\n\n }\n\n ResourcesLoader.prototype = {\n\n loadTexture : function( path ){\n var tex = new THREE.Texture();\n\n var loader = new THREE.ImageLoader( this._loadingManager );\n\n loader.load( this._baseDir+path, function( image ) {\n tex.image = image;\n tex.needsUpdate = true;\n });\n\n return tex;\n\n }\n }\n\n\n\n function Block(){\n this.id = 0;\n this.data = null;\n }\n\n\n\n function AWDLoader( showStatus ) {\n\n THREE.Loader.call( this, showStatus );\n\n this.trunk = new THREE.Object3D();\n\n this.materialFactory = undefined;\n\n this._resourceLoader = null;\n this._url = null;\n\n this._data;\n this._ptr = 0;\n\n this._version = [];\n this._streaming = false;\n this._optimized_for_accuracy = false;\n this._compression = 0;\n this._bodylen = 0xFFFFFFFF;\n\n\n this._blocks = [ new Block() ];\n\n this._accuracyMatrix = false;\n this._accuracyGeo = false;\n this._accuracyProps = false;\n\n\n };\n\n\n AWDLoader.prototype = new THREE.Loader();\n\n AWDLoader.prototype.constructor = AWDLoader;\n\n AWDLoader.prototype.load = function ( url, callback ) {\n var func = \"THREE.AWDLoader.load\";\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n this._url = url;\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.byteLength = \"+res.byteLength, hack.loader, func);\n this.parse(res);\n callback(this.trunk);\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n var that = this;\n this._url = url;\n var xhr = new XMLHttpRequest();\n xhr.open( \"GET\", url, true );\n xhr.responseType = 'arraybuffer';\n\n xhr.onreadystatechange = function () {\n\n if ( xhr.readyState == 4 ) {\n\n if ( xhr.status == 200 || xhr.status == 0 ) {\n that.parse( xhr.response );\n callback( that.trunk );\n\n } else {\n\n console.error( 'AWDLoader: Couldn\\'t load ' + url + ' (' + xhr.status + ')' );\n\n }\n\n }\n\n };\n\n xhr.send( null );\n\n };\n\n AWDLoader.prototype.parse = function ( data ) {\n var func = \"THREE.AWDLoader.parse\";\n\n var blen = data.byteLength;\n\n this._ptr = 0;\n this._data = new DataView( data );\n\n this._parseHeader( );\n\n if( this._compression != 0 ) {\n console.error( 'compressed AWD not supported' );\n }\n\n if (!this._streaming && this._bodylen != data.byteLength - this._ptr ) {\n console.error('AWDLoader: body len does not match file length', this._bodylen , blen - this._ptr);\n }\n\n while ( this._ptr < blen ) {\n this.parseNextBlock();\n }\n\n }\n\n\n\n AWDLoader.prototype.parseNextBlock = function ( ) {\n\n var assetData,\n ns, type, len, block,\n blockId = this.readU32(),\n ns = this.readU8(),\n type = this.readU8(),\n flags = this.readU8(),\n len = this.readU32();\n\n\n switch (type) {\n case 1:\n assetData = this.parseMeshData(len);\n break;\n case 22:\n assetData = this.parseContainer(len);\n break;\n case 23:\n assetData = this.parseMeshInstance(len);\n break;\n case 81:\n assetData = this.parseMaterial(len);\n break;\n case 82:\n assetData = this.parseTexture(len);\n break;\n case 101:\n assetData = this.parseSkeleton(len);\n break;\n\n// case 111:\n// assetData = this.parseMeshPoseAnimation(len, true);\n// break;\n case 112:\n assetData = this.parseMeshPoseAnimation(len, false);\n break;\n case 113:\n assetData = this.parseVertexAnimationSet(len);\n break;\n case 102:\n \tassetData = this.parseSkeletonPose(len);\n \tbreak;\n case 103:\n \tassetData = this.parseSkeletonAnimation(len);\n \tbreak;\n case 122:\n assetData = this.parseAnimatorSet(len);\n break;\n // case 121:\n // \tassetData = parseUVAnimation(len);\n // \tbreak;\n default:\n //debug('Ignoring block!',type, len);\n this._ptr += len;\n break;\n }\n\n\n // Store block reference for later use\n this._blocks[blockId] = block = new Block();\n block.data = assetData;\n block.id = blockId;\n\n }\n\n\n AWDLoader.prototype._parseHeader = function () {\n\n var version = this._version,\n awdmagic =\n ( this.readU8()<<16)\n | ( this.readU8()<<8 )\n | this.readU8();\n\n if( awdmagic != 4282180 )\n throw new Error( \"AWDLoader - bad magic\" );\n\n version[0] = this.readU8();\n version[1] = this.readU8();\n\n var flags = this.readU16();\n\n this._streaming = (flags & 0x1) == 0x1;\n\n if ((version[0] === 2) && (version[1] === 1)) {\n this._accuracyMatrix = (flags & 0x2) === 0x2;\n this._accuracyGeo = (flags & 0x4) === 0x4;\n this._accuracyProps = (flags & 0x8) === 0x8;\n }\n\n this._geoNrType = this._accuracyGeo ? FLOAT64 : FLOAT32;\n this._matrixNrType = this._accuracyMatrix ? FLOAT64 : FLOAT32;\n this._propsNrType = this._accuracyProps ? FLOAT64 : FLOAT32;\n\n this._optimized_for_accuracy \t= (flags & 0x2) === 0x2;\n\n this._compression = this.readU8();\n this._bodylen = this.readU32();\n\n\n }\n\n\n AWDLoader.prototype.parseContainer = function ( len ) {\n var parent,\n ctr = new THREE.Object3D(),\n par_id = this.readU32(),\n mtx = this.parseMatrix4();\n\n ctr.name = this.readUTF();\n ctr.applyMatrix( mtx );\n\n parent = this._blocks[par_id].data || this.trunk;\n parent.add(ctr);\n\n this.parseProperties({\n 1:this._matrixNrType,\n 2:this._matrixNrType,\n 3:this._matrixNrType,\n 4:UINT8\n });\n\n ctr.extra = this.parseUserAttributes();\n\n return ctr;\n }\n\n\n\n AWDLoader.prototype.parseMeshInstance = function ( len ) {\n var name,\n mesh, geometries, meshLen, meshes,\n par_id, data_id,\n mtx,\n materials, mat, mat_id,\n num_materials,\n materials_parsed,\n parent,\n i;\n\n par_id = this.readU32();\n mtx = this.parseMatrix4();\n name = this.readUTF();\n data_id = this.readU32();\n num_materials = this.readU16();\n\n geometries = this.getBlock( data_id );\n\n materials = [];\n materials_parsed = 0;\n\n for ( i = 0; i < num_materials; i++) {\n mat_id = this.readU32();\n mat = this.getBlock( mat_id );\n materials.push( mat );\n }\n\n\n\n meshLen = geometries.length\n meshes = [];\n\n // TODO : BufferGeometry don't support \"geometryGroups\" for now.\n // so we create sub meshes for each groups\n if( meshLen > 1 ) {\n mesh = new THREE.Object3D()\n for ( i = 0; i < meshLen; i++) {\n var sm = new THREE.Mesh( geometries[i] );\n meshes.push( sm );\n mesh.add( sm );\n }\n }\n else {\n mesh = new THREE.Mesh( geometries[0] );\n meshes.push( mesh );\n }\n\n mesh.applyMatrix( mtx );\n mesh.name = name;\n\n\n parent = this.getBlock( par_id ) || this.trunk;\n parent.add( mesh );\n\n\n var matLen = materials.length;\n var maxLen = Math.max( meshLen, matLen);\n for( i = 0; i< maxLen; i++ )\n meshes[ i%meshLen ].material = materials[ i % matLen ];\n\n\n // Ignore for now\n this.parseProperties( null );\n mesh.extra = this.parseUserAttributes();\n\n return mesh;\n }\n\n\n\n AWDLoader.prototype.parseMaterial = function ( len ) {\n var name,\n type,\n props,\n mat,\n attributes,\n finalize,\n num_methods,\n methods_parsed;\n\n name = this.readUTF();\n type = this.readU8();\n num_methods = this.readU8();\n\n //log( \"AWDLoader parseMaterial \",name )\n\n // Read material numerical properties\n // (1=color, 2=bitmap url, 11=alpha_blending, 12=alpha_threshold, 13=repeat)\n props = this.parseProperties({\n 1: AWD_FIELD_INT32,\n 2: AWD_FIELD_BADDR,\n 11: AWD_FIELD_BOOL,\n 12: AWD_FIELD_FLOAT32,\n 13: AWD_FIELD_BOOL\n });\n\n methods_parsed = 0;\n\n while( methods_parsed < num_methods ) {\n var method_type = this.readU16();\n this.parseProperties( null );\n this.parseUserAttributes();\n }\n\n attributes = this.parseUserAttributes();\n\n if( this.materialFactory !== undefined ) {\n mat = this.materialFactory( name );\n if( mat ) return mat;\n }\n\n mat = new THREE.MeshPhongMaterial();\n\n if (type === 1) { // Color material\n mat.color.setHex( props.get(1, 0xcccccc) );\n }\n else if (type === 2) { // Bitmap material\n var tex_addr = props.get(2, 0);\n mat.map = this.getBlock( tex_addr );\n }\n\n mat.extra = attributes;\n mat.alphaThreshold = props.get(12, 0.0);\n mat.repeat = props.get(13, false);\n\n\n return mat;\n }\n\n\n\n\n AWDLoader.prototype.parseTexture = function( len ) {\n\n\n var name = this.readUTF(),\n type = this.readU8(),\n asset,\n data_len;\n\n // External\n if (type === 0) {\n data_len = this.readU32();\n var url = this.readUTFBytes(data_len);\n console.log( url );\n\n asset = this.loadTexture( url );\n } else {\n // embed texture not supported\n }\n // Ignore for now\n this.parseProperties( null );\n\n this.parseUserAttributes();\n return asset;\n }\n\n AWDLoader.prototype.loadTexture = function( url ) {\n var func = \"AWDLoader.loadTexture\";\n\n if( null === this._resourceLoader )\n this._resourceLoader = new ResourcesLoader( this._url );\n\n return this._resourceLoader.loadTexture( url );\n }\n\n // broken : skeleton pose format is different than threejs one\n AWDLoader.prototype.parseSkeleton = function(len) // Array<Bone>\n {\n var name = this.readUTF(),\n num_joints = this.readU16(),\n skeleton = [],\n joints_parsed = 0;\n\n this.parseProperties( null );\n\n while (joints_parsed < num_joints) {\n var joint, ibp;\n\n // Ignore joint id\n this.readU16();\n\n joint = new THREE.Bone();\n joint.parent = this.readU16() - 1; // 0=null in AWD\n joint.name = this.readUTF();\n\n ibp = this.parseMatrix4();\n joint.skinMatrix = ibp;\n\n // Ignore joint props/attributes for now\n this.parseProperties(null);\n this.parseUserAttributes();\n\n skeleton.push(joint);\n joints_parsed++;\n }\n\n // Discard attributes for now\n this.parseUserAttributes();\n\n\n return skeleton;\n }\n\n\n\n AWDLoader.prototype.parseSkeletonPose = function(blockID)\n {\n var name = this.readUTF();\n\n\n var num_joints = this.readU16();\n this.parseProperties(null);\n\n // debug( 'parse Skeleton Pose. joints : ' + num_joints);\n\n var pose = [];\n\n var joints_parsed = 0;\n\n while (joints_parsed < num_joints) {\n\n var joint_pose;\n\n var has_transform; //:uint;\n var mtx_data;\n\n has_transform = this.readU8();\n\n if (has_transform === 1) {\n mtx_data = this.parseMatrix4();\n } else\n {\n mtx_data = new THREE.Matrix4();\n }\n pose[joints_parsed] = mtx_data;\n joints_parsed++;\n }\n // Skip attributes for now\n this.parseUserAttributes();\n\n return pose\n }\n\n AWDLoader.prototype.parseSkeletonAnimation = function(blockID)\n {\n var frame_dur;\n var pose_addr;\n var pose;\n\n var name = this.readUTF();\n\n var clip = [];\n\n var num_frames = this.readU16();\n this.parseProperties(null);\n\n var frames_parsed = 0;\n var returnedArray;\n\n\n // debug( 'parse Skeleton Animation. frames : ' + num_frames);\n\n while (frames_parsed < num_frames) {\n pose_addr = this.readU32();\n frame_dur = this.readU16();\n\n pose = this._blocks[pose_addr].data\n // debug( 'pose address ',pose[2].elements[12],pose[2].elements[13],pose[2].elements[14] );\n clip.push( {\n pose : pose,\n duration : frame_dur\n } );\n\n frames_parsed++;\n }\n if (clip.length == 0) {\n // debug(\"Could not this SkeletonClipNode, because no Frames where set.\");\n return;\n }\n // Ignore attributes for now\n this.parseUserAttributes();\n return clip;\n }\n\n\n\n AWDLoader.prototype.parseVertexAnimationSet = function(len)\n {\n var poseBlockAdress,\n name = this.readUTF(),\n num_frames = this.readU16(),\n props = this.parseProperties({1:UINT16}),\n frames_parsed = 0,\n skeletonFrames = [];\n\n while (frames_parsed < num_frames) {\n poseBlockAdress = this.readU32();\n skeletonFrames.push(this._blocks[poseBlockAdress].data);\n frames_parsed++;\n }\n\n this.parseUserAttributes();\n\n\n return skeletonFrames;\n }\n\n\n AWDLoader.prototype.parseAnimatorSet = function(len)\n {\n var targetMesh;\n\n var animSetBlockAdress; //:int\n\n var targetAnimationSet; //:AnimationSetBase;\n var outputString = \"\"; //:String = \"\";\n var name = this.readUTF();\n var type = this.readU16();\n\n var props = this.parseProperties({1:BADDR});\n\n animSetBlockAdress = this.readU32();\n var targetMeshLength = this.readU16();\n\n var meshAdresses = []; //:Vector.<uint> = new Vector.<uint>;\n\n for (var i = 0; i < targetMeshLength; i++)\n meshAdresses.push( this.readU32() );\n\n var activeState = this.readU16();\n var autoplay = Boolean(this.readU8());\n this.parseUserAttributes();\n this.parseUserAttributes();\n\n var returnedArray;\n var targetMeshes = []; //:Vector.<Mesh> = new Vector.<Mesh>;\n\n for (i = 0; i < meshAdresses.length; i++) {\n// returnedArray = getAssetByID(meshAdresses[i], [AssetType.MESH]);\n// if (returnedArray[0])\n targetMeshes.push(this._blocks[meshAdresses[i]].data);\n }\n\n targetAnimationSet = this._blocks[animSetBlockAdress].data\n var thisAnimator;\n\n if (type == 1) {\n\n\n thisAnimator = {\n animationSet : targetAnimationSet,\n skeleton : this._blocks[props.get(1, 0)].data\n };\n\n } else if (type == 2) {\n // debug( \"vertex Anim???\");\n }\n\n\n for (i = 0; i < targetMeshes.length; i++) {\n targetMeshes[i].animator = thisAnimator;\n }\n // debug(\"Parsed a Animator: Name = \" + name);\n\n return thisAnimator;\n }\n\n\n\n\n\n\n\n AWDLoader.prototype.parseMeshData = function ( len ) {\n\n var name = this.readUTF(),\n num_subs = this.readU16(),\n geom,\n subs_parsed = 0,\n props,\n buffer,\n skinW, skinI,\n geometries = [];\n\n\n\n\n props = this.parseProperties({\n 1: this._geoNrType,\n 2: this._geoNrType\n });\n\n\n\n // Loop through sub meshes\n while (subs_parsed < num_subs) {\n\n var sm_len, sm_end, attrib;\n\n geom = new THREE.BufferGeometry();\n geom.name = name;\n geometries.push( geom );\n\n\n sm_len = this.readU32();\n sm_end = this._ptr + sm_len;\n\n\n // Ignore for now\n this.parseProperties({1:this._geoNrType, 2:this._geoNrType});\n\n // Loop through data streams\n while ( this._ptr < sm_end ) {\n\n\n var idx = 0,\n str_type = this.readU8(),\n str_ftype = this.readU8(),\n str_len = this.readU32(),\n str_end = str_len + this._ptr;\n\n\n\n\n\n // VERTICES\n // ------------------\n if ( str_type === 1 ) {\n\n buffer = new Float32Array( ( str_len / 12 ) * 3 );\n attrib = new THREE.BufferAttribute( buffer, 3 );\n\n geom.addAttribute( 'position', attrib );\n idx = 0;\n\n while (this._ptr < str_end) {\n buffer[idx] = -this.readF32();\n buffer[idx+1] = this.readF32();\n buffer[idx+2] = this.readF32();\n idx+=3;\n }\n }\n\n\n // INDICES\n // -----------------\n else if (str_type === 2) {\n\n buffer = new Uint16Array( str_len / 2 );\n attrib = new THREE.BufferAttribute( buffer, 1 );\n geom.addAttribute( 'index', attrib );\n\n geom.offsets.push({\n start: 0,\n index: 0,\n count: str_len/2\n });\n\n idx = 0;\n\n while (this._ptr < str_end) {\n buffer[idx+1] = this.readU16();\n buffer[idx] = this.readU16();\n buffer[idx+2] = this.readU16();\n idx+=3;\n }\n }\n\n // UVS\n // -------------------\n else if (str_type === 3) {\n\n buffer = new Float32Array( ( str_len / 8 ) * 2 );\n attrib = new THREE.BufferAttribute( buffer, 2 );\n\n geom.addAttribute( 'uv', attrib );\n idx = 0;\n\n while (this._ptr < str_end) {\n buffer[idx] = this.readF32();\n buffer[idx+1] = 1.0-this.readF32();\n idx+=2;\n }\n }\n\n // NORMALS\n else if (str_type === 4) {\n\n buffer = new Float32Array( ( str_len / 12 ) * 3 );\n attrib = new THREE.BufferAttribute( buffer, 3 );\n geom.addAttribute( 'normal', attrib );\n idx = 0;\n\n while (this._ptr < str_end) {\n buffer[idx] = -this.readF32();\n buffer[idx+1] = this.readF32();\n buffer[idx+2] = this.readF32();\n idx+=3;\n }\n\n }\n\n // else if (str_type == 6) {\n // skinI = new Float32Array( str_len>>1 );\n // idx = 0\n\n // while (this._ptr < str_end) {\n // skinI[idx] = this.readU16();\n // idx++;\n // }\n\n // }\n // else if (str_type == 7) {\n // skinW = new Float32Array( str_len>>2 );\n // idx = 0;\n\n // while (this._ptr < str_end) {\n // skinW[idx] = this.readF32();\n // idx++;\n // }\n // }\n else {\n this._ptr = str_end;\n }\n\n\n\n }\n\n this.parseUserAttributes();\n\n\n geom.computeBoundingSphere();\n subs_parsed++;\n }\n\n\n //geom.computeFaceNormals();\n\n\n this.parseUserAttributes();\n //finalizeAsset(geom, name);\n\n return geometries;\n }\n\n AWDLoader.prototype.parseMeshPoseAnimation = function(len, poseOnly)\n {\n var num_frames = 1,\n num_submeshes,\n frames_parsed,\n subMeshParsed,\n frame_dur,\n x, y, z,\n\n str_len,\n str_end,\n geom,\n subGeom,\n idx = 0,\n clip = {},\n indices,\n verts,\n num_Streams,\n streamsParsed,\n streamtypes = [],\n\n props,\n thisGeo,\n name = this.readUTF(),\n geoAdress = this.readU32();\n\n\n var mesh = this.getBlock( geoAdress );\n\n if (mesh == null) {\n console.log( \"parseMeshPoseAnimation target mesh not found at:\", geoAdress );\n return;\n }\n\n geom = mesh.geometry;\n geom.morphTargets = [];\n\n if (!poseOnly)\n num_frames = this.readU16();\n\n num_submeshes = this.readU16();\n num_Streams = this.readU16();\n\n // debug(\"VA num_frames : \", num_frames );\n // debug(\"VA num_submeshes : \", num_submeshes );\n // debug(\"VA numstreams : \", num_Streams );\n\n streamsParsed = 0;\n while (streamsParsed < num_Streams) {\n streamtypes.push(this.readU16());\n streamsParsed++;\n }\n props = this.parseProperties({1:BOOL, 2:BOOL});\n\n clip.looping = props.get(1, true);\n clip.stitchFinalFrame = props.get(2, false);\n\n frames_parsed = 0;\n\n while (frames_parsed < num_frames) {\n\n frame_dur = this.readU16();\n subMeshParsed = 0;\n\n while (subMeshParsed < num_submeshes) {\n\n streamsParsed = 0;\n str_len = this.readU32();\n str_end = this._ptr + str_len;\n\n while (streamsParsed < num_Streams) {\n\n if (streamtypes[streamsParsed] == 1) {\n\n //geom.addAttribute( 'morphTarget'+frames_parsed, Float32Array, str_len/12, 3 );\n var buffer = new Float32Array(str_len/4);\n geom.morphTargets.push( {\n array : buffer\n });\n\n //buffer = geom.attributes['morphTarget'+frames_parsed].array\n idx = 0;\n\n while ( this._ptr < str_end ) {\n buffer[idx] = this.readF32();\n buffer[idx+1] = this.readF32();\n buffer[idx+2] = this.readF32();\n idx += 3;\n }\n\n\n subMeshParsed++;\n } else\n this._ptr = str_end;\n streamsParsed++;\n }\n }\n\n\n frames_parsed++;\n }\n this.parseUserAttributes();\n\n return null;\n }\n\n\n\n\n\n\n\n\n\n AWDLoader.prototype.getBlock = function ( id ) {\n return this._blocks[id].data;\n },\n\n\n AWDLoader.prototype.parseMatrix4 = function ( ) {\n var mtx = new THREE.Matrix4();\n var e = mtx.elements;\n\n e[0] = this.readF32();\n e[1] = this.readF32();\n e[2] = this.readF32();\n e[3] = 0.0;\n //e[3] = 0.0;\n\n e[4] = this.readF32();\n e[5] = this.readF32();\n e[6] = this.readF32();\n //e[7] = this.readF32();\n e[7] = 0.0;\n\n e[8] = this.readF32();\n e[9] = this.readF32();\n e[10] = this.readF32();\n //e[11] = this.readF32();\n e[11] = 0.0;\n\n e[12] = -this.readF32();\n e[13] = this.readF32();\n e[14] = this.readF32();\n //e[15] = this.readF32();\n e[15] = 1.0;\n return mtx;\n }\n\n\n AWDLoader.prototype.parseProperties = function ( expected ) {\n var list_len = this.readU32();\n var list_end = this._ptr + list_len;\n\n var props = new AWDProperties();\n\n if( expected ) {\n\n while( this._ptr < list_end ) {\n\n var key = this.readU16();\n var len = this.readU32();\n var type;\n\n if( expected.hasOwnProperty( key ) ) {\n type = expected[ key ];\n props.set( key, this.parseAttrValue( type, len ) );\n } else {\n this._ptr += len;\n }\n }\n\n }\n\n return props;\n\n };\n\n\n AWDLoader.prototype.parseUserAttributes = function ( ) {\n // skip for now\n this._ptr = this.readU32() + this._ptr;\n return null;\n };\n\n\n AWDLoader.prototype.parseAttrValue = function ( type, len ) {\n\n var elem_len;\n var read_func;\n\n switch (type) {\n case AWD_FIELD_INT8:\n elem_len = 1;\n read_func = this.readI8;\n break;\n case AWD_FIELD_INT16:\n elem_len = 2;\n read_func = this.readI16;\n break;\n case AWD_FIELD_INT32:\n elem_len = 4;\n read_func = this.readI32;\n break;\n case AWD_FIELD_BOOL:\n case AWD_FIELD_UINT8:\n elem_len = 1;\n read_func = this.readU8;\n break;\n case AWD_FIELD_UINT16:\n elem_len = 2;\n read_func = this.readU16;\n break;\n case AWD_FIELD_UINT32:\n case AWD_FIELD_BADDR:\n elem_len = 4;\n read_func = this.readU32;\n break;\n case AWD_FIELD_FLOAT32:\n elem_len = 4;\n read_func = this.readF32;\n break;\n case AWD_FIELD_FLOAT64:\n elem_len = 8;\n read_func = this.readF64;\n break;\n case AWD_FIELD_VECTOR2x1:\n case AWD_FIELD_VECTOR3x1:\n case AWD_FIELD_VECTOR4x1:\n case AWD_FIELD_MTX3x2:\n case AWD_FIELD_MTX3x3:\n case AWD_FIELD_MTX4x3:\n case AWD_FIELD_MTX4x4:\n elem_len = 8;\n read_func = this.readF64;\n break;\n }\n\n if (elem_len < len) {\n var list;\n var num_read;\n var num_elems;\n\n list = [];\n num_read = 0;\n num_elems = len / elem_len;\n\n while (num_read < num_elems) {\n list.push(read_func.call( this ) );\n num_read++;\n }\n\n return list;\n }\n else {\n return read_func.call( this );\n }\n\n }\n\n\n AWDLoader.prototype.readU8 = function () {\n return this._data.getUint8( this._ptr++ );\n }\n AWDLoader.prototype.readI8 = function () {\n return this._data.getInt8( this._ptr++ );\n }\n\n AWDLoader.prototype.readU16 = function () {\n var a = this._data.getUint16( this._ptr, littleEndian );\n this._ptr += 2;\n return a;\n }\n AWDLoader.prototype.readI16 = function () {\n var a = this._data.getInt16( this._ptr, littleEndian );\n this._ptr += 2;\n return a;\n }\n\n AWDLoader.prototype.readU32 = function () {\n var a = this._data.getUint32( this._ptr, littleEndian );\n this._ptr += 4;\n return a;\n }\n AWDLoader.prototype.readI32 = function () {\n var a = this._data.getInt32( this._ptr, littleEndian );\n this._ptr += 4;\n return a;\n }\n AWDLoader.prototype.readF32 = function () {\n var a = this._data.getFloat32( this._ptr, littleEndian );\n this._ptr += 4;\n return a;\n }\n AWDLoader.prototype.readF64 = function () {\n var a = this._data.getFloat64( this._ptr, littleEndian );\n this._ptr += 8;\n return a;\n }\n\n\n /**\n * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode.\n * @param {Array.<number>} bytes UTF-8 byte array.\n * @return {string} 16-bit Unicode string.\n */\n AWDLoader.prototype.readUTF = function () {\n var len = this.readU16();\n\n return this.readUTFBytes( len );\n };\n\n /**\n * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode.\n * @param {Array.<number>} bytes UTF-8 byte array.\n * @return {string} 16-bit Unicode string.\n */\n AWDLoader.prototype.readUTFBytes = function ( len ) {\n\n\n // TODO(user): Use native implementations if/when available\n\n var out = [], c = 0;\n\n while ( out.length < len ) {\n var c1 = this._data.getUint8( this._ptr++, littleEndian );\n if (c1 < 128) {\n out[c++] = String.fromCharCode(c1);\n } else if (c1 > 191 && c1 < 224) {\n var c2 = this._data.getUint8( this._ptr++, littleEndian );\n out[c++] = String.fromCharCode((c1 & 31) << 6 | c2 & 63);\n } else {\n var c2 = this._data.getUint8( this._ptr++, littleEndian );\n var c3 = this._data.getUint8( this._ptr++, littleEndian );\n out[c++] = String.fromCharCode(\n (c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63\n );\n }\n }\n return out.join('');\n };\n\n\n\n\n\n\n\n\n\n AWDProperties = function(){}\n\n AWDProperties.prototype = {\n\n\n set : function(key, value)\n {\n this[key] = value;\n },\n\n get : function(key, fallback)\n {\n if ( this.hasOwnProperty(key) )\n return this[key];\n else return fallback;\n }\n }\n\n return AWDLoader;\n\n})();\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/BinaryLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/BinaryLoader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BinaryLoader = function ( showStatus ) {\n\n\tTHREE.Loader.call( this, showStatus );\n\n};\n\nTHREE.BinaryLoader.prototype = Object.create( THREE.Loader.prototype );\n\n// Load models generated by slim OBJ converter with BINARY option (converter_obj_three_slim.py -t binary)\n// - binary models consist of two files: JS and BIN\n// - parameters\n//\t\t- url (required)\n//\t\t- callback (required)\n//\t\t- texturePath (optional: if not specified, textures will be assumed to be in the same folder as JS model file)\n//\t\t- binaryPath (optional: if not specified, binary file will be assumed to be in the same folder as JS model file)\n\nTHREE.BinaryLoader.prototype.load = function ( url, callback, texturePath, binaryPath ) {\n\n\t// todo: unify load API to for easier SceneLoader use\n\n\ttexturePath = texturePath || this.extractUrlBase( url );\n\tbinaryPath = binaryPath || this.extractUrlBase( url );\n\n\tvar callbackProgress = this.showProgress ? THREE.Loader.prototype.updateProgress : undefined;\n\n\tthis.onLoadStart();\n\n\t// #1 load JS part via web worker\n\n\tthis.loadAjaxJSON( this, url, callback, texturePath, binaryPath, callbackProgress );\n\n};\n\nTHREE.BinaryLoader.prototype.loadAjaxJSON = function ( context, url, callback, texturePath, binaryPath, callbackProgress ) {\n var func = \"THREE.BinaryLoader.loadAjaxJSON\";\n\n\ttexturePath = texturePath && ( typeof texturePath === \"string\" ) ? texturePath : this.extractUrlBase( url );\n\tbinaryPath = binaryPath && ( typeof binaryPath === \"string\" ) ? binaryPath : this.extractUrlBase( url );\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\n var json = JSON.parse(res);\n context.loadAjaxBuffers(json, callback, binaryPath, texturePath, callbackProgress);\n\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\tvar xhr = new XMLHttpRequest();\n\n\txhr.onreadystatechange = function () {\n\n\t\tif ( xhr.readyState == 4 ) {\n\n\t\t\tif ( xhr.status == 200 || xhr.status == 0 ) {\n\n\t\t\t\tvar json = JSON.parse( xhr.responseText );\n\t\t\t\tcontext.loadAjaxBuffers( json, callback, binaryPath, texturePath, callbackProgress );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.BinaryLoader: Couldn't load [\" + url + \"] [\" + xhr.status + \"]\" );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\txhr.open( \"GET\", url, true );\n\txhr.send( null );\n\n};\n\nTHREE.BinaryLoader.prototype.loadAjaxBuffers = function ( json, callback, binaryPath, texturePath, callbackProgress ) {\n var func = \"THREE.BinaryLoader.loadAjaxBuffers\";\n\n var url = binaryPath + json.buffers;\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\n this.createBinModel(res, callback, texturePath, json.materials);\n\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\tvar scope = this;\n\n\tvar xhr = new XMLHttpRequest(),\n\t\turl = binaryPath + json.buffers;\n\n\txhr.addEventListener( 'load', function ( event ) {\n\n\t\tvar buffer = xhr.response;\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\t// IEWEBGL needs this\n\t\t\tbuffer = ( new Uint8Array( xhr.responseBody ) ).buffer;\n\n\t\t}\n\n\t\tif ( buffer.byteLength == 0 ) { // iOS and other XMLHttpRequest level 1\n\n\t\t\tvar buffer = new ArrayBuffer( xhr.responseText.length );\n\n\t\t\tvar bufView = new Uint8Array( buffer );\n\n\t\t\tfor ( var i = 0, l = xhr.responseText.length; i < l; i ++ ) {\n\n\t\t\t\tbufView[ i ] = xhr.responseText.charCodeAt( i ) & 0xff;\n\n\t\t\t}\n\n\t\t}\n\n\t\tscope.createBinModel( buffer, callback, texturePath, json.materials );\n\n\t}, false );\n\n\tif ( callbackProgress !== undefined ) {\n\n\t\txhr.addEventListener( 'progress', function ( event ) {\n\n\t\t\tif ( event.lengthComputable ) {\n\n\t\t\t\tcallbackProgress( event );\n\n\t\t\t}\n\n\t\t}, false );\n\n\t}\n\n\txhr.addEventListener( 'error', function ( event ) {\n\n\t\tconsole.error( \"THREE.BinaryLoader: Couldn't load [\" + url + \"] [\" + xhr.status + \"]\" );\n\n\t}, false );\n\n\n\txhr.open( \"GET\", url, true );\n\txhr.responseType = \"arraybuffer\";\n\tif ( xhr.overrideMimeType ) xhr.overrideMimeType( \"text/plain; charset=x-user-defined\" );\n\txhr.send( null );\n\n};\n\n// Binary AJAX parser\n\nTHREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texturePath, jsonMaterials ) {\n\n\tvar Model = function ( texturePath ) {\n\n\t\tvar scope = this,\n\t\t\tcurrentOffset = 0,\n\t\t\tmd,\n\t\t\tnormals = [],\n\t\t\tuvs = [],\n\t\t\tstart_tri_flat, start_tri_smooth, start_tri_flat_uv, start_tri_smooth_uv,\n\t\t\tstart_quad_flat, start_quad_smooth, start_quad_flat_uv, start_quad_smooth_uv,\n\t\t\ttri_size, quad_size,\n\t\t\tlen_tri_flat, len_tri_smooth, len_tri_flat_uv, len_tri_smooth_uv,\n\t\t\tlen_quad_flat, len_quad_smooth, len_quad_flat_uv, len_quad_smooth_uv;\n\n\n\t\tTHREE.Geometry.call( this );\n\n\t\tmd = parseMetaData( data, currentOffset );\n\n\t\tcurrentOffset += md.header_bytes;\n/*\n\t\tmd.vertex_index_bytes = Uint32Array.BYTES_PER_ELEMENT;\n\t\tmd.material_index_bytes = Uint16Array.BYTES_PER_ELEMENT;\n\t\tmd.normal_index_bytes = Uint32Array.BYTES_PER_ELEMENT;\n\t\tmd.uv_index_bytes = Uint32Array.BYTES_PER_ELEMENT;\n*/\n\t\t// buffers sizes\n\n\t\ttri_size = md.vertex_index_bytes * 3 + md.material_index_bytes;\n\t\tquad_size = md.vertex_index_bytes * 4 + md.material_index_bytes;\n\n\t\tlen_tri_flat = md.ntri_flat * ( tri_size );\n\t\tlen_tri_smooth = md.ntri_smooth * ( tri_size + md.normal_index_bytes * 3 );\n\t\tlen_tri_flat_uv = md.ntri_flat_uv * ( tri_size + md.uv_index_bytes * 3 );\n\t\tlen_tri_smooth_uv = md.ntri_smooth_uv * ( tri_size + md.normal_index_bytes * 3 + md.uv_index_bytes * 3 );\n\n\t\tlen_quad_flat = md.nquad_flat * ( quad_size );\n\t\tlen_quad_smooth = md.nquad_smooth * ( quad_size + md.normal_index_bytes * 4 );\n\t\tlen_quad_flat_uv = md.nquad_flat_uv * ( quad_size + md.uv_index_bytes * 4 );\n\t\tlen_quad_smooth_uv = md.nquad_smooth_uv * ( quad_size + md.normal_index_bytes * 4 + md.uv_index_bytes * 4 );\n\n\t\t// read buffers\n\n\t\tcurrentOffset += init_vertices( currentOffset );\n\n\t\tcurrentOffset += init_normals( currentOffset );\n\t\tcurrentOffset += handlePadding( md.nnormals * 3 );\n\n\t\tcurrentOffset += init_uvs( currentOffset );\n\n\t\tstart_tri_flat \t\t= currentOffset;\n\t\tstart_tri_smooth = start_tri_flat + len_tri_flat + handlePadding( md.ntri_flat * 2 );\n\t\tstart_tri_flat_uv = start_tri_smooth + len_tri_smooth + handlePadding( md.ntri_smooth * 2 );\n\t\tstart_tri_smooth_uv = start_tri_flat_uv + len_tri_flat_uv + handlePadding( md.ntri_flat_uv * 2 );\n\n\t\tstart_quad_flat = start_tri_smooth_uv + len_tri_smooth_uv + handlePadding( md.ntri_smooth_uv * 2 );\n\t\tstart_quad_smooth = start_quad_flat + len_quad_flat\t + handlePadding( md.nquad_flat * 2 );\n\t\tstart_quad_flat_uv = start_quad_smooth + len_quad_smooth + handlePadding( md.nquad_smooth * 2 );\n\t\tstart_quad_smooth_uv= start_quad_flat_uv + len_quad_flat_uv + handlePadding( md.nquad_flat_uv * 2 );\n\n\t\t// have to first process faces with uvs\n\t\t// so that face and uv indices match\n\n\t\tinit_triangles_flat_uv( start_tri_flat_uv );\n\t\tinit_triangles_smooth_uv( start_tri_smooth_uv );\n\n\t\tinit_quads_flat_uv( start_quad_flat_uv );\n\t\tinit_quads_smooth_uv( start_quad_smooth_uv );\n\n\t\t// now we can process untextured faces\n\n\t\tinit_triangles_flat( start_tri_flat );\n\t\tinit_triangles_smooth( start_tri_smooth );\n\n\t\tinit_quads_flat( start_quad_flat );\n\t\tinit_quads_smooth( start_quad_smooth );\n\n\t\tthis.computeFaceNormals();\n\n\t\tfunction handlePadding( n ) {\n\n\t\t\treturn ( n % 4 ) ? ( 4 - n % 4 ) : 0;\n\n\t\t};\n\n\t\tfunction parseMetaData( data, offset ) {\n\n\t\t\tvar metaData = {\n\n\t\t\t\t'signature' :parseString( data, offset, 12 ),\n\t\t\t\t'header_bytes' :parseUChar8( data, offset + 12 ),\n\n\t\t\t\t'vertex_coordinate_bytes' :parseUChar8( data, offset + 13 ),\n\t\t\t\t'normal_coordinate_bytes' :parseUChar8( data, offset + 14 ),\n\t\t\t\t'uv_coordinate_bytes' :parseUChar8( data, offset + 15 ),\n\n\t\t\t\t'vertex_index_bytes' :parseUChar8( data, offset + 16 ),\n\t\t\t\t'normal_index_bytes' :parseUChar8( data, offset + 17 ),\n\t\t\t\t'uv_index_bytes' :parseUChar8( data, offset + 18 ),\n\t\t\t\t'material_index_bytes' :parseUChar8( data, offset + 19 ),\n\n\t\t\t\t'nvertices' :parseUInt32( data, offset + 20 ),\n\t\t\t\t'nnormals' :parseUInt32( data, offset + 20 + 4*1 ),\n\t\t\t\t'nuvs' :parseUInt32( data, offset + 20 + 4*2 ),\n\n\t\t\t\t'ntri_flat' :parseUInt32( data, offset + 20 + 4*3 ),\n\t\t\t\t'ntri_smooth' :parseUInt32( data, offset + 20 + 4*4 ),\n\t\t\t\t'ntri_flat_uv' :parseUInt32( data, offset + 20 + 4*5 ),\n\t\t\t\t'ntri_smooth_uv' :parseUInt32( data, offset + 20 + 4*6 ),\n\n\t\t\t\t'nquad_flat' :parseUInt32( data, offset + 20 + 4*7 ),\n\t\t\t\t'nquad_smooth' :parseUInt32( data, offset + 20 + 4*8 ),\n\t\t\t\t'nquad_flat_uv' :parseUInt32( data, offset + 20 + 4*9 ),\n\t\t\t\t'nquad_smooth_uv' :parseUInt32( data, offset + 20 + 4*10 )\n\n\t\t\t};\n/*\n\t\t\tconsole.log( \"signature: \" + metaData.signature );\n\n\t\t\tconsole.log( \"header_bytes: \" + metaData.header_bytes );\n\t\t\tconsole.log( \"vertex_coordinate_bytes: \" + metaData.vertex_coordinate_bytes );\n\t\t\tconsole.log( \"normal_coordinate_bytes: \" + metaData.normal_coordinate_bytes );\n\t\t\tconsole.log( \"uv_coordinate_bytes: \" + metaData.uv_coordinate_bytes );\n\n\t\t\tconsole.log( \"vertex_index_bytes: \" + metaData.vertex_index_bytes );\n\t\t\tconsole.log( \"normal_index_bytes: \" + metaData.normal_index_bytes );\n\t\t\tconsole.log( \"uv_index_bytes: \" + metaData.uv_index_bytes );\n\t\t\tconsole.log( \"material_index_bytes: \" + metaData.material_index_bytes );\n\n\t\t\tconsole.log( \"nvertices: \" + metaData.nvertices );\n\t\t\tconsole.log( \"nnormals: \" + metaData.nnormals );\n\t\t\tconsole.log( \"nuvs: \" + metaData.nuvs );\n\n\t\t\tconsole.log( \"ntri_flat: \" + metaData.ntri_flat );\n\t\t\tconsole.log( \"ntri_smooth: \" + metaData.ntri_smooth );\n\t\t\tconsole.log( \"ntri_flat_uv: \" + metaData.ntri_flat_uv );\n\t\t\tconsole.log( \"ntri_smooth_uv: \" + metaData.ntri_smooth_uv );\n\n\t\t\tconsole.log( \"nquad_flat: \" + metaData.nquad_flat );\n\t\t\tconsole.log( \"nquad_smooth: \" + metaData.nquad_smooth );\n\t\t\tconsole.log( \"nquad_flat_uv: \" + metaData.nquad_flat_uv );\n\t\t\tconsole.log( \"nquad_smooth_uv: \" + metaData.nquad_smooth_uv );\n\n\t\t\tvar total = metaData.header_bytes\n\t\t\t\t\t + metaData.nvertices * metaData.vertex_coordinate_bytes * 3\n\t\t\t\t\t + metaData.nnormals * metaData.normal_coordinate_bytes * 3\n\t\t\t\t\t + metaData.nuvs * metaData.uv_coordinate_bytes * 2\n\t\t\t\t\t + metaData.ntri_flat * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes )\n\t\t\t\t\t + metaData.ntri_smooth * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 )\n\t\t\t\t\t + metaData.ntri_flat_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.uv_index_bytes*3 )\n\t\t\t\t\t + metaData.ntri_smooth_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 + metaData.uv_index_bytes*3 )\n\t\t\t\t\t + metaData.nquad_flat * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes )\n\t\t\t\t\t + metaData.nquad_smooth * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 )\n\t\t\t\t\t + metaData.nquad_flat_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.uv_index_bytes*4 )\n\t\t\t\t\t + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 );\n\t\t\tconsole.log( \"total bytes: \" + total );\n*/\n\n\t\t\treturn metaData;\n\n\t\t};\n\n\t\tfunction parseString( data, offset, length ) {\n\n\t\t\tvar charArray = new Uint8Array( data, offset, length );\n\n\t\t\tvar text = \"\";\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\ttext += String.fromCharCode( charArray[ offset + i ] );\n\n\t\t\t}\n\n\t\t\treturn text;\n\n\t\t};\n\n\t\tfunction parseUChar8( data, offset ) {\n\n\t\t\tvar charArray = new Uint8Array( data, offset, 1 );\n\n\t\t\treturn charArray[ 0 ];\n\n\t\t};\n\n\t\tfunction parseUInt32( data, offset ) {\n\n\t\t\tvar intArray = new Uint32Array( data, offset, 1 );\n\n\t\t\treturn intArray[ 0 ];\n\n\t\t};\n\n\t\tfunction init_vertices( start ) {\n\n\t\t\tvar nElements = md.nvertices;\n\n\t\t\tvar coordArray = new Float32Array( data, start, nElements * 3 );\n\n\t\t\tvar i, x, y, z;\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\tx = coordArray[ i * 3 ];\n\t\t\t\ty = coordArray[ i * 3 + 1 ];\n\t\t\t\tz = coordArray[ i * 3 + 2 ];\n\n\t\t\t\tscope.vertices.push( new THREE.Vector3( x, y, z ) );\n\n\t\t\t}\n\n\t\t\treturn nElements * 3 * Float32Array.BYTES_PER_ELEMENT;\n\n\t\t};\n\n\t\tfunction init_normals( start ) {\n\n\t\t\tvar nElements = md.nnormals;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar normalArray = new Int8Array( data, start, nElements * 3 );\n\n\t\t\t\tvar i, x, y, z;\n\n\t\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\t\tx = normalArray[ i * 3 ];\n\t\t\t\t\ty = normalArray[ i * 3 + 1 ];\n\t\t\t\t\tz = normalArray[ i * 3 + 2 ];\n\n\t\t\t\t\tnormals.push( x/127, y/127, z/127 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn nElements * 3 * Int8Array.BYTES_PER_ELEMENT;\n\n\t\t};\n\n\t\tfunction init_uvs( start ) {\n\n\t\t\tvar nElements = md.nuvs;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar uvArray = new Float32Array( data, start, nElements * 2 );\n\n\t\t\t\tvar i, u, v;\n\n\t\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\t\tu = uvArray[ i * 2 ];\n\t\t\t\t\tv = uvArray[ i * 2 + 1 ];\n\n\t\t\t\t\tuvs.push( u, v );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn nElements * 2 * Float32Array.BYTES_PER_ELEMENT;\n\n\t\t};\n\n\t\tfunction init_uvs3( nElements, offset ) {\n\n\t\t\tvar i, uva, uvb, uvc, u1, u2, u3, v1, v2, v3;\n\n\t\t\tvar uvIndexBuffer = new Uint32Array( data, offset, 3 * nElements );\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\tuva = uvIndexBuffer[ i * 3 ];\n\t\t\t\tuvb = uvIndexBuffer[ i * 3 + 1 ];\n\t\t\t\tuvc = uvIndexBuffer[ i * 3 + 2 ];\n\n\t\t\t\tu1 = uvs[ uva*2 ];\n\t\t\t\tv1 = uvs[ uva*2 + 1 ];\n\n\t\t\t\tu2 = uvs[ uvb*2 ];\n\t\t\t\tv2 = uvs[ uvb*2 + 1 ];\n\n\t\t\t\tu3 = uvs[ uvc*2 ];\n\t\t\t\tv3 = uvs[ uvc*2 + 1 ];\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\n\t\t\t\t\tnew THREE.Vector2( u1, v1 ),\n\t\t\t\t\tnew THREE.Vector2( u2, v2 ),\n\t\t\t\t\tnew THREE.Vector2( u3, v3 )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_uvs4( nElements, offset ) {\n\n\t\t\tvar i, uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;\n\n\t\t\tvar uvIndexBuffer = new Uint32Array( data, offset, 4 * nElements );\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\tuva = uvIndexBuffer[ i * 4 ];\n\t\t\t\tuvb = uvIndexBuffer[ i * 4 + 1 ];\n\t\t\t\tuvc = uvIndexBuffer[ i * 4 + 2 ];\n\t\t\t\tuvd = uvIndexBuffer[ i * 4 + 3 ];\n\n\t\t\t\tu1 = uvs[ uva*2 ];\n\t\t\t\tv1 = uvs[ uva*2 + 1 ];\n\n\t\t\t\tu2 = uvs[ uvb*2 ];\n\t\t\t\tv2 = uvs[ uvb*2 + 1 ];\n\n\t\t\t\tu3 = uvs[ uvc*2 ];\n\t\t\t\tv3 = uvs[ uvc*2 + 1 ];\n\n\t\t\t\tu4 = uvs[ uvd*2 ];\n\t\t\t\tv4 = uvs[ uvd*2 + 1 ];\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\n\t\t\t\t\tnew THREE.Vector2( u1, v1 ),\n\t\t\t\t\tnew THREE.Vector2( u2, v2 ),\n\t\t\t\t\tnew THREE.Vector2( u4, v4 )\n\t\t\t\t] );\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\n\t\t\t\t\tnew THREE.Vector2( u2, v2 ),\n\t\t\t\t\tnew THREE.Vector2( u3, v3 ),\n\t\t\t\t\tnew THREE.Vector2( u4, v4 )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_faces3_flat( nElements, offsetVertices, offsetMaterials ) {\n\n\t\t\tvar i, a, b, c, m;\n\n\t\t\tvar vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );\n\t\t\tvar materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\ta = vertexIndexBuffer[ i * 3 ];\n\t\t\t\tb = vertexIndexBuffer[ i * 3 + 1 ];\n\t\t\t\tc = vertexIndexBuffer[ i * 3 + 2 ];\n\n\t\t\t\tm = materialIndexBuffer[ i ];\n\n\t\t\t\tscope.faces.push( new THREE.Face3( a, b, c, null, null, m ) );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_faces4_flat( nElements, offsetVertices, offsetMaterials ) {\n\n\t\t\tvar i, a, b, c, d, m;\n\n\t\t\tvar vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );\n\t\t\tvar materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\ta = vertexIndexBuffer[ i * 4 ];\n\t\t\t\tb = vertexIndexBuffer[ i * 4 + 1 ];\n\t\t\t\tc = vertexIndexBuffer[ i * 4 + 2 ];\n\t\t\t\td = vertexIndexBuffer[ i * 4 + 3 ];\n\n\t\t\t\tm = materialIndexBuffer[ i ];\n\n\t\t\t\tscope.faces.push( new THREE.Face3( a, b, d, null, null, m ) );\n\t\t\t\tscope.faces.push( new THREE.Face3( b, c, d, null, null, m ) );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_faces3_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {\n\n\t\t\tvar i, a, b, c, m;\n\t\t\tvar na, nb, nc;\n\n\t\t\tvar vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );\n\t\t\tvar normalIndexBuffer = new Uint32Array( data, offsetNormals, 3 * nElements );\n\t\t\tvar materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\ta = vertexIndexBuffer[ i * 3 ];\n\t\t\t\tb = vertexIndexBuffer[ i * 3 + 1 ];\n\t\t\t\tc = vertexIndexBuffer[ i * 3 + 2 ];\n\n\t\t\t\tna = normalIndexBuffer[ i * 3 ];\n\t\t\t\tnb = normalIndexBuffer[ i * 3 + 1 ];\n\t\t\t\tnc = normalIndexBuffer[ i * 3 + 2 ];\n\n\t\t\t\tm = materialIndexBuffer[ i ];\n\n\t\t\t\tvar nax = normals[ na*3 ],\n\t\t\t\t\tnay = normals[ na*3 + 1 ],\n\t\t\t\t\tnaz = normals[ na*3 + 2 ],\n\n\t\t\t\t\tnbx = normals[ nb*3 ],\n\t\t\t\t\tnby = normals[ nb*3 + 1 ],\n\t\t\t\t\tnbz = normals[ nb*3 + 2 ],\n\n\t\t\t\t\tncx = normals[ nc*3 ],\n\t\t\t\t\tncy = normals[ nc*3 + 1 ],\n\t\t\t\t\tncz = normals[ nc*3 + 2 ];\n\n\t\t\t\tscope.faces.push( new THREE.Face3( a, b, c, [\n\t\t\t\t\tnew THREE.Vector3( nax, nay, naz ),\n\t\t\t\t\tnew THREE.Vector3( nbx, nby, nbz ),\n\t\t\t\t\tnew THREE.Vector3( ncx, ncy, ncz )\n\t\t\t\t], null, m ) );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_faces4_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {\n\n\t\t\tvar i, a, b, c, d, m;\n\t\t\tvar na, nb, nc, nd;\n\n\t\t\tvar vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );\n\t\t\tvar normalIndexBuffer = new Uint32Array( data, offsetNormals, 4 * nElements );\n\t\t\tvar materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );\n\n\t\t\tfor( i = 0; i < nElements; i ++ ) {\n\n\t\t\t\ta = vertexIndexBuffer[ i * 4 ];\n\t\t\t\tb = vertexIndexBuffer[ i * 4 + 1 ];\n\t\t\t\tc = vertexIndexBuffer[ i * 4 + 2 ];\n\t\t\t\td = vertexIndexBuffer[ i * 4 + 3 ];\n\n\t\t\t\tna = normalIndexBuffer[ i * 4 ];\n\t\t\t\tnb = normalIndexBuffer[ i * 4 + 1 ];\n\t\t\t\tnc = normalIndexBuffer[ i * 4 + 2 ];\n\t\t\t\tnd = normalIndexBuffer[ i * 4 + 3 ];\n\n\t\t\t\tm = materialIndexBuffer[ i ];\n\n\t\t\t\tvar nax = normals[ na*3 ],\n\t\t\t\t\tnay = normals[ na*3 + 1 ],\n\t\t\t\t\tnaz = normals[ na*3 + 2 ],\n\n\t\t\t\t\tnbx = normals[ nb*3 ],\n\t\t\t\t\tnby = normals[ nb*3 + 1 ],\n\t\t\t\t\tnbz = normals[ nb*3 + 2 ],\n\n\t\t\t\t\tncx = normals[ nc*3 ],\n\t\t\t\t\tncy = normals[ nc*3 + 1 ],\n\t\t\t\t\tncz = normals[ nc*3 + 2 ],\n\n\t\t\t\t\tndx = normals[ nd*3 ],\n\t\t\t\t\tndy = normals[ nd*3 + 1 ],\n\t\t\t\t\tndz = normals[ nd*3 + 2 ];\n\n\t\t\t\tscope.faces.push( new THREE.Face3( a, b, d, [\n\t\t\t\t\tnew THREE.Vector3( nax, nay, naz ),\n\t\t\t\t\tnew THREE.Vector3( nbx, nby, nbz ),\n\t\t\t\t\tnew THREE.Vector3( ndx, ndy, ndz )\n\t\t\t\t], null, m ) );\n\n\t\t\t\tscope.faces.push( new THREE.Face3( b, c, d, [\n\t\t\t\t\tnew THREE.Vector3( nbx, nby, nbz ),\n\t\t\t\t\tnew THREE.Vector3( ncx, ncy, ncz ),\n\t\t\t\t\tnew THREE.Vector3( ndx, ndy, ndz )\n\t\t\t\t], null, m ) );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_triangles_flat( start ) {\n\n\t\t\tvar nElements = md.ntri_flat;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\t\t\t\tinit_faces3_flat( nElements, start, offsetMaterials );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_triangles_flat_uv( start ) {\n\n\t\t\tvar nElements = md.ntri_flat_uv;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\t\t\t\tvar offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\n\t\t\t\tinit_faces3_flat( nElements, start, offsetMaterials );\n\t\t\t\tinit_uvs3( nElements, offsetUvs );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_triangles_smooth( start ) {\n\n\t\t\tvar nElements = md.ntri_smooth;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\t\t\t\tvar offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\n\t\t\t\tinit_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_triangles_smooth_uv( start ) {\n\n\t\t\tvar nElements = md.ntri_smooth_uv;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\t\t\t\tvar offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\t\t\t\tvar offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;\n\n\t\t\t\tinit_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );\n\t\t\t\tinit_uvs3( nElements, offsetUvs );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_quads_flat( start ) {\n\n\t\t\tvar nElements = md.nquad_flat;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\t\t\t\tinit_faces4_flat( nElements, start, offsetMaterials );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_quads_flat_uv( start ) {\n\n\t\t\tvar nElements = md.nquad_flat_uv;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\t\t\t\tvar offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\n\t\t\t\tinit_faces4_flat( nElements, start, offsetMaterials );\n\t\t\t\tinit_uvs4( nElements, offsetUvs );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_quads_smooth( start ) {\n\n\t\t\tvar nElements = md.nquad_smooth;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\t\t\t\tvar offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\n\t\t\t\tinit_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction init_quads_smooth_uv( start ) {\n\n\t\t\tvar nElements = md.nquad_smooth_uv;\n\n\t\t\tif ( nElements ) {\n\n\t\t\t\tvar offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\t\t\t\tvar offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\t\t\t\tvar offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;\n\n\t\t\t\tinit_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );\n\t\t\t\tinit_uvs4( nElements, offsetUvs );\n\n\t\t\t}\n\n\t\t};\n\n\t};\n\n\tModel.prototype = Object.create( THREE.Geometry.prototype );\n\n\tvar geometry = new Model( texturePath );\n\tvar materials = this.initMaterials( jsonMaterials, texturePath );\n\n\tif ( this.needsTangents( materials ) ) geometry.computeTangents();\n\n\tcallback( geometry, materials );\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/ColladaLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/ColladaLoader.js",
"module-type": "library",
"text": "/**\n* @author Tim Knip / http://www.floorplanner.com/ / tim at floorplanner.com\n* @author Tony Parisi / http://www.tonyparisi.com/\n*/\n\nTHREE.ColladaLoader = function () {\n\n\tvar COLLADA = null;\n\tvar scene = null;\n\tvar daeScene;\n\n\tvar readyCallbackFunc = null;\n\n\tvar sources = {};\n\tvar images = {};\n\tvar animations = {};\n\tvar controllers = {};\n\tvar geometries = {};\n\tvar materials = {};\n\tvar effects = {};\n\tvar cameras = {};\n\tvar lights = {};\n\n\tvar animData;\n\tvar visualScenes;\n\tvar baseUrl;\n\tvar morphs;\n\tvar skins;\n\n\tvar flip_uv = true;\n\tvar preferredShading = THREE.SmoothShading;\n\n\tvar options = {\n\t\t// Force Geometry to always be centered at the local origin of the\n\t\t// containing Mesh.\n\t\tcenterGeometry: false,\n\n\t\t// Axis conversion is done for geometries, animations, and controllers.\n\t\t// If we ever pull cameras or lights out of the COLLADA file, they'll\n\t\t// need extra work.\n\t\tconvertUpAxis: false,\n\n\t\tsubdivideFaces: true,\n\n\t\tupAxis: 'Y',\n\n\t\t// For reflective or refractive materials we'll use this cubemap\n\t\tdefaultEnvMap: null\n\n\t};\n\n\tvar colladaUnit = 1.0;\n\tvar colladaUp = 'Y';\n\tvar upConversion = null;\n\n\tfunction load ( url, readyCallback, progressCallback ) {\n var func = \"THREE.ColladaLoader.load\";\n\n\t\tvar length = 0;\n\n\t\tif ( document.implementation && document.implementation.createDocument ) {\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n this._url = url;\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.byteLength = \"+res.byteLength, hack.loader, func);\n //hack.log(\"res = \"+res, hack.loader, func);\n\t\t readyCallbackFunc = readyCallback;\n\t\t var xmlParser = new DOMParser();\n\t\t var responseXML = xmlParser.parseFromString(res, \"application/xml\" );\n\t\t parse(responseXML, undefined, url);\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\t\t\tvar request = new XMLHttpRequest();\n\n\t\t\trequest.onreadystatechange = function() {\n\n\t\t\t\tif( request.readyState == 4 ) {\n\n\t\t\t\t\tif( request.status == 0 || request.status == 200 ) {\n\n\n\t\t\t\t\t\tif ( request.responseXML ) {\n\n\t\t\t\t\t\t\treadyCallbackFunc = readyCallback;\n\t\t\t\t\t\t\tparse( request.responseXML, undefined, url );\n\n\t\t\t\t\t\t} else if ( request.responseText ) {\n\n\t\t\t\t\t\t\treadyCallbackFunc = readyCallback;\n\t\t\t\t\t\t\tvar xmlParser = new DOMParser();\n\t\t\t\t\t\t\tvar responseXML = xmlParser.parseFromString( request.responseText, \"application/xml\" );\n\t\t\t\t\t\t\tparse( responseXML, undefined, url );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.error( \"ColladaLoader: Empty or non-existing file (\" + url + \")\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( request.readyState == 3 ) {\n\n\t\t\t\t\tif ( progressCallback ) {\n\n\t\t\t\t\t\tif ( length == 0 ) {\n\n\t\t\t\t\t\t\tlength = request.getResponseHeader( \"Content-Length\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprogressCallback( { total: length, loaded: request.responseText.length } );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\trequest.open( \"GET\", url, true );\n\t\t\trequest.send( null );\n\n\t\t} else {\n\n\t\t\talert( \"Don't know how to parse XML!\" );\n\n\t\t}\n\n\t}\n\n\tfunction parse( doc, callBack, url ) {\n\n\t\tCOLLADA = doc;\n\t\tcallBack = callBack || readyCallbackFunc;\n\n\t\tif ( url !== undefined ) {\n\n\t\t\tvar parts = url.split( '/' );\n\t\t\tparts.pop();\n\t\t\tbaseUrl = ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';\n\n\t\t}\n\n\t\tparseAsset();\n\t\tsetUpConversion();\n\t\timages = parseLib( \"library_images image\", _Image, \"image\" );\n\t\tmaterials = parseLib( \"library_materials material\", Material, \"material\" );\n\t\teffects = parseLib( \"library_effects effect\", Effect, \"effect\" );\n\t\tgeometries = parseLib( \"library_geometries geometry\", Geometry, \"geometry\" );\n\t\tcameras = parseLib( \"library_cameras camera\", Camera, \"camera\" );\n\t\tlights = parseLib( \"library_lights light\", Light, \"light\" );\n\t\tcontrollers = parseLib( \"library_controllers controller\", Controller, \"controller\" );\n\t\tanimations = parseLib( \"library_animations animation\", Animation, \"animation\" );\n\t\tvisualScenes = parseLib( \"library_visual_scenes visual_scene\", VisualScene, \"visual_scene\" );\n\n\t\tmorphs = [];\n\t\tskins = [];\n\n\t\tdaeScene = parseScene();\n\t\tscene = new THREE.Object3D();\n\n\t\tfor ( var i = 0; i < daeScene.nodes.length; i ++ ) {\n\n\t\t\tscene.add( createSceneGraph( daeScene.nodes[ i ] ) );\n\n\t\t}\n\n\t\t// unit conversion\n\t\tscene.scale.multiplyScalar( colladaUnit );\n\n\t\tcreateAnimations();\n\n\t\tvar result = {\n\n\t\t\tscene: scene,\n\t\t\tmorphs: morphs,\n\t\t\tskins: skins,\n\t\t\tanimations: animData,\n\t\t\tdae: {\n\t\t\t\timages: images,\n\t\t\t\tmaterials: materials,\n\t\t\t\tcameras: cameras,\n\t\t\t\tlights: lights,\n\t\t\t\teffects: effects,\n\t\t\t\tgeometries: geometries,\n\t\t\t\tcontrollers: controllers,\n\t\t\t\tanimations: animations,\n\t\t\t\tvisualScenes: visualScenes,\n\t\t\t\tscene: daeScene\n\t\t\t}\n\n\t\t};\n\n\t\tif ( callBack ) {\n\n\t\t\tcallBack( result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction setPreferredShading ( shading ) {\n\n\t\tpreferredShading = shading;\n\n\t}\n\n\tfunction parseAsset () {\n\n\t\tvar elements = COLLADA.querySelectorAll('asset');\n\n\t\tvar element = elements[0];\n\n\t\tif ( element && element.childNodes ) {\n\n\t\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'unit':\n\n\t\t\t\t\t\tvar meter = child.getAttribute( 'meter' );\n\n\t\t\t\t\t\tif ( meter ) {\n\n\t\t\t\t\t\t\tcolladaUnit = parseFloat( meter );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'up_axis':\n\n\t\t\t\t\t\tcolladaUp = child.textContent.charAt(0);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction parseLib ( q, classSpec, prefix ) {\n\n\t\tvar elements = COLLADA.querySelectorAll(q);\n\n\t\tvar lib = {};\n\n\t\tvar i = 0;\n\n\t\tvar elementsLength = elements.length;\n\n\t\tfor ( var j = 0; j < elementsLength; j ++ ) {\n\n\t\t\tvar element = elements[j];\n\t\t\tvar daeElement = ( new classSpec() ).parse( element );\n\n\t\t\tif ( !daeElement.id || daeElement.id.length == 0 ) daeElement.id = prefix + ( i ++ );\n\t\t\tlib[ daeElement.id ] = daeElement;\n\n\t\t}\n\n\t\treturn lib;\n\n\t}\n\n\tfunction parseScene() {\n\n\t\tvar sceneElement = COLLADA.querySelectorAll('scene instance_visual_scene')[0];\n\t\tif ( sceneElement ) {\n\n\t\t\tvar url = sceneElement.getAttribute( 'url' ).replace( /^#/, '' );\n\t\t\treturn visualScenes[ url.length > 0 ? url : 'visual_scene0' ];\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\tfunction createAnimations() {\n\n\t\tanimData = [];\n\n\t\t// fill in the keys\n\t\trecurseHierarchy( scene );\n\n\t}\n\n\tfunction recurseHierarchy( node ) {\n\n\t\tvar n = daeScene.getChildById( node.id, true ),\n\t\t\tnewData = null;\n\n\t\tif ( n && n.keys ) {\n\n\t\t\tnewData = {\n\t\t\t\tfps: 60,\n\t\t\t\thierarchy: [ {\n\t\t\t\t\tnode: n,\n\t\t\t\t\tkeys: n.keys,\n\t\t\t\t\tsids: n.sids\n\t\t\t\t} ],\n\t\t\t\tnode: node,\n\t\t\t\tname: 'animation_' + node.name,\n\t\t\t\tlength: 0\n\t\t\t};\n\n\t\t\tanimData.push(newData);\n\n\t\t\tfor ( var i = 0, il = n.keys.length; i < il; i++ ) {\n\n\t\t\t\tnewData.length = Math.max( newData.length, n.keys[i].time );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tnewData = {\n\t\t\t\thierarchy: [ {\n\t\t\t\t\tkeys: [],\n\t\t\t\t\tsids: []\n\t\t\t\t} ]\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0, il = node.children.length; i < il; i++ ) {\n\n\t\t\tvar d = recurseHierarchy( node.children[i] );\n\n\t\t\tfor ( var j = 0, jl = d.hierarchy.length; j < jl; j ++ ) {\n\n\t\t\t\tnewData.hierarchy.push( {\n\t\t\t\t\tkeys: [],\n\t\t\t\t\tsids: []\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn newData;\n\n\t}\n\n\tfunction calcAnimationBounds () {\n\n\t\tvar start = 1000000;\n\t\tvar end = -start;\n\t\tvar frames = 0;\n\t\tvar ID;\n\t\tfor ( var id in animations ) {\n\n\t\t\tvar animation = animations[ id ];\n\t\t\tID = ID || animation.id;\n\t\t\tfor ( var i = 0; i < animation.sampler.length; i ++ ) {\n\n\t\t\t\tvar sampler = animation.sampler[ i ];\n\n\t\t\t\tsampler.create();\n\n\t\t\t\tstart = Math.min( start, sampler.startTime );\n\t\t\t\tend = Math.max( end, sampler.endTime );\n\t\t\t\tframes = Math.max( frames, sampler.input.length );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn { start:start, end:end, frames:frames,ID:ID };\n\n\t}\n\n\tfunction createMorph ( geometry, ctrl ) {\n\n\t\tvar morphCtrl = ctrl instanceof InstanceController ? controllers[ ctrl.url ] : ctrl;\n\n\t\tif ( !morphCtrl || !morphCtrl.morph ) {\n\n\t\t\tconsole.log(\"could not find morph controller!\");\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar morph = morphCtrl.morph;\n\n\t\tfor ( var i = 0; i < morph.targets.length; i ++ ) {\n\n\t\t\tvar target_id = morph.targets[ i ];\n\t\t\tvar daeGeometry = geometries[ target_id ];\n\n\t\t\tif ( !daeGeometry.mesh ||\n\t\t\t\t !daeGeometry.mesh.primitives ||\n\t\t\t\t !daeGeometry.mesh.primitives.length ) {\n\t\t\t\t continue;\n\t\t\t}\n\n\t\t\tvar target = daeGeometry.mesh.primitives[ 0 ].geometry;\n\n\t\t\tif ( target.vertices.length === geometry.vertices.length ) {\n\n\t\t\t\tgeometry.morphTargets.push( { name: \"target_1\", vertices: target.vertices } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.morphTargets.push( { name: \"target_Z\", vertices: geometry.vertices } );\n\n\t};\n\n\tfunction createSkin ( geometry, ctrl, applyBindShape ) {\n\n\t\tvar skinCtrl = controllers[ ctrl.url ];\n\n\t\tif ( !skinCtrl || !skinCtrl.skin ) {\n\n\t\t\tconsole.log( \"could not find skin controller!\" );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( !ctrl.skeleton || !ctrl.skeleton.length ) {\n\n\t\t\tconsole.log( \"could not find the skeleton for the skin!\" );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar skin = skinCtrl.skin;\n\t\tvar skeleton = daeScene.getChildById( ctrl.skeleton[ 0 ] );\n\t\tvar hierarchy = [];\n\n\t\tapplyBindShape = applyBindShape !== undefined ? applyBindShape : true;\n\n\t\tvar bones = [];\n\t\tgeometry.skinWeights = [];\n\t\tgeometry.skinIndices = [];\n\n\t\t//createBones( geometry.bones, skin, hierarchy, skeleton, null, -1 );\n\t\t//createWeights( skin, geometry.bones, geometry.skinIndices, geometry.skinWeights );\n\n\t\t/*\n\t\tgeometry.animation = {\n\t\t\tname: 'take_001',\n\t\t\tfps: 30,\n\t\t\tlength: 2,\n\t\t\tJIT: true,\n\t\t\thierarchy: hierarchy\n\t\t};\n\t\t*/\n\n\t\tif ( applyBindShape ) {\n\n\t\t\tfor ( var i = 0; i < geometry.vertices.length; i ++ ) {\n\n\t\t\t\tgeometry.vertices[ i ].applyMatrix4( skin.bindShapeMatrix );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction setupSkeleton ( node, bones, frame, parent ) {\n\n\t\tnode.world = node.world || new THREE.Matrix4();\n\t\tnode.localworld = node.localworld || new THREE.Matrix4();\n\t\tnode.world.copy( node.matrix );\n\t\tnode.localworld.copy( node.matrix );\n\n\t\tif ( node.channels && node.channels.length ) {\n\n\t\t\tvar channel = node.channels[ 0 ];\n\t\t\tvar m = channel.sampler.output[ frame ];\n\n\t\t\tif ( m instanceof THREE.Matrix4 ) {\n\n\t\t\t\tnode.world.copy( m );\n\t\t\t\tnode.localworld.copy(m);\n\t\t\t\tif(frame == 0)\n\t\t\t\t\tnode.matrix.copy(m);\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parent ) {\n\n\t\t\tnode.world.multiplyMatrices( parent, node.world );\n\n\t\t}\n\n\t\tbones.push( node );\n\n\t\tfor ( var i = 0; i < node.nodes.length; i ++ ) {\n\n\t\t\tsetupSkeleton( node.nodes[ i ], bones, frame, node.world );\n\n\t\t}\n\n\t}\n\n\tfunction setupSkinningMatrices ( bones, skin ) {\n\n\t\t// FIXME: this is dumb...\n\n\t\tfor ( var i = 0; i < bones.length; i ++ ) {\n\n\t\t\tvar bone = bones[ i ];\n\t\t\tvar found = -1;\n\n\t\t\tif ( bone.type != 'JOINT' ) continue;\n\n\t\t\tfor ( var j = 0; j < skin.joints.length; j ++ ) {\n\n\t\t\t\tif ( bone.sid == skin.joints[ j ] ) {\n\n\t\t\t\t\tfound = j;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( found >= 0 ) {\n\n\t\t\t\tvar inv = skin.invBindMatrices[ found ];\n\n\t\t\t\tbone.invBindMatrix = inv;\n\t\t\t\tbone.skinningMatrix = new THREE.Matrix4();\n\t\t\t\tbone.skinningMatrix.multiplyMatrices(bone.world, inv); // (IBMi * JMi)\n\t\t\t\tbone.animatrix = new THREE.Matrix4();\n\n\t\t\t\tbone.animatrix.copy(bone.localworld);\n\t\t\t\tbone.weights = [];\n\n\t\t\t\tfor ( var j = 0; j < skin.weights.length; j ++ ) {\n\n\t\t\t\t\tfor (var k = 0; k < skin.weights[ j ].length; k ++ ) {\n\n\t\t\t\t\t\tvar w = skin.weights[ j ][ k ];\n\n\t\t\t\t\t\tif ( w.joint == found ) {\n\n\t\t\t\t\t\t\tbone.weights.push( w );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( \"ColladaLoader: Could not find joint '\" + bone.sid + \"'.\" );\n\n\t\t\t\tbone.skinningMatrix = new THREE.Matrix4();\n\t\t\t\tbone.weights = [];\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\t//Walk the Collada tree and flatten the bones into a list, extract the position, quat and scale from the matrix\n\tfunction flattenSkeleton(skeleton) {\n\n\t\tvar list = [];\n\t\tvar walk = function(parentid, node, list) {\n\n\t\t\tvar bone = {};\n\t\t\tbone.name = node.sid;\n\t\t\tbone.parent = parentid;\n\t\t\tbone.matrix = node.matrix;\n\t\t\tvar data = [new THREE.Vector3(),new THREE.Quaternion(),new THREE.Vector3()];\n\t\t\tbone.matrix.decompose(data[0],data[1],data[2]);\n\n\t\t\tbone.pos = [data[0].x,data[0].y,data[0].z];\n\n\t\t\tbone.scl = [data[2].x,data[2].y,data[2].z];\n\t\t\tbone.rotq = [data[1].x,data[1].y,data[1].z,data[1].w];\n\t\t\tlist.push(bone);\n\n\t\t\tfor(var i in node.nodes) {\n\n\t\t\t\twalk(node.sid,node.nodes[i],list);\n\n\t\t\t}\n\n\t\t};\n\n\t\twalk(-1,skeleton,list);\n\t\treturn list;\n\n\t}\n\n\t//Move the vertices into the pose that is proper for the start of the animation\n\tfunction skinToBindPose(geometry,skeleton,skinController) {\n\n\t\tvar bones = [];\n\t\tsetupSkeleton( skeleton, bones, -1 );\n\t\tsetupSkinningMatrices( bones, skinController.skin );\n\t\tv = new THREE.Vector3();\n\t\tvar skinned = [];\n\n\t\tfor(var i =0; i < geometry.vertices.length; i++) {\n\n\t\t\tskinned.push(new THREE.Vector3());\n\n\t\t}\n\n\t\tfor ( i = 0; i < bones.length; i ++ ) {\n\n\t\t\tif ( bones[ i ].type != 'JOINT' ) continue;\n\n\t\t\tfor ( j = 0; j < bones[ i ].weights.length; j ++ ) {\n\n\t\t\t\tw = bones[ i ].weights[ j ];\n\t\t\t\tvidx = w.index;\n\t\t\t\tweight = w.weight;\n\n\t\t\t\to = geometry.vertices[vidx];\n\t\t\t\ts = skinned[vidx];\n\n\t\t\t\tv.x = o.x;\n\t\t\t\tv.y = o.y;\n\t\t\t\tv.z = o.z;\n\n\t\t\t\tv.applyMatrix4( bones[i].skinningMatrix );\n\n\t\t\t\ts.x += (v.x * weight);\n\t\t\t\ts.y += (v.y * weight);\n\t\t\t\ts.z += (v.z * weight);\n\t\t\t}\n\n\t\t}\n\n\t\tfor(var i =0; i < geometry.vertices.length; i++) {\n\n\t\t\tgeometry.vertices[i] = skinned[i];\n\n\t\t}\n\n\t}\n\n\tfunction applySkin ( geometry, instanceCtrl, frame ) {\n\n\t\tvar skinController = controllers[ instanceCtrl.url ];\n\n\t\tframe = frame !== undefined ? frame : 40;\n\n\t\tif ( !skinController || !skinController.skin ) {\n\n\t\t\tconsole.log( 'ColladaLoader: Could not find skin controller.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( !instanceCtrl.skeleton || !instanceCtrl.skeleton.length ) {\n\n\t\t\tconsole.log( 'ColladaLoader: Could not find the skeleton for the skin. ' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar animationBounds = calcAnimationBounds();\n\t\tvar skeleton = daeScene.getChildById( instanceCtrl.skeleton[0], true ) ||\n\t\t\t\t\t daeScene.getChildBySid( instanceCtrl.skeleton[0], true );\n\n\t\t//flatten the skeleton into a list of bones\n\t\tvar bonelist = flattenSkeleton(skeleton);\n\t\tvar joints = skinController.skin.joints;\n\n\t\t//sort that list so that the order reflects the order in the joint list\n\t\tvar sortedbones = [];\n\t\tfor(var i = 0; i < joints.length; i++) {\n\n\t\t\tfor(var j =0; j < bonelist.length; j++) {\n\n\t\t\t\tif(bonelist[j].name == joints[i]) {\n\n\t\t\t\t\tsortedbones[i] = bonelist[j];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//hook up the parents by index instead of name\n\t\tfor(var i = 0; i < sortedbones.length; i++) {\n\n\t\t\tfor(var j =0; j < sortedbones.length; j++) {\n\n\t\t\t\tif(sortedbones[i].parent == sortedbones[j].name) {\n\n\t\t\t\t\tsortedbones[i].parent = j;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar i, j, w, vidx, weight;\n\t\tvar v = new THREE.Vector3(), o, s;\n\n\t\t// move vertices to bind shape\n\t\tfor ( i = 0; i < geometry.vertices.length; i ++ ) {\n\t\t\t\t\tgeometry.vertices[i].applyMatrix4( skinController.skin.bindShapeMatrix );\n\t\t}\n\n\t\tvar skinIndices = [];\n\t\tvar skinWeights = [];\n\t\tvar weights = skinController.skin.weights;\n\n\t\t//hook up the skin weights\n\t\t// TODO - this might be a good place to choose greatest 4 weights\n\t\tfor(var i =0; i < weights.length; i++) {\n\n\t\t\tvar indicies = new THREE.Vector4(weights[i][0]?weights[i][0].joint:0,weights[i][1]?weights[i][1].joint:0,weights[i][2]?weights[i][2].joint:0,weights[i][3]?weights[i][3].joint:0);\n\t\t\tvar weight = new THREE.Vector4(weights[i][0]?weights[i][0].weight:0,weights[i][1]?weights[i][1].weight:0,weights[i][2]?weights[i][2].weight:0,weights[i][3]?weights[i][3].weight:0);\n\n\t\t\tskinIndices.push(indicies);\n\t\t\tskinWeights.push(weight);\n\n\t\t}\n\n\t\tgeometry.skinIndices = skinIndices;\n\t\tgeometry.skinWeights = skinWeights;\n\t\tgeometry.bones = sortedbones;\n\t\t// process animation, or simply pose the rig if no animation\n\n\t\t//create an animation for the animated bones\n\t\t//NOTE: this has no effect when using morphtargets\n\t\tvar animationdata = {\"name\":animationBounds.ID,\"fps\":30,\"length\":animationBounds.frames/30,\"hierarchy\":[]};\n\n\t\tfor(var j =0; j < sortedbones.length; j++) {\n\n\t\t\tanimationdata.hierarchy.push({parent:sortedbones[j].parent, name:sortedbones[j].name, keys:[]});\n\n\t\t}\n\n\t\tconsole.log( 'ColladaLoader:', animationBounds.ID + ' has ' + sortedbones.length + ' bones.' );\n\n\n\n\t\tskinToBindPose(geometry,skeleton,skinController);\n\n\n\t\tfor ( frame = 0; frame < animationBounds.frames; frame ++ ) {\n\n\t\t\tvar bones = [];\n\t\t\tvar skinned = [];\n\t\t\t// process the frame and setup the rig with a fresh\n\t\t\t// transform, possibly from the bone's animation channel(s)\n\n\t\t\tsetupSkeleton( skeleton, bones, frame );\n\t\t\tsetupSkinningMatrices( bones, skinController.skin );\n\n\t\t\tfor(var i = 0; i < bones.length; i ++) {\n\n\t\t\t\tfor(var j = 0; j < animationdata.hierarchy.length; j ++) {\n\n\t\t\t\t\tif(animationdata.hierarchy[j].name == bones[i].sid) {\n\n\t\t\t\t\t\tvar key = {};\n\t\t\t\t\t\tkey.time = (frame/30);\n\t\t\t\t\t\tkey.matrix = bones[i].animatrix;\n\n\t\t\t\t\t\tif(frame == 0)\n\t\t\t\t\t\t\tbones[i].matrix = key.matrix;\n\n\t\t\t\t\t\tvar data = [new THREE.Vector3(),new THREE.Quaternion(),new THREE.Vector3()];\n\t\t\t\t\t\tkey.matrix.decompose(data[0],data[1],data[2]);\n\n\t\t\t\t\t\tkey.pos = [data[0].x,data[0].y,data[0].z];\n\n\t\t\t\t\t\tkey.scl = [data[2].x,data[2].y,data[2].z];\n\t\t\t\t\t\tkey.rot = data[1];\n\n\t\t\t\t\t\tanimationdata.hierarchy[j].keys.push(key);\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.animation = animationdata;\n\n\t\t}\n\n\t};\n\n\tfunction createSceneGraph ( node, parent ) {\n\n\t\tvar obj = new THREE.Object3D();\n\t\tvar skinned = false;\n\t\tvar skinController;\n\t\tvar morphController;\n\t\tvar i, j;\n\n\t\t// FIXME: controllers\n\n\t\tfor ( i = 0; i < node.controllers.length; i ++ ) {\n\n\t\t\tvar controller = controllers[ node.controllers[ i ].url ];\n\n\t\t\tswitch ( controller.type ) {\n\n\t\t\t\tcase 'skin':\n\n\t\t\t\t\tif ( geometries[ controller.skin.source ] ) {\n\n\t\t\t\t\t\tvar inst_geom = new InstanceGeometry();\n\n\t\t\t\t\t\tinst_geom.url = controller.skin.source;\n\t\t\t\t\t\tinst_geom.instance_material = node.controllers[ i ].instance_material;\n\n\t\t\t\t\t\tnode.geometries.push( inst_geom );\n\t\t\t\t\t\tskinned = true;\n\t\t\t\t\t\tskinController = node.controllers[ i ];\n\n\t\t\t\t\t} else if ( controllers[ controller.skin.source ] ) {\n\n\t\t\t\t\t\t// urgh: controller can be chained\n\t\t\t\t\t\t// handle the most basic case...\n\n\t\t\t\t\t\tvar second = controllers[ controller.skin.source ];\n\t\t\t\t\t\tmorphController = second;\n\t\t\t\t\t//\tskinController = node.controllers[i];\n\n\t\t\t\t\t\tif ( second.morph && geometries[ second.morph.source ] ) {\n\n\t\t\t\t\t\t\tvar inst_geom = new InstanceGeometry();\n\n\t\t\t\t\t\t\tinst_geom.url = second.morph.source;\n\t\t\t\t\t\t\tinst_geom.instance_material = node.controllers[ i ].instance_material;\n\n\t\t\t\t\t\t\tnode.geometries.push( inst_geom );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'morph':\n\n\t\t\t\t\tif ( geometries[ controller.morph.source ] ) {\n\n\t\t\t\t\t\tvar inst_geom = new InstanceGeometry();\n\n\t\t\t\t\t\tinst_geom.url = controller.morph.source;\n\t\t\t\t\t\tinst_geom.instance_material = node.controllers[ i ].instance_material;\n\n\t\t\t\t\t\tnode.geometries.push( inst_geom );\n\t\t\t\t\t\tmorphController = node.controllers[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log( 'ColladaLoader: Morph-controller partially supported.' );\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// geometries\n\n\t\tvar double_sided_materials = {};\n\n\t\tfor ( i = 0; i < node.geometries.length; i ++ ) {\n\n\t\t\tvar instance_geometry = node.geometries[i];\n\t\t\tvar instance_materials = instance_geometry.instance_material;\n\t\t\tvar geometry = geometries[ instance_geometry.url ];\n\t\t\tvar used_materials = {};\n\t\t\tvar used_materials_array = [];\n\t\t\tvar num_materials = 0;\n\t\t\tvar first_material;\n\n\t\t\tif ( geometry ) {\n\n\t\t\t\tif ( !geometry.mesh || !geometry.mesh.primitives )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif ( obj.name.length == 0 ) {\n\n\t\t\t\t\tobj.name = geometry.id;\n\n\t\t\t\t}\n\n\t\t\t\t// collect used fx for this geometry-instance\n\n\t\t\t\tif ( instance_materials ) {\n\n\t\t\t\t\tfor ( j = 0; j < instance_materials.length; j ++ ) {\n\n\t\t\t\t\t\tvar instance_material = instance_materials[ j ];\n\t\t\t\t\t\tvar mat = materials[ instance_material.target ];\n\t\t\t\t\t\tvar effect_id = mat.instance_effect.url;\n\t\t\t\t\t\tvar shader = effects[ effect_id ].shader;\n\t\t\t\t\t\tvar material3js = shader.material;\n\n\t\t\t\t\t\tif ( geometry.doubleSided ) {\n\n\t\t\t\t\t\t\tif ( !( instance_material.symbol in double_sided_materials ) ) {\n\n\t\t\t\t\t\t\t\tvar _copied_material = material3js.clone();\n\t\t\t\t\t\t\t\t_copied_material.side = THREE.DoubleSide;\n\t\t\t\t\t\t\t\tdouble_sided_materials[ instance_material.symbol ] = _copied_material;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tmaterial3js = double_sided_materials[ instance_material.symbol ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterial3js.opacity = !material3js.opacity ? 1 : material3js.opacity;\n\t\t\t\t\t\tused_materials[ instance_material.symbol ] = num_materials;\n\t\t\t\t\t\tused_materials_array.push( material3js );\n\t\t\t\t\t\tfirst_material = material3js;\n\t\t\t\t\t\tfirst_material.name = mat.name == null || mat.name === '' ? mat.id : mat.name;\n\t\t\t\t\t\tnum_materials ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar mesh;\n\t\t\t\tvar material = first_material || new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.FlatShading, side: geometry.doubleSided ? THREE.DoubleSide : THREE.FrontSide } );\n\t\t\t\tvar geom = geometry.mesh.geometry3js;\n\n\t\t\t\tif ( num_materials > 1 ) {\n\n\t\t\t\t\tmaterial = new THREE.MeshFaceMaterial( used_materials_array );\n\n\t\t\t\t\tfor ( j = 0; j < geom.faces.length; j ++ ) {\n\n\t\t\t\t\t\tvar face = geom.faces[ j ];\n\t\t\t\t\t\tface.materialIndex = used_materials[ face.daeMaterial ]\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( skinController !== undefined ) {\n\n\n\t\t\t\t\tapplySkin( geom, skinController );\n\n\t\t\t\t\tif(geom.morphTargets.length > 0) {\n\n\t\t\t\t\t\tmaterial.morphTargets = true;\n\t\t\t\t\t\tmaterial.skinning = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaterial.morphTargets = false;\n\t\t\t\t\t\tmaterial.skinning = true;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tmesh = new THREE.SkinnedMesh( geom, material, false );\n\n\n\t\t\t\t\t//mesh.skeleton = skinController.skeleton;\n\t\t\t\t\t//mesh.skinController = controllers[ skinController.url ];\n\t\t\t\t\t//mesh.skinInstanceController = skinController;\n\t\t\t\t\tmesh.name = 'skin_' + skins.length;\n\n\n\n\t\t\t\t\t//mesh.animationHandle.setKey(0);\n\t\t\t\t\tskins.push( mesh );\n\n\t\t\t\t} else if ( morphController !== undefined ) {\n\n\t\t\t\t\tcreateMorph( geom, morphController );\n\n\t\t\t\t\tmaterial.morphTargets = true;\n\n\t\t\t\t\tmesh = new THREE.Mesh( geom, material );\n\t\t\t\t\tmesh.name = 'morph_' + morphs.length;\n\n\t\t\t\t\tmorphs.push( mesh );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmesh = new THREE.Mesh( geom, material );\n\t\t\t\t\t// mesh.geom.name = geometry.id;\n\n\t\t\t\t}\n\n\t\t\t\t// N.B.: TP says this is not a great default behavior. It's a nice\n\t\t\t\t// optimization to flatten the hierarchy but this should be done\n\t\t\t\t// only if requested by the user via a flag. For now I undid it\n\t\t\t\t// and fixed the character animation example that uses it\n\t\t\t\t// node.geometries.length > 1 ? obj.add( mesh ) : obj = mesh;\n\t\t\t\tobj.add(mesh);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( i = 0; i < node.cameras.length; i ++ ) {\n\n\t\t\tvar instance_camera = node.cameras[i];\n\t\t\tvar cparams = cameras[instance_camera.url];\n\n\t\t\tvar cam = new THREE.PerspectiveCamera(cparams.yfov, parseFloat(cparams.aspect_ratio),\n\t\t\t\t\tparseFloat(cparams.znear), parseFloat(cparams.zfar));\n\n\t\t\tobj.add(cam);\n\t\t}\n\n\t\tfor ( i = 0; i < node.lights.length; i ++ ) {\n\n\t\t\tvar light = null;\n\t\t\tvar instance_light = node.lights[i];\n\t\t\tvar lparams = lights[instance_light.url];\n\n\t\t\tif ( lparams && lparams.technique ) {\n\n\t\t\t\tvar color = lparams.color.getHex();\n\t\t\t\tvar intensity = lparams.intensity;\n\t\t\t\tvar distance = lparams.distance;\n\t\t\t\tvar angle = lparams.falloff_angle;\n\t\t\t\tvar exponent; // Intentionally undefined, don't know what this is yet\n\n\t\t\t\tswitch ( lparams.technique ) {\n\n\t\t\t\t\tcase 'directional':\n\n\t\t\t\t\t\tlight = new THREE.DirectionalLight( color, intensity, distance );\n\t\t\t\t\t\tlight.position.set(0, 0, 1);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'point':\n\n\t\t\t\t\t\tlight = new THREE.PointLight( color, intensity, distance );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'spot':\n\n\t\t\t\t\t\tlight = new THREE.SpotLight( color, intensity, distance, angle, exponent );\n\t\t\t\t\t\tlight.position.set(0, 0, 1);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ambient':\n\n\t\t\t\t\t\tlight = new THREE.AmbientLight( color );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (light) {\n\t\t\t\tobj.add(light);\n\t\t\t}\n\t\t}\n\n\t\tobj.name = node.name || node.id || \"\";\n\t\tobj.id = node.id || \"\";\n\t\tobj.layer = node.layer || \"\";\n\t\tobj.matrix = node.matrix;\n\t\tobj.matrix.decompose( obj.position, obj.quaternion, obj.scale );\n\n\t\tif ( options.centerGeometry && obj.geometry ) {\n\n\t\t\tvar delta = obj.geometry.center();\n\t\t\tdelta.multiply( obj.scale );\n\t\t\tdelta.applyQuaternion( obj.quaternion );\n\n\t\t\tobj.position.sub( delta );\n\n\t\t}\n\n\t\tfor ( i = 0; i < node.nodes.length; i ++ ) {\n\n\t\t\tobj.add( createSceneGraph( node.nodes[i], node ) );\n\n\t\t}\n\n\t\treturn obj;\n\n\t};\n\n\tfunction getJointId( skin, id ) {\n\n\t\tfor ( var i = 0; i < skin.joints.length; i ++ ) {\n\n\t\t\tif ( skin.joints[ i ] == id ) {\n\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tfunction getLibraryNode( id ) {\n\n var nodes = COLLADA.querySelectorAll('library_nodes node');\n\n for ( var i = 0; i < nodes.length; i++ ) {\n\n var attObj = nodes[i].attributes.getNamedItem('id');\n if ( attObj && attObj.value === id ) {\n return nodes[i];\n }\n }\n\n return undefined;\n\n\t};\n\n\tfunction getChannelsForNode (node ) {\n\n\t\tvar channels = [];\n\t\tvar startTime = 1000000;\n\t\tvar endTime = -1000000;\n\n\t\tfor ( var id in animations ) {\n\n\t\t\tvar animation = animations[id];\n\n\t\t\tfor ( var i = 0; i < animation.channel.length; i ++ ) {\n\n\t\t\t\tvar channel = animation.channel[i];\n\t\t\t\tvar sampler = animation.sampler[i];\n\t\t\t\tvar id = channel.target.split('/')[0];\n\n\t\t\t\tif ( id == node.id ) {\n\n\t\t\t\t\tsampler.create();\n\t\t\t\t\tchannel.sampler = sampler;\n\t\t\t\t\tstartTime = Math.min(startTime, sampler.startTime);\n\t\t\t\t\tendTime = Math.max(endTime, sampler.endTime);\n\t\t\t\t\tchannels.push(channel);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( channels.length ) {\n\n\t\t\tnode.startTime = startTime;\n\t\t\tnode.endTime = endTime;\n\n\t\t}\n\n\t\treturn channels;\n\n\t};\n\n\tfunction calcFrameDuration( node ) {\n\n\t\tvar minT = 10000000;\n\n\t\tfor ( var i = 0; i < node.channels.length; i ++ ) {\n\n\t\t\tvar sampler = node.channels[i].sampler;\n\n\t\t\tfor ( var j = 0; j < sampler.input.length - 1; j ++ ) {\n\n\t\t\t\tvar t0 = sampler.input[ j ];\n\t\t\t\tvar t1 = sampler.input[ j + 1 ];\n\t\t\t\tminT = Math.min( minT, t1 - t0 );\n\n\t\t\t}\n\t\t}\n\n\t\treturn minT;\n\n\t};\n\n\tfunction calcMatrixAt( node, t ) {\n\n\t\tvar animated = {};\n\n\t\tvar i, j;\n\n\t\tfor ( i = 0; i < node.channels.length; i ++ ) {\n\n\t\t\tvar channel = node.channels[ i ];\n\t\t\tanimated[ channel.sid ] = channel;\n\n\t\t}\n\n\t\tvar matrix = new THREE.Matrix4();\n\n\t\tfor ( i = 0; i < node.transforms.length; i ++ ) {\n\n\t\t\tvar transform = node.transforms[ i ];\n\t\t\tvar channel = animated[ transform.sid ];\n\n\t\t\tif ( channel !== undefined ) {\n\n\t\t\t\tvar sampler = channel.sampler;\n\t\t\t\tvar value;\n\n\t\t\t\tfor ( j = 0; j < sampler.input.length - 1; j ++ ) {\n\n\t\t\t\t\tif ( sampler.input[ j + 1 ] > t ) {\n\n\t\t\t\t\t\tvalue = sampler.output[ j ];\n\t\t\t\t\t\t//console.log(value.flatten)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\tif ( value instanceof THREE.Matrix4 ) {\n\n\t\t\t\t\t\tmatrix.multiplyMatrices( matrix, value );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// FIXME: handle other types\n\n\t\t\t\t\t\tmatrix.multiplyMatrices( matrix, transform.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmatrix.multiplyMatrices( matrix, transform.matrix );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmatrix.multiplyMatrices( matrix, transform.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn matrix;\n\n\t};\n\n\tfunction bakeAnimations ( node ) {\n\n\t\tif ( node.channels && node.channels.length ) {\n\n\t\t\tvar keys = [],\n\t\t\t\tsids = [];\n\n\t\t\tfor ( var i = 0, il = node.channels.length; i < il; i++ ) {\n\n\t\t\t\tvar channel = node.channels[i],\n\t\t\t\t\tfullSid = channel.fullSid,\n\t\t\t\t\tsampler = channel.sampler,\n\t\t\t\t\tinput = sampler.input,\n\t\t\t\t\ttransform = node.getTransformBySid( channel.sid ),\n\t\t\t\t\tmember;\n\n\t\t\t\tif ( channel.arrIndices ) {\n\n\t\t\t\t\tmember = [];\n\n\t\t\t\t\tfor ( var j = 0, jl = channel.arrIndices.length; j < jl; j++ ) {\n\n\t\t\t\t\t\tmember[ j ] = getConvertedIndex( channel.arrIndices[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmember = getConvertedMember( channel.member );\n\n\t\t\t\t}\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tif ( sids.indexOf( fullSid ) === -1 ) {\n\n\t\t\t\t\t\tsids.push( fullSid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = input.length; j < jl; j++ ) {\n\n\t\t\t\t\t\tvar time = input[j],\n\t\t\t\t\t\t\tdata = sampler.getData( transform.type, j, member ),\n\t\t\t\t\t\t\tkey = findKey( keys, time );\n\n\t\t\t\t\t\tif ( !key ) {\n\n\t\t\t\t\t\t\tkey = new Key( time );\n\t\t\t\t\t\t\tvar timeNdx = findTimeNdx( keys, time );\n\t\t\t\t\t\t\tkeys.splice( timeNdx == -1 ? keys.length : timeNdx, 0, key );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tkey.addTarget( fullSid, transform, member, data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.log( 'Could not find transform \"' + channel.sid + '\" in node ' + node.id );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// post process\n\t\t\tfor ( var i = 0; i < sids.length; i++ ) {\n\n\t\t\t\tvar sid = sids[ i ];\n\n\t\t\t\tfor ( var j = 0; j < keys.length; j++ ) {\n\n\t\t\t\t\tvar key = keys[ j ];\n\n\t\t\t\t\tif ( !key.hasTarget( sid ) ) {\n\n\t\t\t\t\t\tinterpolateKeys( keys, key, j, sid );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnode.keys = keys;\n\t\t\tnode.sids = sids;\n\n\t\t}\n\n\t};\n\n\tfunction findKey ( keys, time) {\n\n\t\tvar retVal = null;\n\n\t\tfor ( var i = 0, il = keys.length; i < il && retVal == null; i++ ) {\n\n\t\t\tvar key = keys[i];\n\n\t\t\tif ( key.time === time ) {\n\n\t\t\t\tretVal = key;\n\n\t\t\t} else if ( key.time > time ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn retVal;\n\n\t};\n\n\tfunction findTimeNdx ( keys, time) {\n\n\t\tvar ndx = -1;\n\n\t\tfor ( var i = 0, il = keys.length; i < il && ndx == -1; i++ ) {\n\n\t\t\tvar key = keys[i];\n\n\t\t\tif ( key.time >= time ) {\n\n\t\t\t\tndx = i;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn ndx;\n\n\t};\n\n\tfunction interpolateKeys ( keys, key, ndx, fullSid ) {\n\n\t\tvar prevKey = getPrevKeyWith( keys, fullSid, ndx ? ndx-1 : 0 ),\n\t\t\tnextKey = getNextKeyWith( keys, fullSid, ndx+1 );\n\n\t\tif ( prevKey && nextKey ) {\n\n\t\t\tvar scale = (key.time - prevKey.time) / (nextKey.time - prevKey.time),\n\t\t\t\tprevTarget = prevKey.getTarget( fullSid ),\n\t\t\t\tnextData = nextKey.getTarget( fullSid ).data,\n\t\t\t\tprevData = prevTarget.data,\n\t\t\t\tdata;\n\n\t\t\tif ( prevTarget.type === 'matrix' ) {\n\n\t\t\t\tdata = prevData;\n\n\t\t\t} else if ( prevData.length ) {\n\n\t\t\t\tdata = [];\n\n\t\t\t\tfor ( var i = 0; i < prevData.length; ++i ) {\n\n\t\t\t\t\tdata[ i ] = prevData[ i ] + ( nextData[ i ] - prevData[ i ] ) * scale;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdata = prevData + ( nextData - prevData ) * scale;\n\n\t\t\t}\n\n\t\t\tkey.addTarget( fullSid, prevTarget.transform, prevTarget.member, data );\n\n\t\t}\n\n\t};\n\n\t// Get next key with given sid\n\n\tfunction getNextKeyWith( keys, fullSid, ndx ) {\n\n\t\tfor ( ; ndx < keys.length; ndx++ ) {\n\n\t\t\tvar key = keys[ ndx ];\n\n\t\t\tif ( key.hasTarget( fullSid ) ) {\n\n\t\t\t\treturn key;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t// Get previous key with given sid\n\n\tfunction getPrevKeyWith( keys, fullSid, ndx ) {\n\n\t\tndx = ndx >= 0 ? ndx : ndx + keys.length;\n\n\t\tfor ( ; ndx >= 0; ndx-- ) {\n\n\t\t\tvar key = keys[ ndx ];\n\n\t\t\tif ( key.hasTarget( fullSid ) ) {\n\n\t\t\t\treturn key;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tfunction _Image() {\n\n\t\tthis.id = \"\";\n\t\tthis.init_from = \"\";\n\n\t};\n\n\t_Image.prototype.parse = function(element) {\n\n\t\tthis.id = element.getAttribute('id');\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tif ( child.nodeName == 'init_from' ) {\n\n\t\t\t\tthis.init_from = child.textContent;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Controller() {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.type = \"\";\n\t\tthis.skin = null;\n\t\tthis.morph = null;\n\n\t};\n\n\tController.prototype.parse = function( element ) {\n\n\t\tthis.id = element.getAttribute('id');\n\t\tthis.name = element.getAttribute('name');\n\t\tthis.type = \"none\";\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'skin':\n\n\t\t\t\t\tthis.skin = (new Skin()).parse(child);\n\t\t\t\t\tthis.type = child.nodeName;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'morph':\n\n\t\t\t\t\tthis.morph = (new Morph()).parse(child);\n\t\t\t\t\tthis.type = child.nodeName;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Morph() {\n\n\t\tthis.method = null;\n\t\tthis.source = null;\n\t\tthis.targets = null;\n\t\tthis.weights = null;\n\n\t};\n\n\tMorph.prototype.parse = function( element ) {\n\n\t\tvar sources = {};\n\t\tvar inputs = [];\n\t\tvar i;\n\n\t\tthis.method = element.getAttribute( 'method' );\n\t\tthis.source = element.getAttribute( 'source' ).replace( /^#/, '' );\n\n\t\tfor ( i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'source':\n\n\t\t\t\t\tvar source = ( new Source() ).parse( child );\n\t\t\t\t\tsources[ source.id ] = source;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'targets':\n\n\t\t\t\t\tinputs = this.parseInputs( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( i = 0; i < inputs.length; i ++ ) {\n\n\t\t\tvar input = inputs[ i ];\n\t\t\tvar source = sources[ input.source ];\n\n\t\t\tswitch ( input.semantic ) {\n\n\t\t\t\tcase 'MORPH_TARGET':\n\n\t\t\t\t\tthis.targets = source.read();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MORPH_WEIGHT':\n\n\t\t\t\t\tthis.weights = source.read();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tMorph.prototype.parseInputs = function(element) {\n\n\t\tvar inputs = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\t\t\tif ( child.nodeType != 1) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'input':\n\n\t\t\t\t\tinputs.push( (new Input()).parse(child) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn inputs;\n\n\t};\n\n\tfunction Skin() {\n\n\t\tthis.source = \"\";\n\t\tthis.bindShapeMatrix = null;\n\t\tthis.invBindMatrices = [];\n\t\tthis.joints = [];\n\t\tthis.weights = [];\n\n\t};\n\n\tSkin.prototype.parse = function( element ) {\n\n\t\tvar sources = {};\n\t\tvar joints, weights;\n\n\t\tthis.source = element.getAttribute( 'source' ).replace( /^#/, '' );\n\t\tthis.invBindMatrices = [];\n\t\tthis.joints = [];\n\t\tthis.weights = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'bind_shape_matrix':\n\n\t\t\t\t\tvar f = _floats(child.textContent);\n\t\t\t\t\tthis.bindShapeMatrix = getConvertedMat4( f );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'source':\n\n\t\t\t\t\tvar src = new Source().parse(child);\n\t\t\t\t\tsources[ src.id ] = src;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'joints':\n\n\t\t\t\t\tjoints = child;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'vertex_weights':\n\n\t\t\t\t\tweights = child;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\n\t\tthis.parseJoints( joints, sources );\n\t\tthis.parseWeights( weights, sources );\n\n\t\treturn this;\n\n\t};\n\n\tSkin.prototype.parseJoints = function ( element, sources ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'input':\n\n\t\t\t\t\tvar input = ( new Input() ).parse( child );\n\t\t\t\t\tvar source = sources[ input.source ];\n\n\t\t\t\t\tif ( input.semantic == 'JOINT' ) {\n\n\t\t\t\t\t\tthis.joints = source.read();\n\n\t\t\t\t\t} else if ( input.semantic == 'INV_BIND_MATRIX' ) {\n\n\t\t\t\t\t\tthis.invBindMatrices = source.read();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tSkin.prototype.parseWeights = function ( element, sources ) {\n\n\t\tvar v, vcount, inputs = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'input':\n\n\t\t\t\t\tinputs.push( ( new Input() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'v':\n\n\t\t\t\t\tv = _ints( child.textContent );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'vcount':\n\n\t\t\t\t\tvcount = _ints( child.textContent );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar index = 0;\n\n\t\tfor ( var i = 0; i < vcount.length; i ++ ) {\n\n\t\t\tvar numBones = vcount[i];\n\t\t\tvar vertex_weights = [];\n\n\t\t\tfor ( var j = 0; j < numBones; j++ ) {\n\n\t\t\t\tvar influence = {};\n\n\t\t\t\tfor ( var k = 0; k < inputs.length; k ++ ) {\n\n\t\t\t\t\tvar input = inputs[ k ];\n\t\t\t\t\tvar value = v[ index + input.offset ];\n\n\t\t\t\t\tswitch ( input.semantic ) {\n\n\t\t\t\t\t\tcase 'JOINT':\n\n\t\t\t\t\t\t\tinfluence.joint = value;//this.joints[value];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'WEIGHT':\n\n\t\t\t\t\t\t\tinfluence.weight = sources[ input.source ].data[ value ];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvertex_weights.push( influence );\n\t\t\t\tindex += inputs.length;\n\t\t\t}\n\n\t\t\tfor ( var j = 0; j < vertex_weights.length; j ++ ) {\n\n\t\t\t\tvertex_weights[ j ].index = i;\n\n\t\t\t}\n\n\t\t\tthis.weights.push( vertex_weights );\n\n\t\t}\n\n\t};\n\n\tfunction VisualScene () {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.nodes = [];\n\t\tthis.scene = new THREE.Object3D();\n\n\t};\n\n\tVisualScene.prototype.getChildById = function( id, recursive ) {\n\n\t\tfor ( var i = 0; i < this.nodes.length; i ++ ) {\n\n\t\t\tvar node = this.nodes[ i ].getChildById( id, recursive );\n\n\t\t\tif ( node ) {\n\n\t\t\t\treturn node;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tVisualScene.prototype.getChildBySid = function( sid, recursive ) {\n\n\t\tfor ( var i = 0; i < this.nodes.length; i ++ ) {\n\n\t\t\tvar node = this.nodes[ i ].getChildBySid( sid, recursive );\n\n\t\t\tif ( node ) {\n\n\t\t\t\treturn node;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tVisualScene.prototype.parse = function( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.name = element.getAttribute( 'name' );\n\t\tthis.nodes = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'node':\n\n\t\t\t\t\tthis.nodes.push( ( new Node() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Node() {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.sid = \"\";\n\t\tthis.nodes = [];\n\t\tthis.controllers = [];\n\t\tthis.transforms = [];\n\t\tthis.geometries = [];\n\t\tthis.channels = [];\n\t\tthis.matrix = new THREE.Matrix4();\n\n\t};\n\n\tNode.prototype.getChannelForTransform = function( transformSid ) {\n\n\t\tfor ( var i = 0; i < this.channels.length; i ++ ) {\n\n\t\t\tvar channel = this.channels[i];\n\t\t\tvar parts = channel.target.split('/');\n\t\t\tvar id = parts.shift();\n\t\t\tvar sid = parts.shift();\n\t\t\tvar dotSyntax = (sid.indexOf(\".\") >= 0);\n\t\t\tvar arrSyntax = (sid.indexOf(\"(\") >= 0);\n\t\t\tvar arrIndices;\n\t\t\tvar member;\n\n\t\t\tif ( dotSyntax ) {\n\n\t\t\t\tparts = sid.split(\".\");\n\t\t\t\tsid = parts.shift();\n\t\t\t\tmember = parts.shift();\n\n\t\t\t} else if ( arrSyntax ) {\n\n\t\t\t\tarrIndices = sid.split(\"(\");\n\t\t\t\tsid = arrIndices.shift();\n\n\t\t\t\tfor ( var j = 0; j < arrIndices.length; j ++ ) {\n\n\t\t\t\t\tarrIndices[ j ] = parseInt( arrIndices[ j ].replace( /\\)/, '' ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( sid == transformSid ) {\n\n\t\t\t\tchannel.info = { sid: sid, dotSyntax: dotSyntax, arrSyntax: arrSyntax, arrIndices: arrIndices };\n\t\t\t\treturn channel;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tNode.prototype.getChildById = function ( id, recursive ) {\n\n\t\tif ( this.id == id ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( recursive ) {\n\n\t\t\tfor ( var i = 0; i < this.nodes.length; i ++ ) {\n\n\t\t\t\tvar n = this.nodes[ i ].getChildById( id, recursive );\n\n\t\t\t\tif ( n ) {\n\n\t\t\t\t\treturn n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tNode.prototype.getChildBySid = function ( sid, recursive ) {\n\n\t\tif ( this.sid == sid ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( recursive ) {\n\n\t\t\tfor ( var i = 0; i < this.nodes.length; i ++ ) {\n\n\t\t\t\tvar n = this.nodes[ i ].getChildBySid( sid, recursive );\n\n\t\t\t\tif ( n ) {\n\n\t\t\t\t\treturn n;\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tNode.prototype.getTransformBySid = function ( sid ) {\n\n\t\tfor ( var i = 0; i < this.transforms.length; i ++ ) {\n\n\t\t\tif ( this.transforms[ i ].sid == sid ) return this.transforms[ i ];\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tNode.prototype.parse = function( element ) {\n\n\t\tvar url;\n\n\t\tthis.id = element.getAttribute('id');\n\t\tthis.sid = element.getAttribute('sid');\n\t\tthis.name = element.getAttribute('name');\n\t\tthis.type = element.getAttribute('type');\n\t\tthis.layer = element.getAttribute('layer');\n\n\t\tthis.type = this.type == 'JOINT' ? this.type : 'NODE';\n\n\t\tthis.nodes = [];\n\t\tthis.transforms = [];\n\t\tthis.geometries = [];\n\t\tthis.cameras = [];\n\t\tthis.lights = [];\n\t\tthis.controllers = [];\n\t\tthis.matrix = new THREE.Matrix4();\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'node':\n\n\t\t\t\t\tthis.nodes.push( ( new Node() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'instance_camera':\n\n\t\t\t\t\tthis.cameras.push( ( new InstanceCamera() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'instance_controller':\n\n\t\t\t\t\tthis.controllers.push( ( new InstanceController() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'instance_geometry':\n\n\t\t\t\t\tthis.geometries.push( ( new InstanceGeometry() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'instance_light':\n\n\t\t\t\t\tthis.lights.push( ( new InstanceLight() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'instance_node':\n\n\t\t\t\t\turl = child.getAttribute( 'url' ).replace( /^#/, '' );\n\t\t\t\t\tvar iNode = getLibraryNode( url );\n\n\t\t\t\t\tif ( iNode ) {\n\n\t\t\t\t\t\tthis.nodes.push( ( new Node() ).parse( iNode )) ;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rotate':\n\t\t\t\tcase 'translate':\n\t\t\t\tcase 'scale':\n\t\t\t\tcase 'matrix':\n\t\t\t\tcase 'lookat':\n\t\t\t\tcase 'skew':\n\n\t\t\t\t\tthis.transforms.push( ( new Transform() ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'extra':\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.channels = getChannelsForNode( this );\n\t\tbakeAnimations( this );\n\n\t\tthis.updateMatrix();\n\n\t\treturn this;\n\n\t};\n\n\tNode.prototype.updateMatrix = function () {\n\n\t\tthis.matrix.identity();\n\n\t\tfor ( var i = 0; i < this.transforms.length; i ++ ) {\n\n\t\t\tthis.transforms[ i ].apply( this.matrix );\n\n\t\t}\n\n\t};\n\n\tfunction Transform () {\n\n\t\tthis.sid = \"\";\n\t\tthis.type = \"\";\n\t\tthis.data = [];\n\t\tthis.obj = null;\n\n\t};\n\n\tTransform.prototype.parse = function ( element ) {\n\n\t\tthis.sid = element.getAttribute( 'sid' );\n\t\tthis.type = element.nodeName;\n\t\tthis.data = _floats( element.textContent );\n\t\tthis.convert();\n\n\t\treturn this;\n\n\t};\n\n\tTransform.prototype.convert = function () {\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase 'matrix':\n\n\t\t\t\tthis.obj = getConvertedMat4( this.data );\n\t\t\t\tbreak;\n\n\t\t\tcase 'rotate':\n\n\t\t\t\tthis.angle = THREE.Math.degToRad( this.data[3] );\n\n\t\t\tcase 'translate':\n\n\t\t\t\tfixCoords( this.data, -1 );\n\t\t\t\tthis.obj = new THREE.Vector3( this.data[ 0 ], this.data[ 1 ], this.data[ 2 ] );\n\t\t\t\tbreak;\n\n\t\t\tcase 'scale':\n\n\t\t\t\tfixCoords( this.data, 1 );\n\t\t\t\tthis.obj = new THREE.Vector3( this.data[ 0 ], this.data[ 1 ], this.data[ 2 ] );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.log( 'Can not convert Transform of type ' + this.type );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tTransform.prototype.apply = function () {\n\n\t\tvar m1 = new THREE.Matrix4();\n\n\t\treturn function ( matrix ) {\n\n\t\t\tswitch ( this.type ) {\n\n\t\t\t\tcase 'matrix':\n\n\t\t\t\t\tmatrix.multiply( this.obj );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'translate':\n\n\t\t\t\t\tmatrix.multiply( m1.makeTranslation( this.obj.x, this.obj.y, this.obj.z ) );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rotate':\n\n\t\t\t\t\tmatrix.multiply( m1.makeRotationAxis( this.obj, this.angle ) );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'scale':\n\n\t\t\t\t\tmatrix.scale( this.obj );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tTransform.prototype.update = function ( data, member ) {\n\n\t\tvar members = [ 'X', 'Y', 'Z', 'ANGLE' ];\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase 'matrix':\n\n\t\t\t\tif ( ! member ) {\n\n\t\t\t\t\tthis.obj.copy( data );\n\n\t\t\t\t} else if ( member.length === 1 ) {\n\n\t\t\t\t\tswitch ( member[ 0 ] ) {\n\n\t\t\t\t\t\tcase 0:\n\n\t\t\t\t\t\t\tthis.obj.n11 = data[ 0 ];\n\t\t\t\t\t\t\tthis.obj.n21 = data[ 1 ];\n\t\t\t\t\t\t\tthis.obj.n31 = data[ 2 ];\n\t\t\t\t\t\t\tthis.obj.n41 = data[ 3 ];\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tthis.obj.n12 = data[ 0 ];\n\t\t\t\t\t\t\tthis.obj.n22 = data[ 1 ];\n\t\t\t\t\t\t\tthis.obj.n32 = data[ 2 ];\n\t\t\t\t\t\t\tthis.obj.n42 = data[ 3 ];\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tthis.obj.n13 = data[ 0 ];\n\t\t\t\t\t\t\tthis.obj.n23 = data[ 1 ];\n\t\t\t\t\t\t\tthis.obj.n33 = data[ 2 ];\n\t\t\t\t\t\t\tthis.obj.n43 = data[ 3 ];\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 3:\n\n\t\t\t\t\t\t\tthis.obj.n14 = data[ 0 ];\n\t\t\t\t\t\t\tthis.obj.n24 = data[ 1 ];\n\t\t\t\t\t\t\tthis.obj.n34 = data[ 2 ];\n\t\t\t\t\t\t\tthis.obj.n44 = data[ 3 ];\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( member.length === 2 ) {\n\n\t\t\t\t\tvar propName = 'n' + ( member[ 0 ] + 1 ) + ( member[ 1 ] + 1 );\n\t\t\t\t\tthis.obj[ propName ] = data;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.log('Incorrect addressing of matrix in transform.');\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\n\t\t\t\tif ( Object.prototype.toString.call( member ) === '[object Array]' ) {\n\n\t\t\t\t\tmember = members[ member[ 0 ] ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( member ) {\n\n\t\t\t\t\tcase 'X':\n\n\t\t\t\t\t\tthis.obj.x = data;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Y':\n\n\t\t\t\t\t\tthis.obj.y = data;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\n\t\t\t\t\t\tthis.obj.z = data;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tthis.obj.x = data[ 0 ];\n\t\t\t\t\t\tthis.obj.y = data[ 1 ];\n\t\t\t\t\t\tthis.obj.z = data[ 2 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'rotate':\n\n\t\t\t\tif ( Object.prototype.toString.call( member ) === '[object Array]' ) {\n\n\t\t\t\t\tmember = members[ member[ 0 ] ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( member ) {\n\n\t\t\t\t\tcase 'X':\n\n\t\t\t\t\t\tthis.obj.x = data;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Y':\n\n\t\t\t\t\t\tthis.obj.y = data;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\n\t\t\t\t\t\tthis.obj.z = data;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ANGLE':\n\n\t\t\t\t\t\tthis.angle = THREE.Math.degToRad( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tthis.obj.x = data[ 0 ];\n\t\t\t\t\t\tthis.obj.y = data[ 1 ];\n\t\t\t\t\t\tthis.obj.z = data[ 2 ];\n\t\t\t\t\t\tthis.angle = THREE.Math.degToRad( data[ 3 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction InstanceController() {\n\n\t\tthis.url = \"\";\n\t\tthis.skeleton = [];\n\t\tthis.instance_material = [];\n\n\t};\n\n\tInstanceController.prototype.parse = function ( element ) {\n\n\t\tthis.url = element.getAttribute('url').replace(/^#/, '');\n\t\tthis.skeleton = [];\n\t\tthis.instance_material = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'skeleton':\n\n\t\t\t\t\tthis.skeleton.push( child.textContent.replace(/^#/, '') );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bind_material':\n\n\t\t\t\t\tvar instances = child.querySelectorAll('instance_material');\n\n\t\t\t\t\tfor ( var j = 0; j < instances.length; j ++ ){\n\n\t\t\t\t\t\tvar instance = instances[j];\n\t\t\t\t\t\tthis.instance_material.push( (new InstanceMaterial()).parse(instance) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'extra':\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction InstanceMaterial () {\n\n\t\tthis.symbol = \"\";\n\t\tthis.target = \"\";\n\n\t};\n\n\tInstanceMaterial.prototype.parse = function ( element ) {\n\n\t\tthis.symbol = element.getAttribute('symbol');\n\t\tthis.target = element.getAttribute('target').replace(/^#/, '');\n\t\treturn this;\n\n\t};\n\n\tfunction InstanceGeometry() {\n\n\t\tthis.url = \"\";\n\t\tthis.instance_material = [];\n\n\t};\n\n\tInstanceGeometry.prototype.parse = function ( element ) {\n\n\t\tthis.url = element.getAttribute('url').replace(/^#/, '');\n\t\tthis.instance_material = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tif ( child.nodeName == 'bind_material' ) {\n\n\t\t\t\tvar instances = child.querySelectorAll('instance_material');\n\n\t\t\t\tfor ( var j = 0; j < instances.length; j ++ ) {\n\n\t\t\t\t\tvar instance = instances[j];\n\t\t\t\t\tthis.instance_material.push( (new InstanceMaterial()).parse(instance) );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Geometry() {\n\n\t\tthis.id = \"\";\n\t\tthis.mesh = null;\n\n\t};\n\n\tGeometry.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute('id');\n\n\t\textractDoubleSided( this, element );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'mesh':\n\n\t\t\t\t\tthis.mesh = (new Mesh(this)).parse(child);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'extra':\n\n\t\t\t\t\t// console.log( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Mesh( geometry ) {\n\n\t\tthis.geometry = geometry.id;\n\t\tthis.primitives = [];\n\t\tthis.vertices = null;\n\t\tthis.geometry3js = null;\n\n\t};\n\n\tMesh.prototype.parse = function( element ) {\n\n\t\tthis.primitives = [];\n\n\t\tvar i, j;\n\n\t\tfor ( i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'source':\n\n\t\t\t\t\t_source( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'vertices':\n\n\t\t\t\t\tthis.vertices = ( new Vertices() ).parse( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'triangles':\n\n\t\t\t\t\tthis.primitives.push( ( new Triangles().parse( child ) ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygons':\n\n\t\t\t\t\tthis.primitives.push( ( new Polygons().parse( child ) ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polylist':\n\n\t\t\t\t\tthis.primitives.push( ( new Polylist().parse( child ) ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.geometry3js = new THREE.Geometry();\n\n\t\tvar vertexData = sources[ this.vertices.input['POSITION'].source ].data;\n\n\t\tfor ( i = 0; i < vertexData.length; i += 3 ) {\n\n\t\t\tthis.geometry3js.vertices.push( getConvertedVec3( vertexData, i ).clone() );\n\n\t\t}\n\n\t\tfor ( i = 0; i < this.primitives.length; i ++ ) {\n\n\t\t\tvar primitive = this.primitives[ i ];\n\t\t\tprimitive.setVertices( this.vertices );\n\t\t\tthis.handlePrimitive( primitive, this.geometry3js );\n\n\t\t}\n\n\t\tthis.geometry3js.computeFaceNormals();\n\n\t\tif ( this.geometry3js.calcNormals ) {\n\n\t\t\tthis.geometry3js.computeVertexNormals();\n\t\t\tdelete this.geometry3js.calcNormals;\n\n\t\t}\n\n\t\t// this.geometry3js.computeBoundingBox();\n\n\t\treturn this;\n\n\t};\n\n\tMesh.prototype.handlePrimitive = function( primitive, geom ) {\n\n\t\tvar j, k, pList = primitive.p, inputs = primitive.inputs;\n\t\tvar input, index, idx32;\n\t\tvar source, numParams;\n\t\tvar vcIndex = 0, vcount = 3, maxOffset = 0;\n\t\tvar texture_sets = [];\n\n\t\tfor ( j = 0; j < inputs.length; j ++ ) {\n\n\t\t\tinput = inputs[ j ];\n\n\t\t\tvar offset = input.offset + 1;\n\t\t\tmaxOffset = (maxOffset < offset)? offset : maxOffset;\n\n\t\t\tswitch ( input.semantic ) {\n\n\t\t\t\tcase 'TEXCOORD':\n\t\t\t\t\ttexture_sets.push( input.set );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var pCount = 0; pCount < pList.length; ++pCount ) {\n\n\t\t\tvar p = pList[ pCount ], i = 0;\n\n\t\t\twhile ( i < p.length ) {\n\n\t\t\t\tvar vs = [];\n\t\t\t\tvar ns = [];\n\t\t\t\tvar ts = null;\n\t\t\t\tvar cs = [];\n\n\t\t\t\tif ( primitive.vcount ) {\n\n\t\t\t\t\tvcount = primitive.vcount.length ? primitive.vcount[ vcIndex ++ ] : primitive.vcount;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvcount = p.length / maxOffset;\n\n\t\t\t\t}\n\n\n\t\t\t\tfor ( j = 0; j < vcount; j ++ ) {\n\n\t\t\t\t\tfor ( k = 0; k < inputs.length; k ++ ) {\n\n\t\t\t\t\t\tinput = inputs[ k ];\n\t\t\t\t\t\tsource = sources[ input.source ];\n\n\t\t\t\t\t\tindex = p[ i + ( j * maxOffset ) + input.offset ];\n\t\t\t\t\t\tnumParams = source.accessor.params.length;\n\t\t\t\t\t\tidx32 = index * numParams;\n\n\t\t\t\t\t\tswitch ( input.semantic ) {\n\n\t\t\t\t\t\t\tcase 'VERTEX':\n\n\t\t\t\t\t\t\t\tvs.push( index );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'NORMAL':\n\n\t\t\t\t\t\t\t\tns.push( getConvertedVec3( source.data, idx32 ) );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'TEXCOORD':\n\n\t\t\t\t\t\t\t\tts = ts || { };\n\t\t\t\t\t\t\t\tif ( ts[ input.set ] === undefined ) ts[ input.set ] = [];\n\t\t\t\t\t\t\t\t// invert the V\n\t\t\t\t\t\t\t\tts[ input.set ].push( new THREE.Vector2( source.data[ idx32 ], source.data[ idx32 + 1 ] ) );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'COLOR':\n\n\t\t\t\t\t\t\t\tcs.push( new THREE.Color().setRGB( source.data[ idx32 ], source.data[ idx32 + 1 ], source.data[ idx32 + 2 ] ) );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ns.length == 0 ) {\n\n\t\t\t\t\t// check the vertices inputs\n\t\t\t\t\tinput = this.vertices.input.NORMAL;\n\n\t\t\t\t\tif ( input ) {\n\n\t\t\t\t\t\tsource = sources[ input.source ];\n\t\t\t\t\t\tnumParams = source.accessor.params.length;\n\n\t\t\t\t\t\tfor ( var ndx = 0, len = vs.length; ndx < len; ndx++ ) {\n\n\t\t\t\t\t\t\tns.push( getConvertedVec3( source.data, vs[ ndx ] * numParams ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgeom.calcNormals = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( !ts ) {\n\n\t\t\t\t\tts = { };\n\t\t\t\t\t// check the vertices inputs\n\t\t\t\t\tinput = this.vertices.input.TEXCOORD;\n\n\t\t\t\t\tif ( input ) {\n\n\t\t\t\t\t\ttexture_sets.push( input.set );\n\t\t\t\t\t\tsource = sources[ input.source ];\n\t\t\t\t\t\tnumParams = source.accessor.params.length;\n\n\t\t\t\t\t\tfor ( var ndx = 0, len = vs.length; ndx < len; ndx++ ) {\n\n\t\t\t\t\t\t\tidx32 = vs[ ndx ] * numParams;\n\t\t\t\t\t\t\tif ( ts[ input.set ] === undefined ) ts[ input.set ] = [ ];\n\t\t\t\t\t\t\t// invert the V\n\t\t\t\t\t\t\tts[ input.set ].push( new THREE.Vector2( source.data[ idx32 ], 1.0 - source.data[ idx32 + 1 ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( cs.length == 0 ) {\n\n\t\t\t\t\t// check the vertices inputs\n\t\t\t\t\tinput = this.vertices.input.COLOR;\n\n\t\t\t\t\tif ( input ) {\n\n\t\t\t\t\t\tsource = sources[ input.source ];\n\t\t\t\t\t\tnumParams = source.accessor.params.length;\n\n\t\t\t\t\t\tfor ( var ndx = 0, len = vs.length; ndx < len; ndx++ ) {\n\n\t\t\t\t\t\t\tidx32 = vs[ ndx ] * numParams;\n\t\t\t\t\t\t\tcs.push( new THREE.Color().setRGB( source.data[ idx32 ], source.data[ idx32 + 1 ], source.data[ idx32 + 2 ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar face = null, faces = [], uv, uvArr;\n\n\t\t\t\tif ( vcount === 3 ) {\n\n\t\t\t\t\tfaces.push( new THREE.Face3( vs[0], vs[1], vs[2], ns, cs.length ? cs : new THREE.Color() ) );\n\n\t\t\t\t} else if ( vcount === 4 ) {\n\n\t\t\t\t\tfaces.push( new THREE.Face3( vs[0], vs[1], vs[3], [ns[0], ns[1], ns[3]], cs.length ? [cs[0], cs[1], cs[3]] : new THREE.Color() ) );\n\n\t\t\t\t\tfaces.push( new THREE.Face3( vs[1], vs[2], vs[3], [ns[1], ns[2], ns[3]], cs.length ? [cs[1], cs[2], cs[3]] : new THREE.Color() ) );\n\n\t\t\t\t} else if ( vcount > 4 && options.subdivideFaces ) {\n\n\t\t\t\t\tvar clr = cs.length ? cs : new THREE.Color(),\n\t\t\t\t\t\tvec1, vec2, vec3, v1, v2, norm;\n\n\t\t\t\t\t// subdivide into multiple Face3s\n\n\t\t\t\t\tfor ( k = 1; k < vcount - 1; ) {\n\n\t\t\t\t\t\t// FIXME: normals don't seem to be quite right\n\n\t\t\t\t\t\tfaces.push( new THREE.Face3( vs[0], vs[k], vs[k+1], [ ns[0], ns[k++], ns[k] ], clr ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( faces.length ) {\n\n\t\t\t\t\tfor ( var ndx = 0, len = faces.length; ndx < len; ndx ++ ) {\n\n\t\t\t\t\t\tface = faces[ndx];\n\t\t\t\t\t\tface.daeMaterial = primitive.material;\n\t\t\t\t\t\tgeom.faces.push( face );\n\n\t\t\t\t\t\tfor ( k = 0; k < texture_sets.length; k++ ) {\n\n\t\t\t\t\t\t\tuv = ts[ texture_sets[k] ];\n\n\t\t\t\t\t\t\tif ( vcount > 4 ) {\n\n\t\t\t\t\t\t\t\t// Grab the right UVs for the vertices in this face\n\t\t\t\t\t\t\t\tuvArr = [ uv[0], uv[ndx+1], uv[ndx+2] ];\n\n\t\t\t\t\t\t\t} else if ( vcount === 4 ) {\n\n\t\t\t\t\t\t\t\tif ( ndx === 0 ) {\n\n\t\t\t\t\t\t\t\t\tuvArr = [ uv[0], uv[1], uv[3] ];\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tuvArr = [ uv[1].clone(), uv[2], uv[3].clone() ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tuvArr = [ uv[0], uv[1], uv[2] ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( geom.faceVertexUvs[k] === undefined ) {\n\n\t\t\t\t\t\t\t\tgeom.faceVertexUvs[k] = [];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tgeom.faceVertexUvs[k].push( uvArr );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.log( 'dropped face with vcount ' + vcount + ' for geometry with id: ' + geom.id );\n\n\t\t\t\t}\n\n\t\t\t\ti += maxOffset * vcount;\n\n\t\t\t}\n\t\t}\n\n\t};\n\n\tfunction Polygons () {\n\n\t\tthis.material = \"\";\n\t\tthis.count = 0;\n\t\tthis.inputs = [];\n\t\tthis.vcount = null;\n\t\tthis.p = [];\n\t\tthis.geometry = new THREE.Geometry();\n\n\t};\n\n\tPolygons.prototype.setVertices = function ( vertices ) {\n\n\t\tfor ( var i = 0; i < this.inputs.length; i ++ ) {\n\n\t\t\tif ( this.inputs[ i ].source == vertices.id ) {\n\n\t\t\t\tthis.inputs[ i ].source = vertices.input[ 'POSITION' ].source;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPolygons.prototype.parse = function ( element ) {\n\n\t\tthis.material = element.getAttribute( 'material' );\n\t\tthis.count = _attr_as_int( element, 'count', 0 );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'input':\n\n\t\t\t\t\tthis.inputs.push( ( new Input() ).parse( element.childNodes[ i ] ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'vcount':\n\n\t\t\t\t\tthis.vcount = _ints( child.textContent );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'p':\n\n\t\t\t\t\tthis.p.push( _ints( child.textContent ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ph':\n\n\t\t\t\t\tconsole.warn( 'polygon holes not yet supported!' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Polylist () {\n\n\t\tPolygons.call( this );\n\n\t\tthis.vcount = [];\n\n\t};\n\n\tPolylist.prototype = Object.create( Polygons.prototype );\n\n\tfunction Triangles () {\n\n\t\tPolygons.call( this );\n\n\t\tthis.vcount = 3;\n\n\t};\n\n\tTriangles.prototype = Object.create( Polygons.prototype );\n\n\tfunction Accessor() {\n\n\t\tthis.source = \"\";\n\t\tthis.count = 0;\n\t\tthis.stride = 0;\n\t\tthis.params = [];\n\n\t};\n\n\tAccessor.prototype.parse = function ( element ) {\n\n\t\tthis.params = [];\n\t\tthis.source = element.getAttribute( 'source' );\n\t\tthis.count = _attr_as_int( element, 'count', 0 );\n\t\tthis.stride = _attr_as_int( element, 'stride', 0 );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tif ( child.nodeName == 'param' ) {\n\n\t\t\t\tvar param = {};\n\t\t\t\tparam[ 'name' ] = child.getAttribute( 'name' );\n\t\t\t\tparam[ 'type' ] = child.getAttribute( 'type' );\n\t\t\t\tthis.params.push( param );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Vertices() {\n\n\t\tthis.input = {};\n\n\t};\n\n\tVertices.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute('id');\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tif ( element.childNodes[i].nodeName == 'input' ) {\n\n\t\t\t\tvar input = ( new Input() ).parse( element.childNodes[ i ] );\n\t\t\t\tthis.input[ input.semantic ] = input;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Input () {\n\n\t\tthis.semantic = \"\";\n\t\tthis.offset = 0;\n\t\tthis.source = \"\";\n\t\tthis.set = 0;\n\n\t};\n\n\tInput.prototype.parse = function ( element ) {\n\n\t\tthis.semantic = element.getAttribute('semantic');\n\t\tthis.source = element.getAttribute('source').replace(/^#/, '');\n\t\tthis.set = _attr_as_int(element, 'set', -1);\n\t\tthis.offset = _attr_as_int(element, 'offset', 0);\n\n\t\tif ( this.semantic == 'TEXCOORD' && this.set < 0 ) {\n\n\t\t\tthis.set = 0;\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Source ( id ) {\n\n\t\tthis.id = id;\n\t\tthis.type = null;\n\n\t};\n\n\tSource.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'bool_array':\n\n\t\t\t\t\tthis.data = _bools( child.textContent );\n\t\t\t\t\tthis.type = child.nodeName;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'float_array':\n\n\t\t\t\t\tthis.data = _floats( child.textContent );\n\t\t\t\t\tthis.type = child.nodeName;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'int_array':\n\n\t\t\t\t\tthis.data = _ints( child.textContent );\n\t\t\t\t\tthis.type = child.nodeName;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'IDREF_array':\n\t\t\t\tcase 'Name_array':\n\n\t\t\t\t\tthis.data = _strings( child.textContent );\n\t\t\t\t\tthis.type = child.nodeName;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'technique_common':\n\n\t\t\t\t\tfor ( var j = 0; j < child.childNodes.length; j ++ ) {\n\n\t\t\t\t\t\tif ( child.childNodes[ j ].nodeName == 'accessor' ) {\n\n\t\t\t\t\t\t\tthis.accessor = ( new Accessor() ).parse( child.childNodes[ j ] );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log(child.nodeName);\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tSource.prototype.read = function () {\n\n\t\tvar result = [];\n\n\t\t//for (var i = 0; i < this.accessor.params.length; i++) {\n\n\t\t\tvar param = this.accessor.params[ 0 ];\n\n\t\t\t//console.log(param.name + \" \" + param.type);\n\n\t\t\tswitch ( param.type ) {\n\n\t\t\t\tcase 'IDREF':\n\t\t\t\tcase 'Name': case 'name':\n\t\t\t\tcase 'float':\n\n\t\t\t\t\treturn this.data;\n\n\t\t\t\tcase 'float4x4':\n\n\t\t\t\t\tfor ( var j = 0; j < this.data.length; j += 16 ) {\n\n\t\t\t\t\t\tvar s = this.data.slice( j, j + 16 );\n\t\t\t\t\t\tvar m = getConvertedMat4( s );\n\t\t\t\t\t\tresult.push( m );\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( 'ColladaLoader: Source: Read dont know how to read ' + param.type + '.' );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t//}\n\n\t\treturn result;\n\n\t};\n\n\tfunction Material () {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.instance_effect = null;\n\n\t};\n\n\tMaterial.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.name = element.getAttribute( 'name' );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tif ( element.childNodes[ i ].nodeName == 'instance_effect' ) {\n\n\t\t\t\tthis.instance_effect = ( new InstanceEffect() ).parse( element.childNodes[ i ] );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction ColorOrTexture () {\n\n\t\tthis.color = new THREE.Color();\n\t\tthis.color.setRGB( Math.random(), Math.random(), Math.random() );\n\t\tthis.color.a = 1.0;\n\n\t\tthis.texture = null;\n\t\tthis.texcoord = null;\n\t\tthis.texOpts = null;\n\n\t};\n\n\tColorOrTexture.prototype.isColor = function () {\n\n\t\treturn ( this.texture == null );\n\n\t};\n\n\tColorOrTexture.prototype.isTexture = function () {\n\n\t\treturn ( this.texture != null );\n\n\t};\n\n\tColorOrTexture.prototype.parse = function ( element ) {\n\n\t\tif (element.nodeName == 'transparent') {\n\n\t\t\tthis.opaque = element.getAttribute('opaque');\n\n\t\t}\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'color':\n\n\t\t\t\t\tvar rgba = _floats( child.textContent );\n\t\t\t\t\tthis.color = new THREE.Color();\n\t\t\t\t\tthis.color.setRGB( rgba[0], rgba[1], rgba[2] );\n\t\t\t\t\tthis.color.a = rgba[3];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\n\t\t\t\t\tthis.texture = child.getAttribute('texture');\n\t\t\t\t\tthis.texcoord = child.getAttribute('texcoord');\n\t\t\t\t\t// Defaults from:\n\t\t\t\t\t// https://collada.org/mediawiki/index.php/Maya_texture_placement_MAYA_extension\n\t\t\t\t\tthis.texOpts = {\n\t\t\t\t\t\toffsetU: 0,\n\t\t\t\t\t\toffsetV: 0,\n\t\t\t\t\t\trepeatU: 1,\n\t\t\t\t\t\trepeatV: 1,\n\t\t\t\t\t\twrapU: 1,\n\t\t\t\t\t\twrapV: 1\n\t\t\t\t\t};\n\t\t\t\t\tthis.parseTexture( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tColorOrTexture.prototype.parseTexture = function ( element ) {\n\n\t\tif ( ! element.childNodes ) return this;\n\n\t\t// This should be supported by Maya, 3dsMax, and MotionBuilder\n\n\t\tif ( element.childNodes[1] && element.childNodes[1].nodeName === 'extra' ) {\n\n\t\t\telement = element.childNodes[1];\n\n\t\t\tif ( element.childNodes[1] && element.childNodes[1].nodeName === 'technique' ) {\n\n\t\t\t\telement = element.childNodes[1];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'offsetU':\n\t\t\t\tcase 'offsetV':\n\t\t\t\tcase 'repeatU':\n\t\t\t\tcase 'repeatV':\n\n\t\t\t\t\tthis.texOpts[ child.nodeName ] = parseFloat( child.textContent );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wrapU':\n\t\t\t\tcase 'wrapV':\n\n\t\t\t\t\t// some dae have a value of true which becomes NaN via parseInt\n\n\t\t\t\t\tif ( child.textContent.toUpperCase() === 'TRUE' ) {\n\n\t\t\t\t\t\tthis.texOpts[ child.nodeName ] = 1;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.texOpts[ child.nodeName ] = parseInt( child.textContent );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.texOpts[ child.nodeName ] = child.textContent;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Shader ( type, effect ) {\n\n\t\tthis.type = type;\n\t\tthis.effect = effect;\n\t\tthis.material = null;\n\n\t};\n\n\tShader.prototype.parse = function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'ambient':\n\t\t\t\tcase 'emission':\n\t\t\t\tcase 'diffuse':\n\t\t\t\tcase 'specular':\n\t\t\t\tcase 'transparent':\n\n\t\t\t\t\tthis[ child.nodeName ] = ( new ColorOrTexture() ).parse( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bump':\n\n\t\t\t\t\t// If 'bumptype' is 'heightfield', create a 'bump' property\n\t\t\t\t\t// Else if 'bumptype' is 'normalmap', create a 'normal' property\n\t\t\t\t\t// (Default to 'bump')\n\t\t\t\t\tvar bumpType = child.getAttribute( 'bumptype' );\n\t\t\t\t\tif ( bumpType ) {\n\t\t\t\t\t\tif ( bumpType.toLowerCase() === \"heightfield\" ) {\n\t\t\t\t\t\t\tthis[ 'bump' ] = ( new ColorOrTexture() ).parse( child );\n\t\t\t\t\t\t} else if ( bumpType.toLowerCase() === \"normalmap\" ) {\n\t\t\t\t\t\t\tthis[ 'normal' ] = ( new ColorOrTexture() ).parse( child );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error( \"Shader.prototype.parse: Invalid value for attribute 'bumptype' (\" + bumpType +\n\t\t\t\t\t\t\t\t \") - valid bumptypes are 'HEIGHTFIELD' and 'NORMALMAP' - defaulting to 'HEIGHTFIELD'\" );\n\t\t\t\t\t\t\tthis[ 'bump' ] = ( new ColorOrTexture() ).parse( child );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn( \"Shader.prototype.parse: Attribute 'bumptype' missing from bump node - defaulting to 'HEIGHTFIELD'\" );\n\t\t\t\t\t\tthis[ 'bump' ] = ( new ColorOrTexture() ).parse( child );\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'shininess':\n\t\t\t\tcase 'reflectivity':\n\t\t\t\tcase 'index_of_refraction':\n\t\t\t\tcase 'transparency':\n\n\t\t\t\t\tvar f = child.querySelectorAll('float');\n\n\t\t\t\t\tif ( f.length > 0 )\n\t\t\t\t\t\tthis[ child.nodeName ] = parseFloat( f[ 0 ].textContent );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.create();\n\t\treturn this;\n\n\t};\n\n\tShader.prototype.create = function() {\n\n\t\tvar props = {};\n\n\t\tvar transparent = false;\n\n\t\tif (this['transparency'] !== undefined && this['transparent'] !== undefined) {\n\t\t\t// convert transparent color RBG to average value\n\t\t\tvar transparentColor = this['transparent'];\n\t\t\tvar transparencyLevel = (this.transparent.color.r + this.transparent.color.g + this.transparent.color.b) / 3 * this.transparency;\n\n\t\t\tif (transparencyLevel > 0) {\n\t\t\t\ttransparent = true;\n\t\t\t\tprops[ 'transparent' ] = true;\n\t\t\t\tprops[ 'opacity' ] = 1 - transparencyLevel;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar keys = {\n\t\t\t'diffuse':'map',\n\t\t\t'ambient':'lightMap' ,\n\t\t\t'specular':'specularMap',\n\t\t\t'emission':'emissionMap',\n\t\t\t'bump':'bumpMap',\n\t\t\t'normal':'normalMap'\n\t\t\t};\n\n\t\tfor ( var prop in this ) {\n\n\t\t\tswitch ( prop ) {\n\n\t\t\t\tcase 'ambient':\n\t\t\t\tcase 'emission':\n\t\t\t\tcase 'diffuse':\n\t\t\t\tcase 'specular':\n\t\t\t\tcase 'bump':\n\t\t\t\tcase 'normal':\n\n\t\t\t\t\tvar cot = this[ prop ];\n\n\t\t\t\t\tif ( cot instanceof ColorOrTexture ) {\n\n\t\t\t\t\t\tif ( cot.isTexture() ) {\n\n\t\t\t\t\t\t\tvar samplerId = cot.texture;\n\t\t\t\t\t\t\tvar surfaceId = this.effect.sampler[samplerId];\n\n\t\t\t\t\t\t\tif ( surfaceId !== undefined && surfaceId.source !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar surface = this.effect.surface[surfaceId.source];\n\t\t\t\t\t\t\t\tvar image = images[surface.init_from];\n\n\t\t\t\t\t\t\t\tif (image) {\n\n\t\t\t\t\t\t\t\t\tvar url = baseUrl + image.init_from;\n\n\t\t\t\t\t\t\t\t\tvar texture;\n\t\t\t\t\t\t\t\t\tvar loader = THREE.Loader.Handlers.get( url );\n\n\t\t\t\t\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\t\t\t\t\ttexture = loader.load( url );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttexture = new THREE.Texture();\n\t\t\t\t\t\t\t\t\t\tloader = new THREE.ImageLoader();\n\t\t\t\t\t\t\t\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.image = image;\n\t\t\t\t\t\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\ttexture.wrapS = cot.texOpts.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;\n\t\t\t\t\t\t\t\t\ttexture.wrapT = cot.texOpts.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;\n\t\t\t\t\t\t\t\t\ttexture.offset.x = cot.texOpts.offsetU;\n\t\t\t\t\t\t\t\t\ttexture.offset.y = cot.texOpts.offsetV;\n\t\t\t\t\t\t\t\t\ttexture.repeat.x = cot.texOpts.repeatU;\n\t\t\t\t\t\t\t\t\ttexture.repeat.y = cot.texOpts.repeatV;\n\t\t\t\t\t\t\t\t\tprops[keys[prop]] = texture;\n\n\t\t\t\t\t\t\t\t\t// Texture with baked lighting?\n\t\t\t\t\t\t\t\t\tif (prop === 'emission') props['emissive'] = 0xffffff;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( prop === 'diffuse' || !transparent ) {\n\n\t\t\t\t\t\t\tif ( prop === 'emission' ) {\n\n\t\t\t\t\t\t\t\tprops[ 'emissive' ] = cot.color.getHex();\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tprops[ prop ] = cot.color.getHex();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'shininess':\n\n\t\t\t\t\tprops[ prop ] = this[ prop ];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'reflectivity':\n\n\t\t\t\t\tprops[ prop ] = this[ prop ];\n\t\t\t\t\tif( props[ prop ] > 0.0 ) props['envMap'] = options.defaultEnvMap;\n\t\t\t\t\tprops['combine'] = THREE.MixOperation;\t//mix regular shading with reflective component\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'index_of_refraction':\n\n\t\t\t\t\tprops[ 'refractionRatio' ] = this[ prop ]; //TODO: \"index_of_refraction\" becomes \"refractionRatio\" in shader, but I'm not sure if the two are actually comparable\n\t\t\t\t\tif ( this[ prop ] !== 1.0 ) props['envMap'] = options.defaultEnvMap;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'transparency':\n\t\t\t\t\t// gets figured out up top\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tprops[ 'shading' ] = preferredShading;\n\t\tprops[ 'side' ] = this.effect.doubleSided ? THREE.DoubleSide : THREE.FrontSide;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase 'constant':\n\n\t\t\t\tif (props.emissive != undefined) props.color = props.emissive;\n\t\t\t\tthis.material = new THREE.MeshBasicMaterial( props );\n\t\t\t\tbreak;\n\n\t\t\tcase 'phong':\n\t\t\tcase 'blinn':\n\n\t\t\t\tif (props.diffuse != undefined) props.color = props.diffuse;\n\t\t\t\tthis.material = new THREE.MeshPhongMaterial( props );\n\t\t\t\tbreak;\n\n\t\t\tcase 'lambert':\n\t\t\tdefault:\n\n\t\t\t\tif (props.diffuse != undefined) props.color = props.diffuse;\n\t\t\t\tthis.material = new THREE.MeshLambertMaterial( props );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn this.material;\n\n\t};\n\n\tfunction Surface ( effect ) {\n\n\t\tthis.effect = effect;\n\t\tthis.init_from = null;\n\t\tthis.format = null;\n\n\t};\n\n\tSurface.prototype.parse = function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'init_from':\n\n\t\t\t\t\tthis.init_from = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'format':\n\n\t\t\t\t\tthis.format = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( \"unhandled Surface prop: \" + child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Sampler2D ( effect ) {\n\n\t\tthis.effect = effect;\n\t\tthis.source = null;\n\t\tthis.wrap_s = null;\n\t\tthis.wrap_t = null;\n\t\tthis.minfilter = null;\n\t\tthis.magfilter = null;\n\t\tthis.mipfilter = null;\n\n\t};\n\n\tSampler2D.prototype.parse = function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'source':\n\n\t\t\t\t\tthis.source = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'minfilter':\n\n\t\t\t\t\tthis.minfilter = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'magfilter':\n\n\t\t\t\t\tthis.magfilter = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mipfilter':\n\n\t\t\t\t\tthis.mipfilter = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wrap_s':\n\n\t\t\t\t\tthis.wrap_s = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wrap_t':\n\n\t\t\t\t\tthis.wrap_t = child.textContent;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( \"unhandled Sampler2D prop: \" + child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Effect () {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.shader = null;\n\t\tthis.surface = {};\n\t\tthis.sampler = {};\n\n\t};\n\n\tEffect.prototype.create = function () {\n\n\t\tif ( this.shader == null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\tEffect.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.name = element.getAttribute( 'name' );\n\n\t\textractDoubleSided( this, element );\n\n\t\tthis.shader = null;\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'profile_COMMON':\n\n\t\t\t\t\tthis.parseTechnique( this.parseProfileCOMMON( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tEffect.prototype.parseNewparam = function ( element ) {\n\n\t\tvar sid = element.getAttribute( 'sid' );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'surface':\n\n\t\t\t\t\tthis.surface[sid] = ( new Surface( this ) ).parse( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'sampler2D':\n\n\t\t\t\t\tthis.sampler[sid] = ( new Sampler2D( this ) ).parse( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'extra':\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tEffect.prototype.parseProfileCOMMON = function ( element ) {\n\n\t\tvar technique;\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'profile_COMMON':\n\n\t\t\t\t\tthis.parseProfileCOMMON( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'technique':\n\n\t\t\t\t\ttechnique = child;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'newparam':\n\n\t\t\t\t\tthis.parseNewparam( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'image':\n\n\t\t\t\t\tvar _image = ( new _Image() ).parse( child );\n\t\t\t\t\timages[ _image.id ] = _image;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'extra':\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log( child.nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn technique;\n\n\t};\n\n\tEffect.prototype.parseTechnique= function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'constant':\n\t\t\t\tcase 'lambert':\n\t\t\t\tcase 'blinn':\n\t\t\t\tcase 'phong':\n\n\t\t\t\t\tthis.shader = ( new Shader( child.nodeName, this ) ).parse( child );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'extra':\n\t\t\t\t\tthis.parseExtra(child);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tEffect.prototype.parseExtra = function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'technique':\n\t\t\t\t\tthis.parseExtraTechnique( child );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tEffect.prototype.parseExtraTechnique= function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[i];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'bump':\n\t\t\t\t\tthis.shader.parse( element );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tfunction InstanceEffect () {\n\n\t\tthis.url = \"\";\n\n\t};\n\n\tInstanceEffect.prototype.parse = function ( element ) {\n\n\t\tthis.url = element.getAttribute( 'url' ).replace( /^#/, '' );\n\t\treturn this;\n\n\t};\n\n\tfunction Animation() {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.source = {};\n\t\tthis.sampler = [];\n\t\tthis.channel = [];\n\n\t};\n\n\tAnimation.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.name = element.getAttribute( 'name' );\n\t\tthis.source = {};\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'animation':\n\n\t\t\t\t\tvar anim = ( new Animation() ).parse( child );\n\n\t\t\t\t\tfor ( var src in anim.source ) {\n\n\t\t\t\t\t\tthis.source[ src ] = anim.source[ src ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0; j < anim.channel.length; j ++ ) {\n\n\t\t\t\t\t\tthis.channel.push( anim.channel[ j ] );\n\t\t\t\t\t\tthis.sampler.push( anim.sampler[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'source':\n\n\t\t\t\t\tvar src = ( new Source() ).parse( child );\n\t\t\t\t\tthis.source[ src.id ] = src;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'sampler':\n\n\t\t\t\t\tthis.sampler.push( ( new Sampler( this ) ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'channel':\n\n\t\t\t\t\tthis.channel.push( ( new Channel( this ) ).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction Channel( animation ) {\n\n\t\tthis.animation = animation;\n\t\tthis.source = \"\";\n\t\tthis.target = \"\";\n\t\tthis.fullSid = null;\n\t\tthis.sid = null;\n\t\tthis.dotSyntax = null;\n\t\tthis.arrSyntax = null;\n\t\tthis.arrIndices = null;\n\t\tthis.member = null;\n\n\t};\n\n\tChannel.prototype.parse = function ( element ) {\n\n\t\tthis.source = element.getAttribute( 'source' ).replace( /^#/, '' );\n\t\tthis.target = element.getAttribute( 'target' );\n\n\t\tvar parts = this.target.split( '/' );\n\n\t\tvar id = parts.shift();\n\t\tvar sid = parts.shift();\n\n\t\tvar dotSyntax = ( sid.indexOf(\".\") >= 0 );\n\t\tvar arrSyntax = ( sid.indexOf(\"(\") >= 0 );\n\n\t\tif ( dotSyntax ) {\n\n\t\t\tparts = sid.split(\".\");\n\t\t\tthis.sid = parts.shift();\n\t\t\tthis.member = parts.shift();\n\n\t\t} else if ( arrSyntax ) {\n\n\t\t\tvar arrIndices = sid.split(\"(\");\n\t\t\tthis.sid = arrIndices.shift();\n\n\t\t\tfor (var j = 0; j < arrIndices.length; j ++ ) {\n\n\t\t\t\tarrIndices[j] = parseInt( arrIndices[j].replace(/\\)/, '') );\n\n\t\t\t}\n\n\t\t\tthis.arrIndices = arrIndices;\n\n\t\t} else {\n\n\t\t\tthis.sid = sid;\n\n\t\t}\n\n\t\tthis.fullSid = sid;\n\t\tthis.dotSyntax = dotSyntax;\n\t\tthis.arrSyntax = arrSyntax;\n\n\t\treturn this;\n\n\t};\n\n\tfunction Sampler ( animation ) {\n\n\t\tthis.id = \"\";\n\t\tthis.animation = animation;\n\t\tthis.inputs = [];\n\t\tthis.input = null;\n\t\tthis.output = null;\n\t\tthis.strideOut = null;\n\t\tthis.interpolation = null;\n\t\tthis.startTime = null;\n\t\tthis.endTime = null;\n\t\tthis.duration = 0;\n\n\t};\n\n\tSampler.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.inputs = [];\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'input':\n\n\t\t\t\t\tthis.inputs.push( (new Input()).parse( child ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tSampler.prototype.create = function () {\n\n\t\tfor ( var i = 0; i < this.inputs.length; i ++ ) {\n\n\t\t\tvar input = this.inputs[ i ];\n\t\t\tvar source = this.animation.source[ input.source ];\n\n\t\t\tswitch ( input.semantic ) {\n\n\t\t\t\tcase 'INPUT':\n\n\t\t\t\t\tthis.input = source.read();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'OUTPUT':\n\n\t\t\t\t\tthis.output = source.read();\n\t\t\t\t\tthis.strideOut = source.accessor.stride;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'INTERPOLATION':\n\n\t\t\t\t\tthis.interpolation = source.read();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'IN_TANGENT':\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'OUT_TANGENT':\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.log(input.semantic);\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.startTime = 0;\n\t\tthis.endTime = 0;\n\t\tthis.duration = 0;\n\n\t\tif ( this.input.length ) {\n\n\t\t\tthis.startTime = 100000000;\n\t\t\tthis.endTime = -100000000;\n\n\t\t\tfor ( var i = 0; i < this.input.length; i ++ ) {\n\n\t\t\t\tthis.startTime = Math.min( this.startTime, this.input[ i ] );\n\t\t\t\tthis.endTime = Math.max( this.endTime, this.input[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = this.endTime - this.startTime;\n\n\t\t}\n\n\t};\n\n\tSampler.prototype.getData = function ( type, ndx, member ) {\n\n\t\tvar data;\n\n\t\tif ( type === 'matrix' && this.strideOut === 16 ) {\n\n\t\t\tdata = this.output[ ndx ];\n\n\t\t} else if ( this.strideOut > 1 ) {\n\n\t\t\tdata = [];\n\t\t\tndx *= this.strideOut;\n\n\t\t\tfor ( var i = 0; i < this.strideOut; ++i ) {\n\n\t\t\t\tdata[ i ] = this.output[ ndx + i ];\n\n\t\t\t}\n\n\t\t\tif ( this.strideOut === 3 ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\tfixCoords( data, -1 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\tfixCoords( data, 1 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.strideOut === 4 && type === 'matrix' ) {\n\n\t\t\t\tfixCoords( data, -1 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdata = this.output[ ndx ];\n\n\t\t\tif ( member && type == 'translate' ) {\n\t\t\t\tdata = getConvertedTranslation( member, data );\n\t\t\t}\n\n\t\t}\n\n\t\treturn data;\n\n\t};\n\n\tfunction Key ( time ) {\n\n\t\tthis.targets = [];\n\t\tthis.time = time;\n\n\t};\n\n\tKey.prototype.addTarget = function ( fullSid, transform, member, data ) {\n\n\t\tthis.targets.push( {\n\t\t\tsid: fullSid,\n\t\t\tmember: member,\n\t\t\ttransform: transform,\n\t\t\tdata: data\n\t\t} );\n\n\t};\n\n\tKey.prototype.apply = function ( opt_sid ) {\n\n\t\tfor ( var i = 0; i < this.targets.length; ++i ) {\n\n\t\t\tvar target = this.targets[ i ];\n\n\t\t\tif ( !opt_sid || target.sid === opt_sid ) {\n\n\t\t\t\ttarget.transform.update( target.data, target.member );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tKey.prototype.getTarget = function ( fullSid ) {\n\n\t\tfor ( var i = 0; i < this.targets.length; ++i ) {\n\n\t\t\tif ( this.targets[ i ].sid === fullSid ) {\n\n\t\t\t\treturn this.targets[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tKey.prototype.hasTarget = function ( fullSid ) {\n\n\t\tfor ( var i = 0; i < this.targets.length; ++i ) {\n\n\t\t\tif ( this.targets[ i ].sid === fullSid ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t};\n\n\t// TODO: Currently only doing linear interpolation. Should support full COLLADA spec.\n\tKey.prototype.interpolate = function ( nextKey, time ) {\n\n\t\tfor ( var i = 0, l = this.targets.length; i < l; i ++ ) {\n\n\t\t\tvar target = this.targets[ i ],\n\t\t\t\tnextTarget = nextKey.getTarget( target.sid ),\n\t\t\t\tdata;\n\n\t\t\tif ( target.transform.type !== 'matrix' && nextTarget ) {\n\n\t\t\t\tvar scale = ( time - this.time ) / ( nextKey.time - this.time ),\n\t\t\t\t\tnextData = nextTarget.data,\n\t\t\t\t\tprevData = target.data;\n\n\t\t\t\tif ( scale < 0 ) scale = 0;\n\t\t\t\tif ( scale > 1 ) scale = 1;\n\n\t\t\t\tif ( prevData.length ) {\n\n\t\t\t\t\tdata = [];\n\n\t\t\t\t\tfor ( var j = 0; j < prevData.length; ++j ) {\n\n\t\t\t\t\t\tdata[ j ] = prevData[ j ] + ( nextData[ j ] - prevData[ j ] ) * scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdata = prevData + ( nextData - prevData ) * scale;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdata = target.data;\n\n\t\t\t}\n\n\t\t\ttarget.transform.update( data, target.member );\n\n\t\t}\n\n\t};\n\n\t// Camera\n\tfunction Camera() {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.technique = \"\";\n\n\t};\n\n\tCamera.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.name = element.getAttribute( 'name' );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'optics':\n\n\t\t\t\t\tthis.parseOptics( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tCamera.prototype.parseOptics = function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tif ( element.childNodes[ i ].nodeName == 'technique_common' ) {\n\n\t\t\t\tvar technique = element.childNodes[ i ];\n\n\t\t\t\tfor ( var j = 0; j < technique.childNodes.length; j ++ ) {\n\n\t\t\t\t\tthis.technique = technique.childNodes[ j ].nodeName;\n\n\t\t\t\t\tif ( this.technique == 'perspective' ) {\n\n\t\t\t\t\t\tvar perspective = technique.childNodes[ j ];\n\n\t\t\t\t\t\tfor ( var k = 0; k < perspective.childNodes.length; k ++ ) {\n\n\t\t\t\t\t\t\tvar param = perspective.childNodes[ k ];\n\n\t\t\t\t\t\t\tswitch ( param.nodeName ) {\n\n\t\t\t\t\t\t\t\tcase 'yfov':\n\t\t\t\t\t\t\t\t\tthis.yfov = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'xfov':\n\t\t\t\t\t\t\t\t\tthis.xfov = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'znear':\n\t\t\t\t\t\t\t\t\tthis.znear = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'zfar':\n\t\t\t\t\t\t\t\t\tthis.zfar = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'aspect_ratio':\n\t\t\t\t\t\t\t\t\tthis.aspect_ratio = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( this.technique == 'orthographic' ) {\n\n\t\t\t\t\t\tvar orthographic = technique.childNodes[ j ];\n\n\t\t\t\t\t\tfor ( var k = 0; k < orthographic.childNodes.length; k ++ ) {\n\n\t\t\t\t\t\t\tvar param = orthographic.childNodes[ k ];\n\n\t\t\t\t\t\t\tswitch ( param.nodeName ) {\n\n\t\t\t\t\t\t\t\tcase 'xmag':\n\t\t\t\t\t\t\t\t\tthis.xmag = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'ymag':\n\t\t\t\t\t\t\t\t\tthis.ymag = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'znear':\n\t\t\t\t\t\t\t\t\tthis.znear = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'zfar':\n\t\t\t\t\t\t\t\t\tthis.zfar = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'aspect_ratio':\n\t\t\t\t\t\t\t\t\tthis.aspect_ratio = param.textContent;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction InstanceCamera() {\n\n\t\tthis.url = \"\";\n\n\t};\n\n\tInstanceCamera.prototype.parse = function ( element ) {\n\n\t\tthis.url = element.getAttribute('url').replace(/^#/, '');\n\n\t\treturn this;\n\n\t};\n\n\t// Light\n\n\tfunction Light() {\n\n\t\tthis.id = \"\";\n\t\tthis.name = \"\";\n\t\tthis.technique = \"\";\n\n\t};\n\n\tLight.prototype.parse = function ( element ) {\n\n\t\tthis.id = element.getAttribute( 'id' );\n\t\tthis.name = element.getAttribute( 'name' );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\t\t\tif ( child.nodeType != 1 ) continue;\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'technique_common':\n\n\t\t\t\t\tthis.parseCommon( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'technique':\n\n\t\t\t\t\tthis.parseTechnique( child );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tLight.prototype.parseCommon = function ( element ) {\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tswitch ( element.childNodes[ i ].nodeName ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\tcase 'point':\n\t\t\t\tcase 'spot':\n\t\t\t\tcase 'ambient':\n\n\t\t\t\t\tthis.technique = element.childNodes[ i ].nodeName;\n\n\t\t\t\t\tvar light = element.childNodes[ i ];\n\n\t\t\t\t\tfor ( var j = 0; j < light.childNodes.length; j ++ ) {\n\n\t\t\t\t\t\tvar child = light.childNodes[j];\n\n\t\t\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\t\t\tcase 'color':\n\n\t\t\t\t\t\t\t\tvar rgba = _floats( child.textContent );\n\t\t\t\t\t\t\t\tthis.color = new THREE.Color(0);\n\t\t\t\t\t\t\t\tthis.color.setRGB( rgba[0], rgba[1], rgba[2] );\n\t\t\t\t\t\t\t\tthis.color.a = rgba[3];\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'falloff_angle':\n\n\t\t\t\t\t\t\t\tthis.falloff_angle = parseFloat( child.textContent );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'quadratic_attenuation':\n\t\t\t\t\t\t\t\tvar f = parseFloat( child.textContent );\n\t\t\t\t\t\t\t\tthis.distance = f ? Math.sqrt( 1/f ) : 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tLight.prototype.parseTechnique = function ( element ) {\n\n\t\tthis.profile = element.getAttribute( 'profile' );\n\n\t\tfor ( var i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tvar child = element.childNodes[ i ];\n\n\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\tcase 'intensity':\n\n\t\t\t\t\tthis.intensity = parseFloat(child.textContent);\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tfunction InstanceLight() {\n\n\t\tthis.url = \"\";\n\n\t};\n\n\tInstanceLight.prototype.parse = function ( element ) {\n\n\t\tthis.url = element.getAttribute('url').replace(/^#/, '');\n\n\t\treturn this;\n\n\t};\n\n\tfunction _source( element ) {\n\n\t\tvar id = element.getAttribute( 'id' );\n\n\t\tif ( sources[ id ] != undefined ) {\n\n\t\t\treturn sources[ id ];\n\n\t\t}\n\n\t\tsources[ id ] = ( new Source(id )).parse( element );\n\t\treturn sources[ id ];\n\n\t};\n\n\tfunction _nsResolver( nsPrefix ) {\n\n\t\tif ( nsPrefix == \"dae\" ) {\n\n\t\t\treturn \"http://www.collada.org/2005/11/COLLADASchema\";\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tfunction _bools( str ) {\n\n\t\tvar raw = _strings( str );\n\t\tvar data = [];\n\n\t\tfor ( var i = 0, l = raw.length; i < l; i ++ ) {\n\n\t\t\tdata.push( (raw[i] == 'true' || raw[i] == '1') ? true : false );\n\n\t\t}\n\n\t\treturn data;\n\n\t};\n\n\tfunction _floats( str ) {\n\n\t\tvar raw = _strings(str);\n\t\tvar data = [];\n\n\t\tfor ( var i = 0, l = raw.length; i < l; i ++ ) {\n\n\t\t\tdata.push( parseFloat( raw[ i ] ) );\n\n\t\t}\n\n\t\treturn data;\n\n\t};\n\n\tfunction _ints( str ) {\n\n\t\tvar raw = _strings( str );\n\t\tvar data = [];\n\n\t\tfor ( var i = 0, l = raw.length; i < l; i ++ ) {\n\n\t\t\tdata.push( parseInt( raw[ i ], 10 ) );\n\n\t\t}\n\n\t\treturn data;\n\n\t};\n\n\tfunction _strings( str ) {\n\n\t\treturn ( str.length > 0 ) ? _trimString( str ).split( /\\s+/ ) : [];\n\n\t};\n\n\tfunction _trimString( str ) {\n\n\t\treturn str.replace( /^\\s+/, \"\" ).replace( /\\s+$/, \"\" );\n\n\t};\n\n\tfunction _attr_as_float( element, name, defaultValue ) {\n\n\t\tif ( element.hasAttribute( name ) ) {\n\n\t\t\treturn parseFloat( element.getAttribute( name ) );\n\n\t\t} else {\n\n\t\t\treturn defaultValue;\n\n\t\t}\n\n\t};\n\n\tfunction _attr_as_int( element, name, defaultValue ) {\n\n\t\tif ( element.hasAttribute( name ) ) {\n\n\t\t\treturn parseInt( element.getAttribute( name ), 10) ;\n\n\t\t} else {\n\n\t\t\treturn defaultValue;\n\n\t\t}\n\n\t};\n\n\tfunction _attr_as_string( element, name, defaultValue ) {\n\n\t\tif ( element.hasAttribute( name ) ) {\n\n\t\t\treturn element.getAttribute( name );\n\n\t\t} else {\n\n\t\t\treturn defaultValue;\n\n\t\t}\n\n\t};\n\n\tfunction _format_float( f, num ) {\n\n\t\tif ( f === undefined ) {\n\n\t\t\tvar s = '0.';\n\n\t\t\twhile ( s.length < num + 2 ) {\n\n\t\t\t\ts += '0';\n\n\t\t\t}\n\n\t\t\treturn s;\n\n\t\t}\n\n\t\tnum = num || 2;\n\n\t\tvar parts = f.toString().split( '.' );\n\t\tparts[ 1 ] = parts.length > 1 ? parts[ 1 ].substr( 0, num ) : \"0\";\n\n\t\twhile( parts[ 1 ].length < num ) {\n\n\t\t\tparts[ 1 ] += '0';\n\n\t\t}\n\n\t\treturn parts.join( '.' );\n\n\t};\n\n\tfunction extractDoubleSided( obj, element ) {\n\n\t\tobj.doubleSided = false;\n\n\t\tvar node = element.querySelectorAll('extra double_sided')[0];\n\n\t\tif ( node ) {\n\n\t\t\tif ( node && parseInt( node.textContent, 10 ) === 1 ) {\n\n\t\t\t\tobj.doubleSided = true;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// Up axis conversion\n\n\tfunction setUpConversion() {\n\n\t\tif ( options.convertUpAxis !== true || colladaUp === options.upAxis ) {\n\n\t\t\tupConversion = null;\n\n\t\t} else {\n\n\t\t\tswitch ( colladaUp ) {\n\n\t\t\t\tcase 'X':\n\n\t\t\t\t\tupConversion = options.upAxis === 'Y' ? 'XtoY' : 'XtoZ';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Y':\n\n\t\t\t\t\tupConversion = options.upAxis === 'X' ? 'YtoX' : 'YtoZ';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Z':\n\n\t\t\t\t\tupConversion = options.upAxis === 'X' ? 'ZtoX' : 'ZtoY';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tfunction fixCoords( data, sign ) {\n\n\t\tif ( options.convertUpAxis !== true || colladaUp === options.upAxis ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tswitch ( upConversion ) {\n\n\t\t\tcase 'XtoY':\n\n\t\t\t\tvar tmp = data[ 0 ];\n\t\t\t\tdata[ 0 ] = sign * data[ 1 ];\n\t\t\t\tdata[ 1 ] = tmp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XtoZ':\n\n\t\t\t\tvar tmp = data[ 2 ];\n\t\t\t\tdata[ 2 ] = data[ 1 ];\n\t\t\t\tdata[ 1 ] = data[ 0 ];\n\t\t\t\tdata[ 0 ] = tmp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YtoX':\n\n\t\t\t\tvar tmp = data[ 0 ];\n\t\t\t\tdata[ 0 ] = data[ 1 ];\n\t\t\t\tdata[ 1 ] = sign * tmp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YtoZ':\n\n\t\t\t\tvar tmp = data[ 1 ];\n\t\t\t\tdata[ 1 ] = sign * data[ 2 ];\n\t\t\t\tdata[ 2 ] = tmp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZtoX':\n\n\t\t\t\tvar tmp = data[ 0 ];\n\t\t\t\tdata[ 0 ] = data[ 1 ];\n\t\t\t\tdata[ 1 ] = data[ 2 ];\n\t\t\t\tdata[ 2 ] = tmp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZtoY':\n\n\t\t\t\tvar tmp = data[ 1 ];\n\t\t\t\tdata[ 1 ] = data[ 2 ];\n\t\t\t\tdata[ 2 ] = sign * tmp;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction getConvertedTranslation( axis, data ) {\n\n\t\tif ( options.convertUpAxis !== true || colladaUp === options.upAxis ) {\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tswitch ( axis ) {\n\t\t\tcase 'X':\n\t\t\t\tdata = upConversion == 'XtoY' ? data * -1 : data;\n\t\t\t\tbreak;\n\t\t\tcase 'Y':\n\t\t\t\tdata = upConversion == 'YtoZ' || upConversion == 'YtoX' ? data * -1 : data;\n\t\t\t\tbreak;\n\t\t\tcase 'Z':\n\t\t\t\tdata = upConversion == 'ZtoY' ? data * -1 : data ;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn data;\n\t};\n\n\tfunction getConvertedVec3( data, offset ) {\n\n\t\tvar arr = [ data[ offset ], data[ offset + 1 ], data[ offset + 2 ] ];\n\t\tfixCoords( arr, -1 );\n\t\treturn new THREE.Vector3( arr[ 0 ], arr[ 1 ], arr[ 2 ] );\n\n\t};\n\n\tfunction getConvertedMat4( data ) {\n\n\t\tif ( options.convertUpAxis ) {\n\n\t\t\t// First fix rotation and scale\n\n\t\t\t// Columns first\n\t\t\tvar arr = [ data[ 0 ], data[ 4 ], data[ 8 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 0 ] = arr[ 0 ];\n\t\t\tdata[ 4 ] = arr[ 1 ];\n\t\t\tdata[ 8 ] = arr[ 2 ];\n\t\t\tarr = [ data[ 1 ], data[ 5 ], data[ 9 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 1 ] = arr[ 0 ];\n\t\t\tdata[ 5 ] = arr[ 1 ];\n\t\t\tdata[ 9 ] = arr[ 2 ];\n\t\t\tarr = [ data[ 2 ], data[ 6 ], data[ 10 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 2 ] = arr[ 0 ];\n\t\t\tdata[ 6 ] = arr[ 1 ];\n\t\t\tdata[ 10 ] = arr[ 2 ];\n\t\t\t// Rows second\n\t\t\tarr = [ data[ 0 ], data[ 1 ], data[ 2 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 0 ] = arr[ 0 ];\n\t\t\tdata[ 1 ] = arr[ 1 ];\n\t\t\tdata[ 2 ] = arr[ 2 ];\n\t\t\tarr = [ data[ 4 ], data[ 5 ], data[ 6 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 4 ] = arr[ 0 ];\n\t\t\tdata[ 5 ] = arr[ 1 ];\n\t\t\tdata[ 6 ] = arr[ 2 ];\n\t\t\tarr = [ data[ 8 ], data[ 9 ], data[ 10 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 8 ] = arr[ 0 ];\n\t\t\tdata[ 9 ] = arr[ 1 ];\n\t\t\tdata[ 10 ] = arr[ 2 ];\n\n\t\t\t// Now fix translation\n\t\t\tarr = [ data[ 3 ], data[ 7 ], data[ 11 ] ];\n\t\t\tfixCoords( arr, -1 );\n\t\t\tdata[ 3 ] = arr[ 0 ];\n\t\t\tdata[ 7 ] = arr[ 1 ];\n\t\t\tdata[ 11 ] = arr[ 2 ];\n\n\t\t}\n\n\t\treturn new THREE.Matrix4(\n\t\t\tdata[0], data[1], data[2], data[3],\n\t\t\tdata[4], data[5], data[6], data[7],\n\t\t\tdata[8], data[9], data[10], data[11],\n\t\t\tdata[12], data[13], data[14], data[15]\n\t\t\t);\n\n\t};\n\n\tfunction getConvertedIndex( index ) {\n\n\t\tif ( index > -1 && index < 3 ) {\n\n\t\t\tvar members = ['X', 'Y', 'Z'],\n\t\t\t\tindices = { X: 0, Y: 1, Z: 2 };\n\n\t\t\tindex = getConvertedMember( members[ index ] );\n\t\t\tindex = indices[ index ];\n\n\t\t}\n\n\t\treturn index;\n\n\t};\n\n\tfunction getConvertedMember( member ) {\n\n\t\tif ( options.convertUpAxis ) {\n\n\t\t\tswitch ( member ) {\n\n\t\t\t\tcase 'X':\n\n\t\t\t\t\tswitch ( upConversion ) {\n\n\t\t\t\t\t\tcase 'XtoY':\n\t\t\t\t\t\tcase 'XtoZ':\n\t\t\t\t\t\tcase 'YtoX':\n\n\t\t\t\t\t\t\tmember = 'Y';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ZtoX':\n\n\t\t\t\t\t\t\tmember = 'Z';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Y':\n\n\t\t\t\t\tswitch ( upConversion ) {\n\n\t\t\t\t\t\tcase 'XtoY':\n\t\t\t\t\t\tcase 'YtoX':\n\t\t\t\t\t\tcase 'ZtoX':\n\n\t\t\t\t\t\t\tmember = 'X';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'XtoZ':\n\t\t\t\t\t\tcase 'YtoZ':\n\t\t\t\t\t\tcase 'ZtoY':\n\n\t\t\t\t\t\t\tmember = 'Z';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Z':\n\n\t\t\t\t\tswitch ( upConversion ) {\n\n\t\t\t\t\t\tcase 'XtoZ':\n\n\t\t\t\t\t\t\tmember = 'X';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'YtoZ':\n\t\t\t\t\t\tcase 'ZtoX':\n\t\t\t\t\t\tcase 'ZtoY':\n\n\t\t\t\t\t\t\tmember = 'Y';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn member;\n\n\t};\n\n\treturn {\n\n\t\tload: load,\n\t\tparse: parse,\n\t\tsetPreferredShading: setPreferredShading,\n\t\tapplySkin: applySkin,\n\t\tgeometries : geometries,\n\t\toptions: options\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/DDSLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/DDSLoader.js",
"module-type": "library",
"text": "/*\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.DDSLoader = function () {};\n\nTHREE.DDSLoader.prototype = {\n\n\tconstructor: THREE.DDSLoader,\n\n\tload: function ( url, onLoad, onError ) {\n var func = \"THREE.DDSLoader.load\";\n hack.log(\"url: \"+url, hack.loader, func);\n\n\t\tvar scope = this;\n\n\t\tvar images = [];\n\n\t\tvar texture = new THREE.CompressedTexture();\n\t\ttexture.image = images;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\ttexture.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\ttexture.generateMipmaps = false;\n\n\t\tif ( url instanceof Array ) {\n\n\t\t\tvar loaded = 0;\n\n\t\t\tvar loader = new THREE.XHRLoader();\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tvar loadTexture = function ( i ) {\n\t\t\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar dds = scope.parse( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: dds.width,\n\t\t\t\t\t\theight: dds.height,\n\t\t\t\t\t\tformat: dds.format,\n\t\t\t\t\t\tmipmaps: dds.mipmaps\n\t\t\t\t\t}\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.format = dds.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tvar loader = new THREE.XHRLoader();\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar dds = scope.parse( buffer, true );\n\n\t\t\t\tif ( dds.isCubemap ) {\n\n\t\t\t\t\tvar faces = dds.mipmaps.length / dds.mipmapCount;\n\n\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\tfor ( var i = 0; i < dds.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( dds.mipmaps[ f * dds.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = dds.format;\n\t\t\t\t\t\t\timages[ f ].width = dds.width;\n\t\t\t\t\t\t\timages[ f ].height = dds.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = dds.width;\n\t\t\t\t\ttexture.image.height = dds.height;\n\t\t\t\t\ttexture.mipmaps = dds.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = dds.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t} );\n\n\t\t}\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n\n\t\treturn texture;\n\n\t},\n\n\tparse: function ( buffer, loadMipmaps ) {\n\n\t\tvar dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 };\n\n\t\t// Adapted from @toji's DDS utils\n\t\t//\thttps://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js\n\n\t\t// All values and structures referenced from:\n\t\t// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\n\n\t\tvar DDS_MAGIC = 0x20534444;\n\n\t\tvar DDSD_CAPS = 0x1,\n\t\t\tDDSD_HEIGHT = 0x2,\n\t\t\tDDSD_WIDTH = 0x4,\n\t\t\tDDSD_PITCH = 0x8,\n\t\t\tDDSD_PIXELFORMAT = 0x1000,\n\t\t\tDDSD_MIPMAPCOUNT = 0x20000,\n\t\t\tDDSD_LINEARSIZE = 0x80000,\n\t\t\tDDSD_DEPTH = 0x800000;\n\n\t\tvar DDSCAPS_COMPLEX = 0x8,\n\t\t\tDDSCAPS_MIPMAP = 0x400000,\n\t\t\tDDSCAPS_TEXTURE = 0x1000;\n\n\t\tvar DDSCAPS2_CUBEMAP = 0x200,\n\t\t\tDDSCAPS2_CUBEMAP_POSITIVEX = 0x400,\n\t\t\tDDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,\n\t\t\tDDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,\n\t\t\tDDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,\n\t\t\tDDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,\n\t\t\tDDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,\n\t\t\tDDSCAPS2_VOLUME = 0x200000;\n\n\t\tvar DDPF_ALPHAPIXELS = 0x1,\n\t\t\tDDPF_ALPHA = 0x2,\n\t\t\tDDPF_FOURCC = 0x4,\n\t\t\tDDPF_RGB = 0x40,\n\t\t\tDDPF_YUV = 0x200,\n\t\t\tDDPF_LUMINANCE = 0x20000;\n\n\t\tfunction fourCCToInt32( value ) {\n\n\t\t\treturn value.charCodeAt(0) +\n\t\t\t\t(value.charCodeAt(1) << 8) +\n\t\t\t\t(value.charCodeAt(2) << 16) +\n\t\t\t\t(value.charCodeAt(3) << 24);\n\n\t\t}\n\n\t\tfunction int32ToFourCC( value ) {\n\n\t\t\treturn String.fromCharCode(\n\t\t\t\tvalue & 0xff,\n\t\t\t\t(value >> 8) & 0xff,\n\t\t\t\t(value >> 16) & 0xff,\n\t\t\t\t(value >> 24) & 0xff\n\t\t\t);\n\t\t}\n\n\t\tfunction loadARGBMip( buffer, dataOffset, width, height ) {\n\t\t\tvar dataLength = width*height*4;\n\t\t\tvar srcBuffer = new Uint8Array( buffer, dataOffset, dataLength );\n\t\t\tvar byteArray = new Uint8Array( dataLength );\n\t\t\tvar dst = 0;\n\t\t\tvar src = 0;\n\t\t\tfor ( var y = 0; y < height; y++ ) {\n\t\t\t\tfor ( var x = 0; x < width; x++ ) {\n\t\t\t\t\tvar b = srcBuffer[src]; src++;\n\t\t\t\t\tvar g = srcBuffer[src]; src++;\n\t\t\t\t\tvar r = srcBuffer[src]; src++;\n\t\t\t\t\tvar a = srcBuffer[src]; src++;\n\t\t\t\t\tbyteArray[dst] = r; dst++;\t//r\n\t\t\t\t\tbyteArray[dst] = g; dst++;\t//g\n\t\t\t\t\tbyteArray[dst] = b; dst++;\t//b\n\t\t\t\t\tbyteArray[dst] = a; dst++;\t//a\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn byteArray;\n\t\t}\n\n\t\tvar FOURCC_DXT1 = fourCCToInt32(\"DXT1\");\n\t\tvar FOURCC_DXT3 = fourCCToInt32(\"DXT3\");\n\t\tvar FOURCC_DXT5 = fourCCToInt32(\"DXT5\");\n\n\t\tvar headerLengthInt = 31; // The header length in 32 bit ints\n\n\t\t// Offsets into the header array\n\n\t\tvar off_magic = 0;\n\n\t\tvar off_size = 1;\n\t\tvar off_flags = 2;\n\t\tvar off_height = 3;\n\t\tvar off_width = 4;\n\n\t\tvar off_mipmapCount = 7;\n\n\t\tvar off_pfFlags = 20;\n\t\tvar off_pfFourCC = 21;\n\t\tvar off_RGBBitCount = 22;\n\t\tvar off_RBitMask = 23;\n\t\tvar off_GBitMask = 24;\n\t\tvar off_BBitMask = 25;\n\t\tvar off_ABitMask = 26;\n\n\t\tvar off_caps = 27;\n\t\tvar off_caps2 = 28;\n\t\tvar off_caps3 = 29;\n\t\tvar off_caps4 = 30;\n\n\t\t// Parse header\n\n\t\tvar header = new Int32Array( buffer, 0, headerLengthInt );\n\n\t\tif ( header[ off_magic ] !== DDS_MAGIC ) {\n\n\t\t\tconsole.error( 'THREE.DDSLoader.parse: Invalid magic number in DDS header.' );\n\t\t\treturn dds;\n\n\t\t}\n\n\t\tif ( ! header[ off_pfFlags ] & DDPF_FOURCC ) {\n\n\t\t\tconsole.error( 'THREE.DDSLoader.parse: Unsupported format, must contain a FourCC code.' );\n\t\t\treturn dds;\n\n\t\t}\n\n\t\tvar blockBytes;\n\n\t\tvar fourCC = header[ off_pfFourCC ];\n\n\t\tvar isRGBAUncompressed = false;\n\n\t\tswitch ( fourCC ) {\n\n\t\t\tcase FOURCC_DXT1:\n\n\t\t\t\tblockBytes = 8;\n\t\t\t\tdds.format = THREE.RGB_S3TC_DXT1_Format;\n\t\t\t\tbreak;\n\n\t\t\tcase FOURCC_DXT3:\n\n\t\t\t\tblockBytes = 16;\n\t\t\t\tdds.format = THREE.RGBA_S3TC_DXT3_Format;\n\t\t\t\tbreak;\n\n\t\t\tcase FOURCC_DXT5:\n\n\t\t\t\tblockBytes = 16;\n\t\t\t\tdds.format = THREE.RGBA_S3TC_DXT5_Format;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tif( header[off_RGBBitCount] ==32 \n\t\t\t\t\t&& header[off_RBitMask]&0xff0000\n\t\t\t\t\t&& header[off_GBitMask]&0xff00 \n\t\t\t\t\t&& header[off_BBitMask]&0xff\n\t\t\t\t\t&& header[off_ABitMask]&0xff000000 ) {\n\t\t\t\t\tisRGBAUncompressed = true;\n\t\t\t\t\tblockBytes = 64;\n\t\t\t\t\tdds.format = THREE.RGBAFormat;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error( 'THREE.DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC( fourCC ) );\n\t\t\t\t\treturn dds;\n\t\t\t\t}\n\t\t}\n\n\t\tdds.mipmapCount = 1;\n\n\t\tif ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) {\n\n\t\t\tdds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] );\n\n\t\t}\n\n\t\t//TODO: Verify that all faces of the cubemap are present with DDSCAPS2_CUBEMAP_POSITIVEX, etc.\n\n\t\tdds.isCubemap = header[ off_caps2 ] & DDSCAPS2_CUBEMAP ? true : false;\n\n\t\tdds.width = header[ off_width ];\n\t\tdds.height = header[ off_height ];\n\n\t\tvar dataOffset = header[ off_size ] + 4;\n\n\t\t// Extract mipmaps buffers\n\n\t\tvar width = dds.width;\n\t\tvar height = dds.height;\n\n\t\tvar faces = dds.isCubemap ? 6 : 1;\n\n\t\tfor ( var face = 0; face < faces; face ++ ) {\n\n\t\t\tfor ( var i = 0; i < dds.mipmapCount; i ++ ) {\n\n\t\t\t\tif( isRGBAUncompressed ) {\n\t\t\t\t\tvar byteArray = loadARGBMip( buffer, dataOffset, width, height );\n\t\t\t\t\tvar dataLength = byteArray.length;\n\t\t\t\t} else {\n\t\t\t\t\tvar dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;\n\t\t\t\t\tvar byteArray = new Uint8Array( buffer, dataOffset, dataLength );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar mipmap = { \"data\": byteArray, \"width\": width, \"height\": height };\n\t\t\t\tdds.mipmaps.push( mipmap );\n\n\t\t\t\tdataOffset += dataLength;\n\n\t\t\t\twidth = Math.max( width * 0.5, 1 );\n\t\t\t\theight = Math.max( height * 0.5, 1 );\n\n\t\t\t}\n\n\t\t\twidth = dds.width;\n\t\t\theight = dds.height;\n\n\t\t}\n\n\t\treturn dds;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/MTLLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/MTLLoader.js",
"module-type": "library",
"text": "/**\n * Loads a Wavefront .mtl file specifying materials\n *\n * @author angelxuanchang\n */\n\nTHREE.MTLLoader = function( baseUrl, options, crossOrigin ) {\n\n\tthis.baseUrl = baseUrl;\n\tthis.options = options;\n\tthis.crossOrigin = crossOrigin;\n\n};\n\nTHREE.MTLLoader.prototype = {\n\n\tconstructor: THREE.MTLLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader();\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( text ) );\n\n\t\t} );\n\n\t},\n\n\t/**\n\t * Parses loaded MTL file\n\t * @param text - Content of MTL file\n\t * @return {THREE.MTLLoader.MaterialCreator}\n\t */\n\tparse: function ( text ) {\n\n\t\tvar lines = text.split( \"\\n\" );\n\t\tvar info = {};\n\t\tvar delimiter_pattern = /\\s+/;\n\t\tvar materialsInfo = {};\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\t\t\tline = line.trim();\n\n\t\t\tif ( line.length === 0 || line.charAt( 0 ) === '#' ) {\n\n\t\t\t\t// Blank line or comment ignore\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar pos = line.indexOf( ' ' );\n\n\t\t\tvar key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;\n\t\t\tkey = key.toLowerCase();\n\n\t\t\tvar value = ( pos >= 0 ) ? line.substring( pos + 1 ) : \"\";\n\t\t\tvalue = value.trim();\n\n\t\t\tif ( key === \"newmtl\" ) {\n\n\t\t\t\t// New material\n\n\t\t\t\tinfo = { name: value };\n\t\t\t\tmaterialsInfo[ value ] = info;\n\n\t\t\t} else if ( info ) {\n\n\t\t\t\tif ( key === \"ka\" || key === \"kd\" || key === \"ks\" ) {\n\n\t\t\t\t\tvar ss = value.split( delimiter_pattern, 3 );\n\t\t\t\t\tinfo[ key ] = [ parseFloat( ss[0] ), parseFloat( ss[1] ), parseFloat( ss[2] ) ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinfo[ key ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar materialCreator = new THREE.MTLLoader.MaterialCreator( this.baseUrl, this.options );\n\t\tmaterialCreator.setMaterials( materialsInfo );\n\t\treturn materialCreator;\n\n\t}\n\n};\n\n/**\n * Create a new THREE-MTLLoader.MaterialCreator\n * @param baseUrl - Url relative to which textures are loaded\n * @param options - Set of options on how to construct the materials\n * side: Which side to apply the material\n * THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide\n * wrap: What type of wrapping to apply for textures\n * THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping\n * normalizeRGB: RGBs need to be normalized to 0-1 from 0-255\n * Default: false, assumed to be already normalized\n * ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's\n * Default: false\n * invertTransparency: If transparency need to be inverted (inversion is needed if d = 0 is fully opaque)\n * Default: false (d = 1 is fully opaque)\n * @constructor\n */\n\nTHREE.MTLLoader.MaterialCreator = function( baseUrl, options ) {\n\n\tthis.baseUrl = baseUrl;\n\tthis.options = options;\n\tthis.materialsInfo = {};\n\tthis.materials = {};\n\tthis.materialsArray = [];\n\tthis.nameLookup = {};\n\n\tthis.side = ( this.options && this.options.side )? this.options.side: THREE.FrontSide;\n\tthis.wrap = ( this.options && this.options.wrap )? this.options.wrap: THREE.RepeatWrapping;\n\n};\n\nTHREE.MTLLoader.MaterialCreator.prototype = {\n\n\tconstructor: THREE.MTLLoader.MaterialCreator,\n\n\tsetMaterials: function( materialsInfo ) {\n\n\t\tthis.materialsInfo = this.convert( materialsInfo );\n\t\tthis.materials = {};\n\t\tthis.materialsArray = [];\n\t\tthis.nameLookup = {};\n\n\t},\n\n\tconvert: function( materialsInfo ) {\n\n\t\tif ( !this.options ) return materialsInfo;\n\n\t\tvar converted = {};\n\n\t\tfor ( var mn in materialsInfo ) {\n\n\t\t\t// Convert materials info into normalized form based on options\n\n\t\t\tvar mat = materialsInfo[ mn ];\n\n\t\t\tvar covmat = {};\n\n\t\t\tconverted[ mn ] = covmat;\n\n\t\t\tfor ( var prop in mat ) {\n\n\t\t\t\tvar save = true;\n\t\t\t\tvar value = mat[ prop ];\n\t\t\t\tvar lprop = prop.toLowerCase();\n\n\t\t\t\tswitch ( lprop ) {\n\n\t\t\t\t\tcase 'kd':\n\t\t\t\t\tcase 'ka':\n\t\t\t\t\tcase 'ks':\n\n\t\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\t\tif ( this.options && this.options.normalizeRGB ) {\n\n\t\t\t\t\t\t\tvalue = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( this.options && this.options.ignoreZeroRGBs ) {\n\n\t\t\t\t\t\t\tif ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 1 ] === 0 ) {\n\n\t\t\t\t\t\t\t\t// ignore\n\n\t\t\t\t\t\t\t\tsave = false;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'd':\n\n\t\t\t\t\t\t// According to MTL format (http://paulbourke.net/dataformats/mtl/):\n\t\t\t\t\t\t// d is dissolve for current material\n\t\t\t\t\t\t// factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)\n\n\t\t\t\t\t\tif ( this.options && this.options.invertTransparency ) {\n\n\t\t\t\t\t\t\tvalue = 1 - value;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( save ) {\n\n\t\t\t\t\tcovmat[ lprop ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn converted;\n\n\t},\n\n\tpreload: function () {\n\n\t\tfor ( var mn in this.materialsInfo ) {\n\n\t\t\tthis.create( mn );\n\n\t\t}\n\n\t},\n\n\tgetIndex: function( materialName ) {\n\n\t\treturn this.nameLookup[ materialName ];\n\n\t},\n\n\tgetAsArray: function() {\n\n\t\tvar index = 0;\n\n\t\tfor ( var mn in this.materialsInfo ) {\n\n\t\t\tthis.materialsArray[ index ] = this.create( mn );\n\t\t\tthis.nameLookup[ mn ] = index;\n\t\t\tindex ++;\n\n\t\t}\n\n\t\treturn this.materialsArray;\n\n\t},\n\n\tcreate: function ( materialName ) {\n\n\t\tif ( this.materials[ materialName ] === undefined ) {\n\n\t\t\tthis.createMaterial_( materialName );\n\n\t\t}\n\n\t\treturn this.materials[ materialName ];\n\n\t},\n\n\tcreateMaterial_: function ( materialName ) {\n\n\t\t// Create material\n\n\t\tvar mat = this.materialsInfo[ materialName ];\n\t\tvar params = {\n\n\t\t\tname: materialName,\n\t\t\tside: this.side\n\n\t\t};\n\n\t\tfor ( var prop in mat ) {\n\n\t\t\tvar value = mat[ prop ];\n\n\t\t\tswitch ( prop.toLowerCase() ) {\n\n\t\t\t\t// Ns is material specular exponent\n\n\t\t\t\tcase 'kd':\n\n\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\tparams[ 'diffuse' ] = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ka':\n\n\t\t\t\t\t// Ambient color (color under shadow) using RGB values\n\n\t\t\t\t\tparams[ 'ambient' ] = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ks':\n\n\t\t\t\t\t// Specular color (color when light is reflected from shiny surface) using RGB values\n\t\t\t\t\tparams[ 'specular' ] = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_kd':\n\n\t\t\t\t\t// Diffuse texture map\n\n\t\t\t\t\tparams[ 'map' ] = this.loadTexture( this.baseUrl + value );\n\t\t\t\t\tparams[ 'map' ].wrapS = this.wrap;\n\t\t\t\t\tparams[ 'map' ].wrapT = this.wrap;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ns':\n\n\t\t\t\t\t// The specular exponent (defines the focus of the specular highlight)\n\t\t\t\t\t// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\n\n\t\t\t\t\tparams['shininess'] = value;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'd':\n\n\t\t\t\t\t// According to MTL format (http://paulbourke.net/dataformats/mtl/):\n\t\t\t\t\t// d is dissolve for current material\n\t\t\t\t\t// factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)\n\n\t\t\t\t\tif ( value < 1 ) {\n\n\t\t\t\t\t\tparams['transparent'] = true;\n\t\t\t\t\t\tparams['opacity'] = value;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( params[ 'diffuse' ] ) {\n\n\t\t\tif ( !params[ 'ambient' ]) params[ 'ambient' ] = params[ 'diffuse' ];\n\t\t\tparams[ 'color' ] = params[ 'diffuse' ];\n\n\t\t}\n\n\t\tthis.materials[ materialName ] = new THREE.MeshPhongMaterial( params );\n\t\treturn this.materials[ materialName ];\n\n\t},\n\n\n\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\tvar texture;\n\t\tvar loader = THREE.Loader.Handlers.get( url );\n\n\t\tif ( loader !== null ) {\n\n\t\t\ttexture = loader.load( url, onLoad );\n\n\t\t} else {\n\n\t\t\ttexture = new THREE.Texture();\n\n\t\t\tloader = new THREE.ImageLoader();\n\t\t\tloader.crossOrigin = this.crossOrigin;\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\ttexture.image = THREE.MTLLoader.ensurePowerOfTwo_( image );\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t} );\n\n\t\t}\n\n\t\ttexture.mapping = mapping;\n\n\t\treturn texture;\n\n\t}\n\n};\n\nTHREE.MTLLoader.ensurePowerOfTwo_ = function ( image ) {\n\n\tif ( ! THREE.Math.isPowerOfTwo( image.width ) || ! THREE.Math.isPowerOfTwo( image.height ) ) {\n\n\t\tvar canvas = document.createElement( \"canvas\" );\n\t\tcanvas.width = THREE.MTLLoader.nextHighestPowerOfTwo_( image.width );\n\t\tcanvas.height = THREE.MTLLoader.nextHighestPowerOfTwo_( image.height );\n\n\t\tvar ctx = canvas.getContext(\"2d\");\n\t\tctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\t\treturn canvas;\n\n\t}\n\n\treturn image;\n\n};\n\nTHREE.MTLLoader.nextHighestPowerOfTwo_ = function( x ) {\n\n\t--x;\n\n\tfor ( var i = 1; i < 32; i <<= 1 ) {\n\n\t\tx = x | x >> i;\n\n\t}\n\n\treturn x + 1;\n\n};\n\nTHREE.EventDispatcher.prototype.apply( THREE.MTLLoader.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/OBJLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/OBJLoader.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.OBJLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.OBJLoader.prototype = {\n\n\tconstructor: THREE.OBJLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( text ) );\n\n\t\t} );\n\n\t},\n\n\tparse: function ( text ) {\n var func = \"THREE.OBJLoader.parse\";\n\n\t\tfunction vector( x, y, z ) {\n\n\t\t\treturn new THREE.Vector3( parseFloat( x ), parseFloat( y ), parseFloat( z ) );\n\n\t\t}\n\n\t\tfunction uv( u, v ) {\n\n\t\t\treturn new THREE.Vector2( parseFloat( u ), parseFloat( v ) );\n\n\t\t}\n\n\t\tfunction face3( a, b, c, normals ) {\n\n\t\t\treturn new THREE.Face3( a, b, c, normals );\n\n\t\t}\n\t\t\n\t\tvar object = new THREE.Object3D();\n\t\tvar geometry, material, mesh;\n\n\t\tfunction parseVertexIndex( index ) {\n\n\t\t\tindex = parseInt( index );\n\n\t\t\treturn index >= 0 ? index - 1 : index + vertices.length;\n\n\t\t}\n\n\t\tfunction parseNormalIndex( index ) {\n\n\t\t\tindex = parseInt( index );\n\n\t\t\treturn index >= 0 ? index - 1 : index + normals.length;\n\n\t\t}\n\n\t\tfunction parseUVIndex( index ) {\n\n\t\t\tindex = parseInt( index );\n\n\t\t\treturn index >= 0 ? index - 1 : index + uvs.length;\n\n\t\t}\n\t\t\n\t\tfunction add_face( a, b, c, normals_inds ) {\n\n\t\t\tif ( normals_inds === undefined ) {\n\n\t\t\t\tgeometry.faces.push( face3(\n\t\t\t\t\tvertices[ parseVertexIndex( a ) ] - 1,\n\t\t\t\t\tvertices[ parseVertexIndex( b ) ] - 1,\n\t\t\t\t\tvertices[ parseVertexIndex( c ) ] - 1\n\t\t\t\t) );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry.faces.push( face3(\n\t\t\t\t\tvertices[ parseVertexIndex( a ) ] - 1,\n\t\t\t\t\tvertices[ parseVertexIndex( b ) ] - 1,\n\t\t\t\t\tvertices[ parseVertexIndex( c ) ] - 1,\n\t\t\t\t\t[\n\t\t\t\t\t\tnormals[ parseNormalIndex( normals_inds[ 0 ] ) ].clone(),\n\t\t\t\t\t\tnormals[ parseNormalIndex( normals_inds[ 1 ] ) ].clone(),\n\t\t\t\t\t\tnormals[ parseNormalIndex( normals_inds[ 2 ] ) ].clone()\n\t\t\t\t\t]\n\t\t\t\t) );\n\n\t\t\t}\n\n\t\t}\n\t\t\n\t\tfunction add_uvs( a, b, c ) {\n\t \n\t\t\tgeometry.faceVertexUvs[ 0 ].push( [\n\t\t\t\tuvs[ parseUVIndex( a ) ].clone(),\n\t\t\t\tuvs[ parseUVIndex( b ) ].clone(),\n\t\t\t\tuvs[ parseUVIndex( c ) ].clone()\n\t\t\t] );\n\n\t\t}\n\t\t\n\t\tfunction handle_face_line(faces, uvs, normals_inds) {\n\n\t\t\tif ( faces[ 3 ] === undefined ) {\n\t\t\t\t\n\t\t\t\tadd_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds );\n\t\t\t\t\n\t\t\t\tif ( uvs !== undefined && uvs.length > 0 ) {\n\n\t\t\t\t\tadd_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tif ( normals_inds !== undefined && normals_inds.length > 0 ) {\n\n\t\t\t\t\tadd_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ] );\n\t\t\t\t\tadd_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tadd_face( faces[ 0 ], faces[ 1 ], faces[ 3 ] );\n\t\t\t\t\tadd_face( faces[ 1 ], faces[ 2 ], faces[ 3 ] );\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( uvs !== undefined && uvs.length > 0 ) {\n\n\t\t\t\t\tadd_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] );\n\t\t\t\t\tadd_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t// create mesh if no objects in text\n\n\t\tif ( /^o /gm.test( text ) === false ) {\n\n\t\t\tgeometry = new THREE.Geometry();\n\t\t\tmaterial = new THREE.MeshLambertMaterial();\n\t\t\tmesh = new THREE.Mesh( geometry, material );\n\t\t\tobject.add( mesh );\n\n\t\t}\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// v float float float\n\n\t\tvar vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e]+)( +[\\d|\\.|\\+|\\-|e]+)( +[\\d|\\.|\\+|\\-|e]+)/;\n\n\t\t// vn float float float\n\n\t\tvar normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e]+)( +[\\d|\\.|\\+|\\-|e]+)( +[\\d|\\.|\\+|\\-|e]+)/;\n\n\t\t// vt float float\n\n\t\tvar uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e]+)( +[\\d|\\.|\\+|\\-|e]+)/;\n\n\t\t// f vertex vertex vertex ...\n\n\t\tvar face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n\t\t// f vertex/uv vertex/uv vertex/uv ...\n\n\t\tvar face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n\t\t// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n\t\tvar face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n\t\t// f vertex//normal vertex//normal vertex//normal ... \n\n\t\tvar face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/\n\n\t\t// fixes\n\n\t\ttext = text.replace( /\\\\\\r\\n/g, '' ); // handles line continuations \\\n\n\t\tvar lines = text.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\t\t\tline = line.trim();\n\n\t\t\tvar result;\n\n\t\t\tif ( line.length === 0 || line.charAt( 0 ) === '#' ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t} else if ( ( result = vertex_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n\t\t\t\tvertices.push( \n\t\t\t\t\tgeometry.vertices.push(\n\t\t\t\t\t\tvector(\n\t\t\t\t\t\t\tresult[ 1 ], result[ 2 ], result[ 3 ]\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t} else if ( ( result = normal_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n\t\t\t\tnormals.push(\n\t\t\t\t\tvector(\n\t\t\t\t\t\tresult[ 1 ], result[ 2 ], result[ 3 ]\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t} else if ( ( result = uv_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n\t\t\t\tuvs.push(\n\t\t\t\t\tuv(\n\t\t\t\t\t\tresult[ 1 ], result[ 2 ]\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t} else if ( ( result = face_pattern1.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n\t\t\t\thandle_face_line(\n\t\t\t\t\t[ result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] ]\n\t\t\t\t);\n\n\t\t\t} else if ( ( result = face_pattern2.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\t\t\t\t\n\t\t\t\thandle_face_line(\n\t\t\t\t\t[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces\n\t\t\t\t\t[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv\n\t\t\t\t);\n\n\t\t\t} else if ( ( result = face_pattern3.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n\t\t\t\thandle_face_line(\n\t\t\t\t\t[ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces\n\t\t\t\t\t[ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv\n\t\t\t\t\t[ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal\n\t\t\t\t);\n\n\t\t\t} else if ( ( result = face_pattern4.exec( line ) ) !== null ) {\n\n\t\t\t\t// [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n\t\t\t\thandle_face_line(\n\t\t\t\t\t[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces\n\t\t\t\t\t[ ], //uv\n\t\t\t\t\t[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal\n\t\t\t\t);\n\n\t\t\t} else if ( /^o /.test( line ) ) {\n\n\t\t\t\tgeometry = new THREE.Geometry();\n\t\t\t\tmaterial = new THREE.MeshLambertMaterial();\n\n\t\t\t\tmesh = new THREE.Mesh( geometry, material );\n\t\t\t\tmesh.name = line.substring( 2 ).trim();\n\t\t\t\tobject.add( mesh );\n\n\t\t\t} else if ( /^g /.test( line ) ) {\n\n\t\t\t\t// group\n\n\t\t\t} else if ( /^usemtl /.test( line ) ) {\n\n\t\t\t\t// material\n\n\t\t\t\tmaterial.name = line.substring( 7 ).trim();\n\n\t\t\t} else if ( /^mtllib /.test( line ) ) {\n\n\t\t\t\t// mtl file\n\n\t\t\t} else if ( /^s /.test( line ) ) {\n\n\t\t\t\t// smooth shading\n\n\t\t\t} else {\n\n\t\t\t\t// console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tvar geometry = children[ i ].geometry;\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\t\t\n\t\treturn object;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/PDBLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/PDBLoader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.PDBLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.PDBLoader.prototype = {\n\n\tconstructor: THREE.PDBLoader,\n\n\tload: function ( url, onLoad ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = scope.parsePDB( text );\n\t\t\tscope.createModel( json, onLoad );\n\n\t\t} );\n\n\t},\n\n\t// Based on CanvasMol PDB parser\n\n\tparsePDB: function ( text ) {\n\n\t\tfunction trim( text ) {\n\n\t\t\treturn text.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\n\t\t}\n\n\t\tfunction capitalize( text ) {\n\n\t\t\treturn text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n\n\t\t}\n\n\t\tfunction hash( s, e ) {\n\n\t\t\treturn \"s\" + Math.min( s, e ) + \"e\" + Math.max( s, e );\n\n\t\t}\n\n\t\tfunction parseBond( start, length ) {\n\n\t\t\tvar eatom = parseInt( lines[ i ].substr( start, length ) );\n\n\t\t\tif( eatom ) {\n\n\t\t\t\tvar h = hash( satom, eatom );\n\n\t\t\t\tif ( bhash[ h ] == undefined ) {\n\n\t\t\t\t\tbonds.push( [ satom - 1, eatom - 1, 1 ] );\n\t\t\t\t\tbhash[ h ] = bonds.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// doesn't really work as almost all PDBs\n\t\t\t\t\t// have just normal bonds appearing multiple\n\t\t\t\t\t// times instead of being double/triple bonds\n\t\t\t\t\t// bonds[bhash[h]][2] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar CPK = {\"h\":[255,255,255],\"he\":[217,255,255],\"li\":[204,128,255],\"be\":[194,255,0],\"b\":[255,181,181],\"c\":[144,144,144],\"n\":[48,80,248],\"o\":[255,13,13],\"f\":[144,224,80],\"ne\":[179,227,245],\"na\":[171,92,242],\"mg\":[138,255,0],\"al\":[191,166,166],\"si\":[240,200,160],\"p\":[255,128,0],\"s\":[255,255,48],\"cl\":[31,240,31],\"ar\":[128,209,227],\"k\":[143,64,212],\"ca\":[61,255,0],\"sc\":[230,230,230],\"ti\":[191,194,199],\"v\":[166,166,171],\"cr\":[138,153,199],\"mn\":[156,122,199],\"fe\":[224,102,51],\"co\":[240,144,160],\"ni\":[80,208,80],\"cu\":[200,128,51],\"zn\":[125,128,176],\"ga\":[194,143,143],\"ge\":[102,143,143],\"as\":[189,128,227],\"se\":[255,161,0],\"br\":[166,41,41],\"kr\":[92,184,209],\"rb\":[112,46,176],\"sr\":[0,255,0],\"y\":[148,255,255],\"zr\":[148,224,224],\"nb\":[115,194,201],\"mo\":[84,181,181],\"tc\":[59,158,158],\"ru\":[36,143,143],\"rh\":[10,125,140],\"pd\":[0,105,133],\"ag\":[192,192,192],\"cd\":[255,217,143],\"in\":[166,117,115],\"sn\":[102,128,128],\"sb\":[158,99,181],\"te\":[212,122,0],\"i\":[148,0,148],\"xe\":[66,158,176],\"cs\":[87,23,143],\"ba\":[0,201,0],\"la\":[112,212,255],\"ce\":[255,255,199],\"pr\":[217,255,199],\"nd\":[199,255,199],\"pm\":[163,255,199],\"sm\":[143,255,199],\"eu\":[97,255,199],\"gd\":[69,255,199],\"tb\":[48,255,199],\"dy\":[31,255,199],\"ho\":[0,255,156],\"er\":[0,230,117],\"tm\":[0,212,82],\"yb\":[0,191,56],\"lu\":[0,171,36],\"hf\":[77,194,255],\"ta\":[77,166,255],\"w\":[33,148,214],\"re\":[38,125,171],\"os\":[38,102,150],\"ir\":[23,84,135],\"pt\":[208,208,224],\"au\":[255,209,35],\"hg\":[184,184,208],\"tl\":[166,84,77],\"pb\":[87,89,97],\"bi\":[158,79,181],\"po\":[171,92,0],\"at\":[117,79,69],\"rn\":[66,130,150],\"fr\":[66,0,102],\"ra\":[0,125,0],\"ac\":[112,171,250],\"th\":[0,186,255],\"pa\":[0,161,255],\"u\":[0,143,255],\"np\":[0,128,255],\"pu\":[0,107,255],\"am\":[84,92,242],\"cm\":[120,92,227],\"bk\":[138,79,227],\"cf\":[161,54,212],\"es\":[179,31,212],\"fm\":[179,31,186],\"md\":[179,13,166],\"no\":[189,13,135],\"lr\":[199,0,102],\"rf\":[204,0,89],\"db\":[209,0,79],\"sg\":[217,0,69],\"bh\":[224,0,56],\"hs\":[230,0,46],\"mt\":[235,0,38],\n\t\t\t \"ds\":[235,0,38],\"rg\":[235,0,38],\"cn\":[235,0,38],\"uut\":[235,0,38],\"uuq\":[235,0,38],\"uup\":[235,0,38],\"uuh\":[235,0,38],\"uus\":[235,0,38],\"uuo\":[235,0,38]};\n\n\n\t\tvar atoms = [];\n\t\tvar bonds = [];\n\t\tvar histogram = {};\n\n\t\tvar bhash = {};\n\n\t\tvar lines = text.split( \"\\n\" );\n\n\t\tvar x, y, z, e;\n\n\t\tfor( var i = 0, il = lines.length; i < il; ++ i ) {\n\n\t\t\tif( lines[i].substr(0,4)==\"ATOM\" || lines[i].substr(0,6)==\"HETATM\" ) {\n\n\t\t\t\tx = parseFloat( lines[i].substr(30,7) );\n\t\t\t\ty = parseFloat( lines[i].substr(38,7) );\n\t\t\t\tz = parseFloat( lines[i].substr(46,7) );\n\n\t\t\t\te = trim( lines[i].substr(76,2) ).toLowerCase();\n\n\t\t\t\tif ( e==\"\" ) e = trim(lines[i].substr(12,2)).toLowerCase();\n\t\t\t\tatoms.push( [ x,y,z, CPK[e], capitalize(e) ] );\n\n\t\t\t\tif (histogram[e]==undefined) histogram[e] = 1;\n\t\t\t\telse histogram[e] += 1;\n\n\t\t\t} else if(lines[i].substr(0,6)==\"CONECT\") {\n\n\t\t\t\tvar satom = parseInt( lines[i].substr(6,5) );\n\n\t\t\t\tparseBond(11,5);\n\t\t\t\tparseBond(16,5);\n\t\t\t\tparseBond(21,5);\n\t\t\t\tparseBond(26,5);\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn { \"ok\": true, \"atoms\": atoms, \"bonds\": bonds, \"histogram\": histogram };\n\n\t},\n\n\tcreateModel: function ( json, callback ) {\n\n\t\tvar scope = this,\n\t\tgeometryAtoms = new THREE.Geometry(),\n\t\tgeometryBonds = new THREE.Geometry();\n\n\t\tgeometryAtoms.elements = [];\n\n\t\tvar atoms = json.atoms;\n\t\tvar bonds = json.bonds;\n\n\t\tfor ( var i = 0; i < atoms.length; i ++ ) {\n\n\t\t\tvar atom = atoms[ i ];\n\n\t\t\tvar x = atom[ 0 ];\n\t\t\tvar y = atom[ 1 ];\n\t\t\tvar z = atom[ 2 ];\n\n\t\t\tvar position = new THREE.Vector3( x, y, z );\n\t\t\tgeometryAtoms.vertices.push( position );\n\n\t\t\tvar r = atom[ 3 ][ 0 ] / 255;\n\t\t\tvar g = atom[ 3 ][ 1 ] / 255;\n\t\t\tvar b = atom[ 3 ][ 2 ] / 255;\n\n\t\t\tvar color = new THREE.Color();\n\t\t\tcolor.setRGB( r, g, b );\n\n\t\t\tgeometryAtoms.colors.push( color );\n\n\t\t\tgeometryAtoms.elements.push( atom[ 4 ] );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < bonds.length; i ++ ) {\n\n\t\t\tvar bond = bonds[ i ];\n\n\t\t\tvar start = bond[ 0 ];\n\t\t\tvar end = bond[ 1 ];\n\n\t\t\tvar vertex1 = geometryAtoms.vertices[ start ];\n\t\t\tvar vertex2 = geometryAtoms.vertices[ end ];\n\n\t\t\tgeometryBonds.vertices.push( vertex1.clone() );\n\t\t\tgeometryBonds.vertices.push( vertex2.clone() );\n\n\t\t}\n\n\t\tcallback( geometryAtoms, geometryBonds, json );\n\n\t}\n\n}\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/PLYLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/PLYLoader.js",
"module-type": "library",
"text": "/**\n * @author Wei Meng / http://about.me/menway\n *\n * Description: A THREE loader for PLY ASCII files (known as the Polygon File Format or the Stanford Triangle Format).\n *\n * Currently only supports ASCII encoded files.\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tvar loader = new THREE.PLYLoader();\n *\tloader.addEventListener( 'load', function ( event ) {\n *\n *\t\tvar geometry = event.content;\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\tloader.load( './models/ply/ascii/dolphins.ply' );\n */\n\n\nTHREE.PLYLoader = function () {};\n\nTHREE.PLYLoader.prototype = {\n\n\tconstructor: THREE.PLYLoader,\n\n\tload: function ( url, callback ) {\n var func = \"THREE.PLYLoader.load\";\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\t var geometry = this.parse(res);\n\t this.dispatchEvent({type: 'load', content: geometry});\n\t if (callback) callback(geometry);\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n\t return;\n }\n\n\t\tvar scope = this;\n\t\tvar request = new XMLHttpRequest();\n\n\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\tvar geometry = scope.parse( event.target.response );\n\n\t\t\tscope.dispatchEvent( { type: 'load', content: geometry } );\n\n\t\t\tif ( callback ) callback( geometry );\n\n\t\t}, false );\n\n\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\tscope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );\n\n\t\t}, false );\n\n\t\trequest.addEventListener( 'error', function () {\n\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\n\n\t\t}, false );\n\n\t\trequest.open( 'GET', url, true );\n\t\trequest.responseType = \"arraybuffer\";\n\t\trequest.send( null );\n\n\t},\n\n\tbin2str: function (buf) {\n\n\t\tvar array_buffer = new Uint8Array(buf);\n\t\tvar str = '';\n\t\tfor(var i = 0; i < buf.byteLength; i++) {\n\t\t\tstr += String.fromCharCode(array_buffer[i]); // implicitly assumes little-endian\n\t\t}\n\n\t\treturn str;\n\n\t},\n\n\tisASCII: function( data ){\n\n\t\tvar header = this.parseHeader( this.bin2str( data ) );\n\t\t\n\t\treturn header.format === \"ascii\";\n\n\t},\n\n\tparse: function ( data ) {\n\n\t\tif ( data instanceof ArrayBuffer ) {\n\n\t\t\treturn this.isASCII( data )\n\t\t\t\t? this.parseASCII( this.bin2str( data ) )\n\t\t\t\t: this.parseBinary( data );\n\n\t\t} else {\n\n\t\t\treturn this.parseASCII( data );\n\n\t\t}\n\n\t},\n\n\tparseHeader: function ( data ) {\n\t\t\n\t\tvar patternHeader = /ply([\\s\\S]*)end_header\\n/;\n\t\tvar headerText = \"\";\n\t\tif ( ( result = patternHeader.exec( data ) ) != null ) {\n\t\t\theaderText = result [ 1 ];\n\t\t}\n\t\t\n\t\tvar header = new Object();\n\t\theader.comments = [];\n\t\theader.elements = [];\n\t\theader.headerLength = result[0].length;\n\t\t\n\t\tvar lines = headerText.split( '\\n' );\n\t\tvar currentElement = undefined;\n\t\tvar lineType, lineValues;\n\n\t\tfunction make_ply_element_property(propertValues) {\n\t\t\t\n\t\t\tvar property = Object();\n\n\t\t\tproperty.type = propertValues[0]\n\t\t\t\n\t\t\tif ( property.type === \"list\" ) {\n\t\t\t\t\n\t\t\t\tproperty.name = propertValues[3]\n\t\t\t\tproperty.countType = propertValues[1]\n\t\t\t\tproperty.itemType = propertValues[2]\n\n\t\t\t} else {\n\n\t\t\t\tproperty.name = propertValues[1]\n\n\t\t\t}\n\n\t\t\treturn property\n\t\t\t\n\t\t}\n\t\t\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\t\t\tline = line.trim()\n\t\t\tif ( line === \"\" ) { continue; }\n\t\t\tlineValues = line.split( /\\s+/ );\n\t\t\tlineType = lineValues.shift()\n\t\t\tline = lineValues.join(\" \")\n\t\t\t\n\t\t\tswitch( lineType ) {\n\t\t\t\t\n\t\t\tcase \"format\":\n\n\t\t\t\theader.format = lineValues[0];\n\t\t\t\theader.version = lineValues[1];\n\n\t\t\t\tbreak;\n\n\t\t\tcase \"comment\":\n\n\t\t\t\theader.comments.push(line);\n\n\t\t\t\tbreak;\n\n\t\t\tcase \"element\":\n\n\t\t\t\tif ( !(currentElement === undefined) ) {\n\n\t\t\t\t\theader.elements.push(currentElement);\n\n\t\t\t\t}\n\n\t\t\t\tcurrentElement = Object();\n\t\t\t\tcurrentElement.name = lineValues[0];\n\t\t\t\tcurrentElement.count = parseInt( lineValues[1] );\n\t\t\t\tcurrentElement.properties = [];\n\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase \"property\":\n\n\t\t\t\tcurrentElement.properties.push( make_ply_element_property( lineValues ) );\n\n\t\t\t\tbreak;\n\t\t\t\t\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.log(\"unhandled\", lineType, lineValues);\n\n\t\t\t}\n\n\t\t}\n\t\t\n\t\tif ( !(currentElement === undefined) ) {\n\n\t\t\theader.elements.push(currentElement);\n\n\t\t}\n\t\t\n\t\treturn header;\n\t\t\n\t},\n\n\tparseASCIINumber: function ( n, type ) {\n\t\t\n\t\tswitch( type ) {\n\t\t\t\n\t\tcase 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':\n\t\tcase 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':\n\n\t\t\treturn parseInt( n );\n\n\t\tcase 'float': case 'double': case 'float32': case 'float64':\n\n\t\t\treturn parseFloat( n );\n\t\t\t\n\t\t}\n\t\t\n\t},\n\n\tparseASCIIElement: function ( properties, line ) {\n\n\t\tvalues = line.split( /\\s+/ );\n\t\t\n\t\tvar element = Object();\n\t\t\n\t\tfor ( var i = 0; i < properties.length; i ++ ) {\n\t\t\t\n\t\t\tif ( properties[i].type === \"list\" ) {\n\t\t\t\t\n\t\t\t\tvar list = [];\n\t\t\t\tvar n = this.parseASCIINumber( values.shift(), properties[i].countType );\n\n\t\t\t\tfor ( j = 0; j < n; j ++ ) {\n\t\t\t\t\t\n\t\t\t\t\tlist.push( this.parseASCIINumber( values.shift(), properties[i].itemType ) );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\telement[ properties[i].name ] = list;\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\telement[ properties[i].name ] = this.parseASCIINumber( values.shift(), properties[i].type );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn element;\n\t\t\n\t},\n\n\tparseASCII: function ( data ) {\n\n\t\t// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n\t\tvar geometry = new THREE.Geometry();\n\n\t\tvar result;\n\n\t\tvar header = this.parseHeader( data );\n\n\t\tvar patternBody = /end_header\\n([\\s\\S]*)$/;\n\t\tvar body = \"\";\n\t\tif ( ( result = patternBody.exec( data ) ) != null ) {\n\t\t\tbody = result [ 1 ];\n\t\t}\n\t\t\n\t\tvar lines = body.split( '\\n' );\n\t\tvar currentElement = 0;\n\t\tvar currentElementCount = 0;\n\t\tgeometry.useColor = false;\n\t\t\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\t\t\tline = line.trim()\n\t\t\tif ( line === \"\" ) { continue; }\n\t\t\t\n\t\t\tif ( currentElementCount >= header.elements[currentElement].count ) {\n\n\t\t\t\tcurrentElement++;\n\t\t\t\tcurrentElementCount = 0;\n\n\t\t\t}\n\t\t\t\n\t\t\tvar element = this.parseASCIIElement( header.elements[currentElement].properties, line );\n\t\t\t\n\t\t\tthis.handleElement( geometry, header.elements[currentElement].name, element );\n\t\t\t\n\t\t\tcurrentElementCount++;\n\t\t\t\n\t\t}\n\n\t\treturn this.postProcess( geometry );\n\n\t},\n\n\tpostProcess: function ( geometry ) {\n\t\t\n\t\tif ( geometry.useColor ) {\n\t\t\t\n\t\t\tfor ( var i = 0; i < geometry.faces.length; i ++ ) {\n\t\t\t\t\n\t\t\t\tgeometry.faces[i].vertexColors = [\n\t\t\t\t\tgeometry.colors[geometry.faces[i].a],\n\t\t\t\t\tgeometry.colors[geometry.faces[i].b],\n\t\t\t\t\tgeometry.colors[geometry.faces[i].c]\n\t\t\t\t];\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tgeometry.elementsNeedUpdate = true;\n\t\t\t\n\t\t}\n\n\t\tgeometry.computeBoundingSphere();\n\n\t\treturn geometry;\n\t\t\n\t},\n\n\thandleElement: function ( geometry, elementName, element ) {\n\t\t\n\t\tif ( elementName === \"vertex\" ) {\n\n\t\t\tgeometry.vertices.push(\n\t\t\t\tnew THREE.Vector3( element.x, element.y, element.z )\n\t\t\t);\n\t\t\t\n\t\t\tif ( 'red' in element && 'green' in element && 'blue' in element ) {\n\t\t\t\t\n\t\t\t\tgeometry.useColor = true;\n\t\t\t\t\n\t\t\t\tcolor = new THREE.Color();\n\t\t\t\tcolor.setRGB( element.red / 255.0, element.green / 255.0, element.blue / 255.0 );\n\t\t\t\tgeometry.colors.push( color );\n\t\t\t\t\n\t\t\t}\n\n\t\t} else if ( elementName === \"face\" ) {\n\n\t\t\tgeometry.faces.push(\n\t\t\t\tnew THREE.Face3( element.vertex_indices[0], element.vertex_indices[1], element.vertex_indices[2] )\n\t\t\t);\n\n\t\t}\n\t\t\n\t},\n\n\tbinaryRead: function ( dataview, at, type, little_endian ) {\n\n\t\tswitch( type ) {\n\n\t\t\t// corespondences for non-specific length types here match rply:\n\t\tcase 'int8':\t\tcase 'char':\t return [ dataview.getInt8( at ), 1 ];\n\n\t\tcase 'uint8':\t\tcase 'uchar':\t return [ dataview.getUint8( at ), 1 ];\n\n\t\tcase 'int16':\t\tcase 'short':\t return [ dataview.getInt16( at, little_endian ), 2 ];\n\n\t\tcase 'uint16':\tcase 'ushort': return [ dataview.getUint16( at, little_endian ), 2 ];\n\n\t\tcase 'int32':\t\tcase 'int':\t\t return [ dataview.getInt32( at, little_endian ), 4 ];\n\n\t\tcase 'uint32':\tcase 'uint':\t return [ dataview.getUint32( at, little_endian ), 4 ];\n\n\t\tcase 'float32': case 'float':\t return [ dataview.getFloat32( at, little_endian ), 4 ];\n\n\t\tcase 'float64': case 'double': return [ dataview.getFloat64( at, little_endian ), 8 ];\n\t\t\t\n\t\t}\n\t\t\n\t},\n\n\tbinaryReadElement: function ( dataview, at, properties, little_endian ) {\n\t\t\n\t\tvar element = Object();\n\t\tvar result, read = 0;\n\t\t\n\t\tfor ( var i = 0; i < properties.length; i ++ ) {\n\t\t \n\t\t\tif ( properties[i].type === \"list\" ) {\n\t\t\t\t\n\t\t\t\tvar list = [];\n\n\t\t\t\tresult = this.binaryRead( dataview, at+read, properties[i].countType, little_endian );\n\t\t\t\tvar n = result[0];\n\t\t\t\tread += result[1];\n\t\t\t\t\n\t\t\t\tfor ( j = 0; j < n; j ++ ) {\n\t\t\t\t\t\n\t\t\t\t\tresult = this.binaryRead( dataview, at+read, properties[i].itemType, little_endian );\n\t\t\t\t\tlist.push( result[0] );\n\t\t\t\t\tread += result[1];\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\telement[ properties[i].name ] = list;\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tresult = this.binaryRead( dataview, at+read, properties[i].type, little_endian );\n\t\t\t\telement[ properties[i].name ] = result[0];\n\t\t\t\tread += result[1];\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn [ element, read ];\n\t\t\n\t},\n\n\tparseBinary: function ( data ) {\n\n\t\tvar geometry = new THREE.Geometry();\n\n\t\tvar header = this.parseHeader( this.bin2str( data ) );\n\t\tvar little_endian = (header.format === \"binary_little_endian\");\n\t\tvar body = new DataView( data, header.headerLength );\n\t\tvar result, loc = 0;\n\n\t\tfor ( var currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {\n\t\t\t\n\t\t\tfor ( var currentElementCount = 0; currentElementCount < header.elements[currentElement].count; currentElementCount ++ ) {\n\t\t\t\n\t\t\t\tresult = this.binaryReadElement( body, loc, header.elements[currentElement].properties, little_endian );\n\t\t\t\tloc += result[1];\n\t\t\t\tvar element = result[0];\n\t\t\t\n\t\t\t\tthis.handleElement( geometry, header.elements[currentElement].name, element );\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn this.postProcess( geometry );\n\t\t\n\t}\n\n};\n\nTHREE.EventDispatcher.prototype.apply( THREE.PLYLoader.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/SceneLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/SceneLoader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SceneLoader = function () {\n\n\tthis.onLoadStart = function () {};\n\tthis.onLoadProgress = function() {};\n\tthis.onLoadComplete = function () {};\n\n\tthis.callbackSync = function () {};\n\tthis.callbackProgress = function () {};\n\n\tthis.geometryHandlers = {};\n\tthis.hierarchyHandlers = {};\n\n\tthis.addGeometryHandler( \"ascii\", THREE.JSONLoader );\n\n};\n\nTHREE.SceneLoader.prototype = {\n\n\tconstructor: THREE.SceneLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tscope.parse( JSON.parse( text ), onLoad, url );\n\n\t\t} );\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t},\n\n\taddGeometryHandler: function ( typeID, loaderClass ) {\n\n\t\tthis.geometryHandlers[ typeID ] = { \"loaderClass\": loaderClass };\n\n\t},\n\n\taddHierarchyHandler: function ( typeID, loaderClass ) {\n\n\t\tthis.hierarchyHandlers[ typeID ] = { \"loaderClass\": loaderClass };\n\n\t},\n\n\tparse: function ( json, callbackFinished, url ) {\n var func = \"THREE.SceneLoader.parse\";\n\n\t\tvar scope = this;\n\n\t\tvar urlBase = THREE.Loader.prototype.extractUrlBase( url );\n\n\t\tvar geometry, material, camera, fog,\n\t\t\ttexture, images, color,\n\t\t\tlight, hex, intensity,\n\t\t\tcounter_models, counter_textures,\n\t\t\ttotal_models, total_textures,\n\t\t\tresult;\n\n\t\tvar target_array = [];\n\n\t\tvar data = json;\n\n\t\t// async geometry loaders\n\n\t\tfor ( var typeID in this.geometryHandlers ) {\n\n\t\t\tvar loaderClass = this.geometryHandlers[ typeID ][ \"loaderClass\" ];\n\t\t\tthis.geometryHandlers[ typeID ][ \"loaderObject\" ] = new loaderClass();\n\n\t\t}\n\n\t\t// async hierachy loaders\n\n\t\tfor ( var typeID in this.hierarchyHandlers ) {\n\n\t\t\tvar loaderClass = this.hierarchyHandlers[ typeID ][ \"loaderClass\" ];\n\t\t\tthis.hierarchyHandlers[ typeID ][ \"loaderObject\" ] = new loaderClass();\n\n\t\t}\n\n\t\tcounter_models = 0;\n\t\tcounter_textures = 0;\n\n\t\tresult = {\n\n\t\t\tscene: new THREE.Scene(),\n\t\t\tgeometries: {},\n\t\t\tface_materials: {},\n\t\t\tmaterials: {},\n\t\t\ttextures: {},\n\t\t\tobjects: {},\n\t\t\tcameras: {},\n\t\t\tlights: {},\n\t\t\tfogs: {},\n\t\t\tempties: {},\n\t\t\tgroups: {}\n\n\t\t};\n\n\t\tif ( data.transform ) {\n\n\t\t\tvar position = data.transform.position,\n\t\t\t\trotation = data.transform.rotation,\n\t\t\t\tscale = data.transform.scale;\n\n\t\t\tif ( position ) {\n\n\t\t\t\tresult.scene.position.fromArray( position );\n\n\t\t\t}\n\n\t\t\tif ( rotation ) {\n\n\t\t\t\tresult.scene.rotation.fromArray( rotation );\n\n\t\t\t}\n\n\t\t\tif ( scale ) {\n\n\t\t\t\tresult.scene.scale.fromArray( scale );\n\n\t\t\t}\n\n\t\t\tif ( position || rotation || scale ) {\n\n\t\t\t\tresult.scene.updateMatrix();\n\t\t\t\tresult.scene.updateMatrixWorld();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction get_url( source_url, url_type ) {\n\n\t\t\tif ( url_type == \"relativeToHTML\" ) {\n\n\t\t\t\treturn source_url;\n\n\t\t\t} else {\n\n\t\t\t\treturn urlBase + source_url;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// toplevel loader function, delegates to handle_children\n\n\t\tfunction handle_objects() {\n var func = \"THREE.SceneLoader.parse.handle_objects\";\n\n\t\t\thandle_children( result.scene, data.objects );\n\n\t\t}\n\n\t\t// handle all the children from the loaded json and attach them to given parent\n\n\t\tfunction handle_children( parent, children ) {\n var func = \"THREE.SceneLoader.parse.handle_children\";\n hack.log(\"\", hack.sceneLoader, func);\n\n\t\t\tvar mat, dst, pos, rot, scl, quat;\n\n\t\t\tfor ( var objID in children ) {\n\n\t\t\t\t// check by id if child has already been handled,\n\t\t\t\t// if not, create new object\n\n\t\t\t\tvar object = result.objects[ objID ];\n\t\t\t\tvar objJSON = children[ objID ];\n\n hack.log(\"objID = <\"+objID+\">, object = \"+object, hack.sceneLoader, func);\n hack.log(\" geometry = \"+objJSON.geometry, hack.sceneLoader, func);\n hack.log(\" material = \"+objJSON.material, hack.sceneLoader, func);\n\n\t\t\t\tif ( object === undefined ) {\n\n\t\t\t\t\t// meshes\n\n\t\t\t\t\tif ( objJSON.type && ( objJSON.type in scope.hierarchyHandlers ) ) {\n\n\t\t\t\t\t\tif ( objJSON.loading === undefined ) {\n\n\t\t\t\t\t\t\tvar reservedTypes = {\n\t\t\t\t\t\t\t\t\"type\": 1, \"url\": 1, \"material\": 1,\n\t\t\t\t\t\t\t\t\"position\": 1, \"rotation\": 1, \"scale\" : 1,\n\t\t\t\t\t\t\t\t\"visible\": 1, \"children\": 1, \"userData\": 1,\n\t\t\t\t\t\t\t\t\"skin\": 1, \"morph\": 1, \"mirroredLoop\": 1, \"duration\": 1\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tvar loaderParameters = {};\n\n\t\t\t\t\t\t\tfor ( var parType in objJSON ) {\n\n\t\t\t\t\t\t\t\tif ( ! ( parType in reservedTypes ) ) {\n\n\t\t\t\t\t\t\t\t\tloaderParameters[ parType ] = objJSON[ parType ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tmaterial = result.materials[ objJSON.material ];\n\n\t\t\t\t\t\t\tobjJSON.loading = true;\n\n\t\t\t\t\t\t\tvar loader = scope.hierarchyHandlers[ objJSON.type ][ \"loaderObject\" ];\n\n\t\t\t\t\t\t\t// ColladaLoader\n\n\t\t\t\t\t\t\tif ( loader.options ) {\n\n\t\t\t\t\t\t\t\tloader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );\n\n\t\t\t\t\t\t\t// UTF8Loader\n\t\t\t\t\t\t\t// OBJLoader\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tloader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( objJSON.geometry !== undefined ) {\n\n\t\t\t\t\t\tgeometry = result.geometries[ objJSON.geometry ];\n\n\t\t\t\t\t\t// geometry already loaded\n\n\t\t\t\t\t\tif ( geometry ) {\n\n\t\t\t\t\t\t\tvar needsTangents = false;\n\n\t\t\t\t\t\t\tmaterial = result.materials[ objJSON.material ];\n\t\t\t\t\t\t\tneedsTangents = material instanceof THREE.ShaderMaterial;\n\n\t\t\t\t\t\t\tpos = objJSON.position;\n\t\t\t\t\t\t\trot = objJSON.rotation;\n\t\t\t\t\t\t\tscl = objJSON.scale;\n\t\t\t\t\t\t\tmat = objJSON.matrix;\n\t\t\t\t\t\t\tquat = objJSON.quaternion;\n\n\t\t\t\t\t\t\t// use materials from the model file\n\t\t\t\t\t\t\t// if there is no material specified in the object\n\n\t\t\t\t\t\t\tif ( ! objJSON.material ) {\n\n\t\t\t\t\t\t\t\tmaterial = new THREE.MeshFaceMaterial( result.face_materials[ objJSON.geometry ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// use materials from the model file\n\t\t\t\t\t\t\t// if there is just empty face material\n\t\t\t\t\t\t\t// (must create new material as each model has its own face material)\n\n\t\t\t\t\t\t\tif ( ( material instanceof THREE.MeshFaceMaterial ) && material.materials.length === 0 ) {\n\n\t\t\t\t\t\t\t\tmaterial = new THREE.MeshFaceMaterial( result.face_materials[ objJSON.geometry ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( material instanceof THREE.MeshFaceMaterial ) {\n\n\t\t\t\t\t\t\t\tfor ( var i = 0; i < material.materials.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tneedsTangents = needsTangents || ( material.materials[ i ] instanceof THREE.ShaderMaterial );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( needsTangents ) {\n\n\t\t\t\t\t\t\t\tgeometry.computeTangents();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( objJSON.skin ) {\n\n\t\t\t\t\t\t\t\tobject = new THREE.SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t\t} else if ( objJSON.morph ) {\n\n\t\t\t\t\t\t\t\tobject = new THREE.MorphAnimMesh( geometry, material );\n\n\t\t\t\t\t\t\t\tif ( objJSON.duration !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tobject.duration = objJSON.duration;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( objJSON.time !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tobject.time = objJSON.time;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( objJSON.mirroredLoop !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tobject.mirroredLoop = objJSON.mirroredLoop;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.computeMorphNormals();\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\n\t\t\t\t\t\t\t\tobject = new THREE.Mesh( geometry, material );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobject.name = objID;\n\n\t\t\t\t\t\t\tif ( mat ) {\n\n\t\t\t\t\t\t\t\tobject.matrixAutoUpdate = false;\n\t\t\t\t\t\t\t\tobject.matrix.set(\n\t\t\t\t\t\t\t\t\tmat[0], mat[1], mat[2], mat[3],\n\t\t\t\t\t\t\t\t\tmat[4], mat[5], mat[6], mat[7],\n\t\t\t\t\t\t\t\t\tmat[8], mat[9], mat[10], mat[11],\n\t\t\t\t\t\t\t\t\tmat[12], mat[13], mat[14], mat[15]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tobject.position.fromArray( pos );\n\n\t\t\t\t\t\t\t\tif ( quat ) {\n\n\t\t\t\t\t\t\t\t\tobject.quaternion.fromArray( quat );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tobject.rotation.fromArray( rot );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tobject.scale.fromArray( scl );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobject.visible = objJSON.visible;\n\t\t\t\t\t\t\tobject.castShadow = objJSON.castShadow;\n\t\t\t\t\t\t\tobject.receiveShadow = objJSON.receiveShadow;\n\n\t\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t\t\tresult.objects[ objID ] = object;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// lights\n\n\t\t\t\t\t} else if ( objJSON.type === \"AmbientLight\" || objJSON.type === \"PointLight\" ||\n\t\t\t\t\t\tobjJSON.type === \"DirectionalLight\" || objJSON.type === \"SpotLight\" ||\n\t\t\t\t\t\tobjJSON.type === \"HemisphereLight\" || objJSON.type === \"AreaLight\" ) {\n\n\t\t\t\t\t\tvar color = objJSON.color;\n\t\t\t\t\t\tvar intensity = objJSON.intensity;\n\t\t\t\t\t\tvar distance = objJSON.distance;\n\t\t\t\t\t\tvar position = objJSON.position;\n\t\t\t\t\t\tvar rotation = objJSON.rotation;\n\n\t\t\t\t\t\tswitch ( objJSON.type ) {\n\n\t\t\t\t\t\t\tcase 'AmbientLight':\n\t\t\t\t\t\t\t\tlight = new THREE.AmbientLight( color );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\t\t\tlight = new THREE.PointLight( color, intensity, distance );\n\t\t\t\t\t\t\t\tlight.position.fromArray( position );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\t\t\tlight = new THREE.DirectionalLight( color, intensity );\n\t\t\t\t\t\t\t\tlight.position.fromArray( objJSON.direction );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\t\t\tlight = new THREE.SpotLight( color, intensity, distance, 1 );\n\t\t\t\t\t\t\t\tlight.angle = objJSON.angle;\n\t\t\t\t\t\t\t\tlight.position.fromArray( position );\n\t\t\t\t\t\t\t\tlight.target.set( position[ 0 ], position[ 1 ] - distance, position[ 2 ] );\n\t\t\t\t\t\t\t\tlight.target.applyEuler( new THREE.Euler( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ], 'XYZ' ) );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\t\t\tlight = new THREE.DirectionalLight( color, intensity, distance );\n\t\t\t\t\t\t\t\tlight.target.set( position[ 0 ], position[ 1 ] - distance, position[ 2 ] );\n\t\t\t\t\t\t\t\tlight.target.applyEuler( new THREE.Euler( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ], 'XYZ' ) );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'AreaLight':\n\t\t\t\t\t\t\t\tlight = new THREE.AreaLight(color, intensity);\n\t\t\t\t\t\t\t\tlight.position.fromArray( position );\n\t\t\t\t\t\t\t\tlight.width = objJSON.size;\n\t\t\t\t\t\t\t\tlight.height = objJSON.size_y;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent.add( light );\n\n\t\t\t\t\t\tlight.name = objID;\n\t\t\t\t\t\tresult.lights[ objID ] = light;\n\t\t\t\t\t\tresult.objects[ objID ] = light;\n\n\t\t\t\t\t// cameras\n\n\t\t\t\t\t} else if ( objJSON.type === \"PerspectiveCamera\" || objJSON.type === \"OrthographicCamera\" ) {\n\n\t\t\t\t\t\tpos = objJSON.position;\n\t\t\t\t\t\trot = objJSON.rotation;\n\t\t\t\t\t\tquat = objJSON.quaternion;\n\n\t\t\t\t\t\tif ( objJSON.type === \"PerspectiveCamera\" ) {\n\n\t\t\t\t\t\t\tcamera = new THREE.PerspectiveCamera( objJSON.fov, objJSON.aspect, objJSON.near, objJSON.far );\n\n\t\t\t\t\t\t} else if ( objJSON.type === \"OrthographicCamera\" ) {\n\n\t\t\t\t\t\t\tcamera = new THREE.OrthographicCamera( objJSON.left, objJSON.right, objJSON.top, objJSON.bottom, objJSON.near, objJSON.far );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcamera.name = objID;\n\t\t\t\t\t\tcamera.position.fromArray( pos );\n\n\t\t\t\t\t\tif ( quat !== undefined ) {\n\n\t\t\t\t\t\t\tcamera.quaternion.fromArray( quat );\n\n\t\t\t\t\t\t} else if ( rot !== undefined ) {\n\n\t\t\t\t\t\t\tcamera.rotation.fromArray( rot );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent.add( camera );\n\n\t\t\t\t\t\tresult.cameras[ objID ] = camera;\n\t\t\t\t\t\tresult.objects[ objID ] = camera;\n\n\t\t\t\t\t// pure Object3D\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpos = objJSON.position;\n\t\t\t\t\t\trot = objJSON.rotation;\n\t\t\t\t\t\tscl = objJSON.scale;\n\t\t\t\t\t\tquat = objJSON.quaternion;\n\n\t\t\t\t\t\tobject = new THREE.Object3D();\n\t\t\t\t\t\tobject.name = objID;\n\t\t\t\t\t\tobject.position.fromArray( pos );\n\n\t\t\t\t\t\tif ( quat ) {\n\n\t\t\t\t\t\t\tobject.quaternion.fromArray( quat );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject.rotation.fromArray( rot );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tobject.scale.fromArray( scl );\n\t\t\t\t\t\tobject.visible = ( objJSON.visible !== undefined ) ? objJSON.visible : false;\n\n\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t\tresult.objects[ objID ] = object;\n\t\t\t\t\t\tresult.empties[ objID ] = object;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object ) {\n\n\t\t\t\t\t\tif ( objJSON.userData !== undefined ) {\n\n\t\t\t\t\t\t\tfor ( var key in objJSON.userData ) {\n\n\t\t\t\t\t\t\t\tvar value = objJSON.userData[ key ];\n\t\t\t\t\t\t\t\tobject.userData[ key ] = value;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( objJSON.groups !== undefined ) {\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < objJSON.groups.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tvar groupID = objJSON.groups[ i ];\n\n\t\t\t\t\t\t\t\tif ( result.groups[ groupID ] === undefined ) {\n\n\t\t\t\t\t\t\t\t\tresult.groups[ groupID ] = [];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tresult.groups[ groupID ].push( objID );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( object !== undefined && objJSON.children !== undefined ) {\n\n\t\t\t\t\thandle_children( object, objJSON.children );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction handle_mesh( geo, mat, id ) {\n var func = \"THREE.SceneLoader.parse.handle_mesh\";\n hack.log(\"id = \"+id+\", mat = \"+mat, hack.sceneLoader, func);\n\n\t\t\tresult.geometries[ id ] = geo;\n\t\t result.face_materials[ id ] = mat;\n\t\t\thandle_objects();\n\n\t\t};\n\n\t\tfunction handle_hierarchy( node, id, parent, material, obj ) {\n\n\t\t\tvar p = obj.position;\n\t\t\tvar r = obj.rotation;\n\t\t\tvar q = obj.quaternion;\n\t\t\tvar s = obj.scale;\n\n\t\t\tnode.position.fromArray( p );\n\n\t\t\tif ( q ) {\n\n\t\t\t\tnode.quaternion.fromArray( q );\n\n\t\t\t} else {\n\n\t\t\t\tnode.rotation.fromArray( r );\n\n\t\t\t}\n\n\t\t\tnode.scale.fromArray( s );\n\n\t\t\t// override children materials\n\t\t\t// if object material was specified in JSON explicitly\n\n\t\t\tif ( material ) {\n\n\t\t\t\tnode.traverse( function ( child ) {\n\n\t\t\t\t\tchild.material = material;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t// override children visibility\n\t\t\t// with root node visibility as specified in JSON\n\n\t\t\tvar visible = ( obj.visible !== undefined ) ? obj.visible : true;\n\n\t\t\tnode.traverse( function ( child ) {\n\n\t\t\t\tchild.visible = visible;\n\n\t\t\t} );\n\n\t\t\tparent.add( node );\n\n\t\t\tnode.name = id;\n\n\t\t\tresult.objects[ id ] = node;\n\t\t\thandle_objects();\n\n\t\t};\n\n\t\tfunction create_callback_geometry( id ) {\n\n\t\t\treturn function ( geo, mat ) {\n var func = \"THREE.SceneLoader.parse.create_callback_geometry.function\";\n \n\t\t\t\tgeo.name = id;\n\n handle_mesh( geo, mat, id );\n\n\t\t\t\tcounter_models -= 1;\n\n\t\t\t\tscope.onLoadComplete();\n\n\t\t\t\tasync_callback_gate();\n\n\t\t\t}\n\n\t\t};\n\n if (TiddlyWiki) {\n\t function create_callback_geometry_for_tiddlywiki_url(id) {\n\t return function (geo, mat) {\n var func = \"THREE.SceneLoader.parse.create_callback_geometry_for_tiddlywiki_url.function\";\n hack.log(\"id = \"+id, hack.sceneLoader, func);\n\t\tgeo.name = id;\n\n // Simply register geometry but don't try to handle all objects because\n // it's too early in the load process.\n // It seems there is a bug in the load process algorithm. It\n // assumes that most of objecs are already loaded when the current geometry\n // ends it's loading, because this callback is always called by a\n // geometryHandler which loads a remote URL. It's not the case with\n // TiddlyWiki URL : loading is immediate !\n \t\tresult.geometries[ id ] = geo;\n\t\tresult.face_materials[ id ] = mat;\n\t\t\n counter_models -= 1;\n\t\tscope.onLoadComplete();\n\t\tasync_callback_gate();\n\t }\n\t };\n }\n\n\t\tfunction create_callback_hierachy( id, parent, material, obj ) {\n\n\t\t\treturn function ( event ) {\n\n\t\t\t\tvar result;\n\n\t\t\t\t// loaders which use EventDispatcher\n\n\t\t\t\tif ( event.content ) {\n\n\t\t\t\t\tresult = event.content;\n\n\t\t\t\t// ColladaLoader\n\n\t\t\t\t} else if ( event.dae ) {\n\n\t\t\t\t\tresult = event.scene;\n\n\n\t\t\t\t// UTF8Loader\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult = event;\n\n\t\t\t\t}\n\n\t\t\t\thandle_hierarchy( result, id, parent, material, obj );\n\n\t\t\t\tcounter_models -= 1;\n\n\t\t\t\tscope.onLoadComplete();\n\n\t\t\t\tasync_callback_gate();\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction create_callback_embed( id ) {\n\n\t\t\treturn function ( geo, mat ) {\n\n\t\t\t\tgeo.name = id;\n\n\t\t\t\tresult.geometries[ id ] = geo;\n\t\t\t\tresult.face_materials[ id ] = mat;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction async_callback_gate() {\n\n\t\t\tvar progress = {\n\n\t\t\t\ttotalModels : total_models,\n\t\t\t\ttotalTextures : total_textures,\n\t\t\t\tloadedModels : total_models - counter_models,\n\t\t\t\tloadedTextures : total_textures - counter_textures\n\n\t\t\t};\n\n\t\t\tscope.callbackProgress( progress, result );\n\n\t\t\tscope.onLoadProgress();\n\n\t\t\tif ( counter_models === 0 && counter_textures === 0 ) {\n\n\t\t\t\tfinalize();\n\t\t\t\tcallbackFinished( result );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction finalize() {\n\n\t\t\t// take care of targets which could be asynchronously loaded objects\n\n\t\t\tfor ( var i = 0; i < target_array.length; i ++ ) {\n\n\t\t\t\tvar ta = target_array[ i ];\n\n\t\t\t\tvar target = result.objects[ ta.targetName ];\n\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\tta.object.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if there was error and target of specified name doesn't exist in the scene file\n\t\t\t\t\t// create instead dummy target\n\t\t\t\t\t// (target must be added to scene explicitly as parent is already added)\n\n\t\t\t\t\tta.object.target = new THREE.Object3D();\n\t\t\t\t\tresult.scene.add( ta.object.target );\n\n\t\t\t\t}\n\n\t\t\t\tta.object.target.userData.targetInverse = ta.object;\n\n\t\t\t}\n\n\t\t};\n\n\t\tvar callbackTexture = function ( count ) {\n\n\t\t\tcounter_textures -= count;\n\t\t\tasync_callback_gate();\n\n\t\t\tscope.onLoadComplete();\n\n\t\t};\n\n\t\t// must use this instead of just directly calling callbackTexture\n\t\t// because of closure in the calling context loop\n\n\t\tvar generateTextureCallback = function ( count ) {\n\n\t\t\treturn function () {\n\n\t\t\t\tcallbackTexture( count );\n\n\t\t\t};\n\n\t\t};\n\n\t\tfunction traverse_json_hierarchy( objJSON, callback ) {\n\n\t\t\tcallback( objJSON );\n\n\t\t\tif ( objJSON.children !== undefined ) {\n\n\t\t\t\tfor ( var objChildID in objJSON.children ) {\n\n\t\t\t\t\ttraverse_json_hierarchy( objJSON.children[ objChildID ], callback );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// first go synchronous elements\n\n\t\t// fogs\n\n\t\tvar fogID, fogJSON;\n\n\t\tfor ( fogID in data.fogs ) {\n\n\t\t\tfogJSON = data.fogs[ fogID ];\n\n\t\t\tif ( fogJSON.type === \"linear\" ) {\n\n\t\t\t\tfog = new THREE.Fog( 0x000000, fogJSON.near, fogJSON.far );\n\n\t\t\t} else if ( fogJSON.type === \"exp2\" ) {\n\n\t\t\t\tfog = new THREE.FogExp2( 0x000000, fogJSON.density );\n\n\t\t\t}\n\n\t\t\tcolor = fogJSON.color;\n\t\t\tfog.color.setRGB( color[0], color[1], color[2] );\n\n\t\t\tresult.fogs[ fogID ] = fog;\n\n\t\t}\n\n\t\t// now come potentially asynchronous elements\n\n\t\t// geometries\n\n\t\t// count how many geometries will be loaded asynchronously\n\n\t\tvar geoID, geoJSON;\n\n\t\tfor ( geoID in data.geometries ) {\n\n\t\t\tgeoJSON = data.geometries[ geoID ];\n\n\t\t\tif ( geoJSON.type in this.geometryHandlers ) {\n\n\t\t\t\tcounter_models += 1;\n\n\t\t\t\tscope.onLoadStart();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// count how many hierarchies will be loaded asynchronously\n\n\t\tfor ( var objID in data.objects ) {\n\n\t\t\ttraverse_json_hierarchy( data.objects[ objID ], function ( objJSON ) {\n\n\t\t\t\tif ( objJSON.type && ( objJSON.type in scope.hierarchyHandlers ) ) {\n\n\t\t\t\t\tcounter_models += 1;\n\n\t\t\t\t\tscope.onLoadStart();\n\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t}\n\n\t\ttotal_models = counter_models;\n\n\t\tfor ( geoID in data.geometries ) {\n\n\t\t\tgeoJSON = data.geometries[ geoID ];\n\n\t\t\tif ( geoJSON.type === \"cube\" ) {\n\n\t\t\t\tgeometry = new THREE.BoxGeometry( geoJSON.width, geoJSON.height, geoJSON.depth, geoJSON.widthSegments, geoJSON.heightSegments, geoJSON.depthSegments );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"plane\" ) {\n\n\t\t\t\tgeometry = new THREE.PlaneGeometry( geoJSON.width, geoJSON.height, geoJSON.widthSegments, geoJSON.heightSegments );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"sphere\" ) {\n\n\t\t\t\tgeometry = new THREE.SphereGeometry( geoJSON.radius, geoJSON.widthSegments, geoJSON.heightSegments );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"cylinder\" ) {\n\n\t\t\t\tgeometry = new THREE.CylinderGeometry( geoJSON.topRad, geoJSON.botRad, geoJSON.height, geoJSON.radSegs, geoJSON.heightSegs );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"torus\" ) {\n\n\t\t\t\tgeometry = new THREE.TorusGeometry( geoJSON.radius, geoJSON.tube, geoJSON.segmentsR, geoJSON.segmentsT );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"icosahedron\" ) {\n\n\t\t\t\tgeometry = new THREE.IcosahedronGeometry( geoJSON.radius, geoJSON.subdivisions );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type in this.geometryHandlers ) {\n\n\t\t\t\tvar loaderParameters = {};\n\n\t\t\t\tfor ( var parType in geoJSON ) {\n\n\t\t\t\t\tif ( parType !== \"type\" && parType !== \"url\" ) {\n\n\t\t\t\t\t\tloaderParameters[ parType ] = geoJSON[ parType ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar loader = this.geometryHandlers[ geoJSON.type ][ \"loaderObject\" ];\n hack.log(\"geoJSON.type = \"+geoJSON.type+\", geoJSON.url = \"+geoJSON.url, hack.sceneLoader, func);\n if (TiddlyWiki && geoJSON.url.match(/^tw:/)) {\n\t\t\t loader.load( get_url( geoJSON.url, data.urlBaseType ), create_callback_geometry_for_tiddlywiki_url( geoID ), loaderParameters );\n } else\n\t\t\t loader.load( get_url( geoJSON.url, data.urlBaseType ), create_callback_geometry( geoID ), loaderParameters );\n\n\t\t\t} else if ( geoJSON.type === \"embedded\" ) {\n\n\t\t\t\tvar modelJson = data.embeds[ geoJSON.id ],\n\t\t\t\t\ttexture_path = \"\";\n\n\t\t\t\t// pass metadata along to jsonLoader so it knows the format version\n\n\t\t\t\tmodelJson.metadata = data.metadata;\n\n\t\t\t\tif ( modelJson ) {\n\n\t\t\t\t\tvar jsonLoader = this.geometryHandlers[ \"ascii\" ][ \"loaderObject\" ];\n\t\t\t\t\tvar model = jsonLoader.parse( modelJson, texture_path );\n\t\t\t\t\tcreate_callback_embed( geoID )( model.geometry, model.materials );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// textures\n\n\t\t// count how many textures will be loaded asynchronously\n\n\t\tvar textureID, textureJSON;\n\n\t\tfor ( textureID in data.textures ) {\n\n\t\t\ttextureJSON = data.textures[ textureID ];\n\n\t\t\tif ( textureJSON.url instanceof Array ) {\n\n\t\t\t\tcounter_textures += textureJSON.url.length;\n\n\t\t\t\tfor( var n = 0; n < textureJSON.url.length; n ++ ) {\n\n\t\t\t\t\tscope.onLoadStart();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcounter_textures += 1;\n\n\t\t\t\tscope.onLoadStart();\n\n\t\t\t}\n\n\t\t}\n\n\t\ttotal_textures = counter_textures;\n\n\t\tfor ( textureID in data.textures ) {\n\n\t\t\ttextureJSON = data.textures[ textureID ];\n\n\t\t\tif ( textureJSON.mapping !== undefined && THREE[ textureJSON.mapping ] !== undefined ) {\n\n\t\t\t\ttextureJSON.mapping = new THREE[ textureJSON.mapping ]();\n\n\t\t\t}\n\n\t\t\tvar texture;\n\n\t\t\tif ( textureJSON.url instanceof Array ) {\n\n\t\t\t\tvar count = textureJSON.url.length;\n\t\t\t\tvar url_array = [];\n\n\t\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\t\turl_array[ i ] = get_url( textureJSON.url[ i ], data.urlBaseType );\n\n\t\t\t\t}\n\n\t\t\t\tvar loader = THREE.Loader.Handlers.get( url_array[ 0 ] );\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( url_array, generateTextureCallback( count ) );\n\t\t\t\t\ttexture.mapping = textureJSON.mapping;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = THREE.ImageUtils.loadTextureCube( url_array, textureJSON.mapping, generateTextureCallback( count ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar fullUrl = get_url( textureJSON.url, data.urlBaseType );\n\t\t\t\tvar textureCallback = generateTextureCallback( 1 );\n\n\t\t\t\tvar loader = THREE.Loader.Handlers.get( fullUrl );\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullUrl, textureCallback );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = new THREE.Texture();\n\t\t\t\t\tloader = new THREE.ImageLoader();\n\t\t\t\t\t\n\t\t\t\t\t( function ( texture ) {\n\n\t\t\t\t\t\tloader.load( fullUrl, function ( image ) {\n\n\t\t\t\t\t\t\ttexture.image = image;\n\t\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\t\ttextureCallback();\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\n\t\t\t\t\t} )( texture )\n\t\t\t\t\t\n\n\t\t\t\t}\n\n\t\t\t\ttexture.mapping = textureJSON.mapping;\n\n\t\t\t\tif ( THREE[ textureJSON.minFilter ] !== undefined )\n\t\t\t\t\ttexture.minFilter = THREE[ textureJSON.minFilter ];\n\n\t\t\t\tif ( THREE[ textureJSON.magFilter ] !== undefined )\n\t\t\t\t\ttexture.magFilter = THREE[ textureJSON.magFilter ];\n\n\t\t\t\tif ( textureJSON.anisotropy ) texture.anisotropy = textureJSON.anisotropy;\n\n\t\t\t\tif ( textureJSON.repeat ) {\n\n\t\t\t\t\ttexture.repeat.set( textureJSON.repeat[ 0 ], textureJSON.repeat[ 1 ] );\n\n\t\t\t\t\tif ( textureJSON.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;\n\t\t\t\t\tif ( textureJSON.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureJSON.offset ) {\n\n\t\t\t\t\ttexture.offset.set( textureJSON.offset[ 0 ], textureJSON.offset[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// handle wrap after repeat so that default repeat can be overriden\n\n\t\t\t\tif ( textureJSON.wrap ) {\n\n\t\t\t\t\tvar wrapMap = {\n\t\t\t\t\t\t\"repeat\": THREE.RepeatWrapping,\n\t\t\t\t\t\t\"mirror\": THREE.MirroredRepeatWrapping\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrapMap[ textureJSON.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ textureJSON.wrap[ 0 ] ];\n\t\t\t\t\tif ( wrapMap[ textureJSON.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ textureJSON.wrap[ 1 ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tresult.textures[ textureID ] = texture;\n\n\t\t}\n\n\t\t// materials\n\n\t\tvar matID, matJSON;\n\t\tvar parID;\n\n\t\tfor ( matID in data.materials ) {\n\n\t\t\tmatJSON = data.materials[ matID ];\n\n\t\t\tfor ( parID in matJSON.parameters ) {\n\n\t\t\t\tif ( parID === \"envMap\" || parID === \"map\" || parID === \"lightMap\" || parID === \"bumpMap\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = result.textures[ matJSON.parameters[ parID ] ];\n\n\t\t\t\t} else if ( parID === \"shading\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = ( matJSON.parameters[ parID ] === \"flat\" ) ? THREE.FlatShading : THREE.SmoothShading;\n\n\t\t\t\t} else if ( parID === \"side\" ) {\n\n\t\t\t\t\tif ( matJSON.parameters[ parID ] == \"double\" ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.DoubleSide;\n\n\t\t\t\t\t} else if ( matJSON.parameters[ parID ] == \"back\" ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.BackSide;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.FrontSide;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( parID === \"blending\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.NormalBlending;\n\n\t\t\t\t} else if ( parID === \"combine\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.MultiplyOperation;\n\n\t\t\t\t} else if ( parID === \"vertexColors\" ) {\n\n\t\t\t\t\tif ( matJSON.parameters[ parID ] == \"face\" ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.FaceColors;\n\n\t\t\t\t\t// default to vertex colors if \"vertexColors\" is anything else face colors or 0 / null / false\n\n\t\t\t\t\t} else if ( matJSON.parameters[ parID ] ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.VertexColors;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( parID === \"wrapRGB\" ) {\n\n\t\t\t\t\tvar v3 = matJSON.parameters[ parID ];\n\t\t\t\t\tmatJSON.parameters[ parID ] = new THREE.Vector3( v3[ 0 ], v3[ 1 ], v3[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( matJSON.parameters.opacity !== undefined && matJSON.parameters.opacity < 1.0 ) {\n\n\t\t\t\tmatJSON.parameters.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( matJSON.parameters.normalMap ) {\n\n\t\t\t\tvar shader = THREE.ShaderLib[ \"normalmap\" ];\n\t\t\t\tvar uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\t\t\t\tvar diffuse = matJSON.parameters.color;\n\t\t\t\tvar specular = matJSON.parameters.specular;\n\t\t\t\tvar ambient = matJSON.parameters.ambient;\n\t\t\t\tvar shininess = matJSON.parameters.shininess;\n\n\t\t\t\tuniforms[ \"tNormal\" ].value = result.textures[ matJSON.parameters.normalMap ];\n\n\t\t\t\tif ( matJSON.parameters.normalScale ) {\n\n\t\t\t\t\tuniforms[ \"uNormalScale\" ].value.set( matJSON.parameters.normalScale[ 0 ], matJSON.parameters.normalScale[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( matJSON.parameters.map ) {\n\n\t\t\t\t\tuniforms[ \"tDiffuse\" ].value = matJSON.parameters.map;\n\t\t\t\t\tuniforms[ \"enableDiffuse\" ].value = true;\n\n\t\t\t\t}\n\n\t\t\t\tif ( matJSON.parameters.envMap ) {\n\n\t\t\t\t\tuniforms[ \"tCube\" ].value = matJSON.parameters.envMap;\n\t\t\t\t\tuniforms[ \"enableReflection\" ].value = true;\n\t\t\t\t\tuniforms[ \"reflectivity\" ].value = matJSON.parameters.reflectivity;\n\n\t\t\t\t}\n\n\t\t\t\tif ( matJSON.parameters.lightMap ) {\n\n\t\t\t\t\tuniforms[ \"tAO\" ].value = matJSON.parameters.lightMap;\n\t\t\t\t\tuniforms[ \"enableAO\" ].value = true;\n\n\t\t\t\t}\n\n\t\t\t\tif ( matJSON.parameters.specularMap ) {\n\n\t\t\t\t\tuniforms[ \"tSpecular\" ].value = result.textures[ matJSON.parameters.specularMap ];\n\t\t\t\t\tuniforms[ \"enableSpecular\" ].value = true;\n\n\t\t\t\t}\n\n\t\t\t\tif ( matJSON.parameters.displacementMap ) {\n\n\t\t\t\t\tuniforms[ \"tDisplacement\" ].value = result.textures[ matJSON.parameters.displacementMap ];\n\t\t\t\t\tuniforms[ \"enableDisplacement\" ].value = true;\n\n\t\t\t\t\tuniforms[ \"uDisplacementBias\" ].value = matJSON.parameters.displacementBias;\n\t\t\t\t\tuniforms[ \"uDisplacementScale\" ].value = matJSON.parameters.displacementScale;\n\n\t\t\t\t}\n\n\t\t\t\tuniforms[ \"diffuse\" ].value.setHex( diffuse );\n\t\t\t\tuniforms[ \"specular\" ].value.setHex( specular );\n\t\t\t\tuniforms[ \"ambient\" ].value.setHex( ambient );\n\n\t\t\t\tuniforms[ \"shininess\" ].value = shininess;\n\n\t\t\t\tif ( matJSON.parameters.opacity ) {\n\n\t\t\t\t\tuniforms[ \"opacity\" ].value = matJSON.parameters.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tvar parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };\n\n\t\t\t\tmaterial = new THREE.ShaderMaterial( parameters );\n\n\t\t\t} else {\n\n\t\t\t\tmaterial = new THREE[ matJSON.type ]( matJSON.parameters );\n\n\t\t\t}\n\n\t\t\tmaterial.name = matID;\n\n\t\t\tresult.materials[ matID ] = material;\n\n\t\t}\n\n\t\t// second pass through all materials to initialize MeshFaceMaterials\n\t\t// that could be referring to other materials out of order\n\n\t\tfor ( matID in data.materials ) {\n\n\t\t\tmatJSON = data.materials[ matID ];\n\n\t\t\tif ( matJSON.parameters.materials ) {\n\n\t\t\t\tvar materialArray = [];\n\n\t\t\t\tfor ( var i = 0; i < matJSON.parameters.materials.length; i ++ ) {\n\n\t\t\t\t\tvar label = matJSON.parameters.materials[ i ];\n\t\t\t\t\tmaterialArray.push( result.materials[ label ] );\n\n\t\t\t\t}\n\n\t\t\t\tresult.materials[ matID ].materials = materialArray;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// objects ( synchronous init of procedural primitives )\n\n\t\thandle_objects();\n\n\t\t// defaults\n\n\t\tif ( result.cameras && data.defaults.camera ) {\n\n\t\t\tresult.currentCamera = result.cameras[ data.defaults.camera ];\n\n\t\t}\n\n\t\tif ( result.fogs && data.defaults.fog ) {\n\n\t\t\tresult.scene.fog = result.fogs[ data.defaults.fog ];\n\n\t\t}\n\n\t\t// synchronous callback\n\n\t\tscope.callbackSync( result );\n\n\t\t// just in case there are no async elements\n\n\t\tasync_callback_gate();\n\n\t}\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/STLLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/STLLoader.js",
"module-type": "library",
"text": "/**\n * @author aleeper / http://adamleeper.com/\n * @author mrdoob / http://mrdoob.com/\n * @author gero3 / https://github.com/gero3\n *\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * Limitations:\n * \tBinary decoding ignores header. There doesn't seem to be much of a use for it.\n * \tThere is perhaps some question as to how valid it is to always assume little-endian-ness.\n * \tASCII decoding assumes file is UTF-8. Seems to work for the examples...\n *\n * Usage:\n * \tvar loader = new THREE.STLLoader();\n * \tloader.addEventListener( 'load', function ( event ) {\n *\n * \t\tvar geometry = event.content;\n * \t\tscene.add( new THREE.Mesh( geometry ) );\n *\n * \t} );\n * \tloader.load( './models/stl/slotted_disk.stl' );\n */\n\n\nTHREE.STLLoader = function () {};\n\nTHREE.STLLoader.prototype = {\n\n\tconstructor: THREE.STLLoader\n\n};\n\nTHREE.STLLoader.prototype.load = function ( url, callback ) {\n var func = \"THREE.STLLoader.load\";\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\n var geometry = this.parse(res);\n this.dispatchEvent({type: 'load', content: geometry});\n if (callback) callback(geometry);\n\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\tvar scope = this;\n\n\tvar xhr = new XMLHttpRequest();\n\n\tfunction onloaded( event ) {\n\n\t\tif ( event.target.status === 200 || event.target.status === 0 ) {\n\n\t\t\tvar geometry = scope.parse( event.target.response || event.target.responseText );\n\n\t\t\tscope.dispatchEvent( { type: 'load', content: geometry } );\n\n\t\t\tif ( callback ) callback( geometry );\n\n\t\t} else {\n\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']', response: event.target.statusText } );\n\n\t\t}\n\n\t}\n\n\txhr.addEventListener( 'load', onloaded, false );\n\n\txhr.addEventListener( 'progress', function ( event ) {\n\n\t\tscope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );\n\n\t}, false );\n\n\txhr.addEventListener( 'error', function () {\n\n\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\n\n\t}, false );\n\n\tif ( xhr.overrideMimeType ) xhr.overrideMimeType( 'text/plain; charset=x-user-defined' );\n\txhr.open( 'GET', url, true );\n\txhr.responseType = 'arraybuffer';\n\txhr.send( null );\n\n};\n\nTHREE.STLLoader.prototype.parse = function ( data ) {\n var func = \"THREE.STLLoader.parse\";\n\n\tvar isBinary = function () {\n\n\t\tvar expect, face_size, n_faces, reader;\n\t\treader = new DataView( binData );\n\t\tface_size = (32 / 8 * 3) + ((32 / 8 * 3) * 3) + (16 / 8);\n\t\tn_faces = reader.getUint32(80,true);\n\t\texpect = 80 + (32 / 8) + (n_faces * face_size);\n\t\treturn expect === reader.byteLength;\n\n\t};\n\n\tvar binData = this.ensureBinary( data );\n\n\treturn isBinary()\n\t\t? this.parseBinary( binData )\n\t\t: this.parseASCII( this.ensureString( data ) );\n\n};\n\nTHREE.STLLoader.prototype.parseBinary = function ( data ) {\n\n\tvar reader = new DataView( data );\n\tvar faces = reader.getUint32( 80, true );\n\tvar dataOffset = 84;\n\tvar faceLength = 12 * 4 + 2;\n\n\tvar offset = 0;\n\n\tvar geometry = new THREE.BufferGeometry();\n\n\tvar vertices = new Float32Array( faces * 3 * 3 );\n\tvar normals = new Float32Array( faces * 3 * 3 );\n\n\tfor ( var face = 0; face < faces; face ++ ) {\n\n\t\tvar start = dataOffset + face * faceLength;\n\n\t\tfor ( var i = 1; i <= 3; i ++ ) {\n\n\t\t\tvar vertexstart = start + i * 12;\n\n\t\t\tvertices[ offset ] = reader.getFloat32( vertexstart, true );\n\t\t\tvertices[ offset + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\tvertices[ offset + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\tnormals[ offset ] = reader.getFloat32( start , true );\n\t\t\tnormals[ offset + 1 ] = reader.getFloat32( start + 4, true );\n\t\t\tnormals[ offset + 2 ] = reader.getFloat32( start + 8, true );\n\n\t\t\toffset += 3;\n\n\t\t}\n\n\t}\n\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\n\n\treturn geometry;\n\n};\n\nTHREE.STLLoader.prototype.parseASCII = function (data) {\n var func = \"THREE.STLLoader.parseASCII\";\n\n\tvar geometry, length, normal, patternFace, patternNormal, patternVertex, result, text;\n\tgeometry = new THREE.Geometry();\n\tpatternFace = /facet([\\s\\S]*?)endfacet/g;\n\n\twhile ( ( result = patternFace.exec( data ) ) !== null ) {\n\n\t\ttext = result[0];\n\t\tpatternNormal = /normal[\\s]+([\\-+]?[0-9]+\\.?[0-9]*([eE][\\-+]?[0-9]+)?)+[\\s]+([\\-+]?[0-9]*\\.?[0-9]+([eE][\\-+]?[0-9]+)?)+[\\s]+([\\-+]?[0-9]*\\.?[0-9]+([eE][\\-+]?[0-9]+)?)+/g;\n\n\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\tnormal = new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) );\n\n\t\t}\n\n\t\tpatternVertex = /vertex[\\s]+([\\-+]?[0-9]+\\.?[0-9]*([eE][\\-+]?[0-9]+)?)+[\\s]+([\\-+]?[0-9]*\\.?[0-9]+([eE][\\-+]?[0-9]+)?)+[\\s]+([\\-+]?[0-9]*\\.?[0-9]+([eE][\\-+]?[0-9]+)?)+/g;\n\n\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\tgeometry.vertices.push( new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) ) );\n\n\t\t}\n\n\t\tlength = geometry.vertices.length;\n\n\t\tgeometry.faces.push( new THREE.Face3( length - 3, length - 2, length - 1, normal ) );\n\n\t}\n\n\tgeometry.computeBoundingBox();\n\tgeometry.computeBoundingSphere();\n\n\treturn geometry;\n\n};\n\nTHREE.STLLoader.prototype.ensureString = function (buf) {\n var func = \"THREE.STLLoader.ensureString\";\n\n\tif (typeof buf !== \"string\"){\n\t\tvar array_buffer = new Uint8Array(buf);\n\t\tvar str = '';\n\t\tfor(var i = 0; i < buf.byteLength; i++) {\n\t\t\tstr += String.fromCharCode(array_buffer[i]); // implicitly assumes little-endian\n\t\t}\n\t\treturn str;\n\t} else {\n\t\treturn buf;\n\t}\n\n};\n\nTHREE.STLLoader.prototype.ensureBinary = function (buf) {\n\n\tif (typeof buf === \"string\"){\n\t\tvar array_buffer = new Uint8Array(buf.length);\n\t\tfor(var i = 0; i < buf.length; i++) {\n\t\t\tarray_buffer[i] = buf.charCodeAt(i) & 0xff; // implicitly assumes little-endian\n\t\t}\n\t\treturn array_buffer.buffer || array_buffer;\n\t} else {\n\t\treturn buf;\n\t}\n\n};\n\nTHREE.EventDispatcher.prototype.apply( THREE.STLLoader.prototype );\n\nif ( typeof DataView === 'undefined'){\n\n\tDataView = function(buffer, byteOffset, byteLength){\n\n\t\tthis.buffer = buffer;\n\t\tthis.byteOffset = byteOffset || 0;\n\t\tthis.byteLength = byteLength || buffer.byteLength || buffer.length;\n\t\tthis._isString = typeof buffer === \"string\";\n\n\t}\n\n\tDataView.prototype = {\n\n\t\t_getCharCodes:function(buffer,start,length){\n\t\t\tstart = start || 0;\n\t\t\tlength = length || buffer.length;\n\t\t\tvar end = start + length;\n\t\t\tvar codes = [];\n\t\t\tfor (var i = start; i < end; i++) {\n\t\t\t\tcodes.push(buffer.charCodeAt(i) & 0xff);\n\t\t\t}\n\t\t\treturn codes;\n\t\t},\n\n\t\t_getBytes: function (length, byteOffset, littleEndian) {\n\n\t\t\tvar result;\n\n\t\t\t// Handle the lack of endianness\n\t\t\tif (littleEndian === undefined) {\n\n\t\t\t\tlittleEndian = this._littleEndian;\n\n\t\t\t}\n\n\t\t\t// Handle the lack of byteOffset\n\t\t\tif (byteOffset === undefined) {\n\n\t\t\t\tbyteOffset = this.byteOffset;\n\n\t\t\t} else {\n\n\t\t\t\tbyteOffset = this.byteOffset + byteOffset;\n\n\t\t\t}\n\n\t\t\tif (length === undefined) {\n\n\t\t\t\tlength = this.byteLength - byteOffset;\n\n\t\t\t}\n\n\t\t\t// Error Checking\n\t\t\tif (typeof byteOffset !== 'number') {\n\n\t\t\t\tthrow new TypeError('DataView byteOffset is not a number');\n\n\t\t\t}\n\n\t\t\tif (length < 0 || byteOffset + length > this.byteLength) {\n\n\t\t\t\tthrow new Error('DataView length or (byteOffset+length) value is out of bounds');\n\n\t\t\t}\n\n\t\t\tif (this.isString){\n\n\t\t\t\tresult = this._getCharCodes(this.buffer, byteOffset, byteOffset + length);\n\n\t\t\t} else {\n\n\t\t\t\tresult = this.buffer.slice(byteOffset, byteOffset + length);\n\n\t\t\t}\n\n\t\t\tif (!littleEndian && length > 1) {\n\n\t\t\t\tif (!(result instanceof Array)) {\n\n\t\t\t\t\tresult = Array.prototype.slice.call(result);\n\n\t\t\t\t}\n\n\t\t\t\tresult.reverse();\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Compatibility functions on a String Buffer\n\n\t\tgetFloat64: function (byteOffset, littleEndian) {\n\n\t\t\tvar b = this._getBytes(8, byteOffset, littleEndian),\n\n\t\t\t\tsign = 1 - (2 * (b[7] >> 7)),\n\t\t\t\texponent = ((((b[7] << 1) & 0xff) << 3) | (b[6] >> 4)) - ((1 << 10) - 1),\n\n\t\t\t// Binary operators such as | and << operate on 32 bit values, using + and Math.pow(2) instead\n\t\t\t\tmantissa = ((b[6] & 0x0f) * Math.pow(2, 48)) + (b[5] * Math.pow(2, 40)) + (b[4] * Math.pow(2, 32)) +\n\t\t\t\t\t\t\t(b[3] * Math.pow(2, 24)) + (b[2] * Math.pow(2, 16)) + (b[1] * Math.pow(2, 8)) + b[0];\n\n\t\t\tif (exponent === 1024) {\n\t\t\t\tif (mantissa !== 0) {\n\t\t\t\t\treturn NaN;\n\t\t\t\t} else {\n\t\t\t\t\treturn sign * Infinity;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (exponent === -1023) { // Denormalized\n\t\t\t\treturn sign * mantissa * Math.pow(2, -1022 - 52);\n\t\t\t}\n\n\t\t\treturn sign * (1 + mantissa * Math.pow(2, -52)) * Math.pow(2, exponent);\n\n\t\t},\n\n\t\tgetFloat32: function (byteOffset, littleEndian) {\n\n\t\t\tvar b = this._getBytes(4, byteOffset, littleEndian),\n\n\t\t\t\tsign = 1 - (2 * (b[3] >> 7)),\n\t\t\t\texponent = (((b[3] << 1) & 0xff) | (b[2] >> 7)) - 127,\n\t\t\t\tmantissa = ((b[2] & 0x7f) << 16) | (b[1] << 8) | b[0];\n\n\t\t\tif (exponent === 128) {\n\t\t\t\tif (mantissa !== 0) {\n\t\t\t\t\treturn NaN;\n\t\t\t\t} else {\n\t\t\t\t\treturn sign * Infinity;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (exponent === -127) { // Denormalized\n\t\t\t\treturn sign * mantissa * Math.pow(2, -126 - 23);\n\t\t\t}\n\n\t\t\treturn sign * (1 + mantissa * Math.pow(2, -23)) * Math.pow(2, exponent);\n\t\t},\n\n\t\tgetInt32: function (byteOffset, littleEndian) {\n\t\t\tvar b = this._getBytes(4, byteOffset, littleEndian);\n\t\t\treturn (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0];\n\t\t},\n\n\t\tgetUint32: function (byteOffset, littleEndian) {\n\t\t\treturn this.getInt32(byteOffset, littleEndian) >>> 0;\n\t\t},\n\n\t\tgetInt16: function (byteOffset, littleEndian) {\n\t\t\treturn (this.getUint16(byteOffset, littleEndian) << 16) >> 16;\n\t\t},\n\n\t\tgetUint16: function (byteOffset, littleEndian) {\n\t\t\tvar b = this._getBytes(2, byteOffset, littleEndian);\n\t\t\treturn (b[1] << 8) | b[0];\n\t\t},\n\n\t\tgetInt8: function (byteOffset) {\n\t\t\treturn (this.getUint8(byteOffset) << 24) >> 24;\n\t\t},\n\n\t\tgetUint8: function (byteOffset) {\n\t\t\treturn this._getBytes(1, byteOffset)[0];\n\t\t}\n\n\t };\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/UTF8Loader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/UTF8Loader.js",
"module-type": "library",
"text": "/**\n * Loader for UTF8 version2 (after r51) encoded models generated by:\n *\thttp://code.google.com/p/webgl-loader/\n *\n * Code to load/decompress mesh is taken from r100 of this webgl-loader\n */\n\nTHREE.UTF8Loader = function () {};\n\n/**\n * Load UTF8 encoded model\n * @param jsonUrl - URL from which to load json containing information about model\n * @param callback - Callback(THREE.Object3D) on successful loading of model\n * @param options - options on how to load model (see THREE.MTLLoader.MaterialCreator for basic options)\n * Additional options include\n * geometryBase: Base url from which to load referenced geometries\n * materialBase: Base url from which to load referenced textures\n */\n\nTHREE.UTF8Loader.prototype.load = function ( jsonUrl, callback, options ) {\n var func = \"THREE.UTF8Loader.load\";\n hack.log(\"url: \"+jsonUrl, hack.loader, func);\n\n this.downloadModelJson( jsonUrl, options, callback );\n\n};\n\n// BufferGeometryCreator\n\nTHREE.UTF8Loader.BufferGeometryCreator = function () {\n};\n\nTHREE.UTF8Loader.BufferGeometryCreator.prototype.create = function ( attribArray, indices ) {\n\n\tvar ntris = indices.length / 3;\n\n\tvar geometry = new THREE.BufferGeometry();\n\n\tvar positions = new Float32Array( ntris * 3 * 3 );\n\tvar normals = new Float32Array( ntris * 3 * 3 );\n\tvar uvs = new Float32Array( ntris * 3 * 2 );\n\n\tvar i, j, offset;\n\tvar x, y, z;\n\tvar u, v;\n\n\tvar end = attribArray.length;\n\tvar stride = 8;\n\n\t// extract positions\n\n\tj = 0;\n\toffset = 0;\n\n\tfor( i = offset; i < end; i += stride ) {\n\n\t\tx = attribArray[ i ];\n\t\ty = attribArray[ i + 1 ];\n\t\tz = attribArray[ i + 2 ];\n\n\t\tpositions[ j++ ] = x;\n\t\tpositions[ j++ ] = y;\n\t\tpositions[ j++ ] = z;\n\n\t}\n\n\t// extract uvs\n\n\tj = 0;\n\toffset = 3;\n\n\tfor( i = offset; i < end; i += stride ) {\n\n\t\tu = attribArray[ i ];\n\t\tv = attribArray[ i + 1 ];\n\n\t\tuvs[ j++ ] = u;\n\t\tuvs[ j++ ] = v;\n\n\t}\n\n\t// extract normals\n\n\tj = 0;\n\toffset = 5;\n\n\tfor( i = offset; i < end; i += stride ) {\n\n\t\tx = attribArray[ i ];\n\t\ty = attribArray[ i + 1 ];\n\t\tz = attribArray[ i + 2 ];\n\n\t\tnormals[ j++ ] = x;\n\t\tnormals[ j++ ] = y;\n\t\tnormals[ j++ ] = z;\n\n\t}\n\n geometry.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );\n geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\n geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\n\n geometry.offsets.push( { start: 0, count: indices.length, index: 0 } );\n\n\tgeometry.computeBoundingSphere();\n\n\treturn geometry;\n\n};\n\n\n// UTF-8 decoder from webgl-loader (r100)\n// http://code.google.com/p/webgl-loader/\n\n// Model manifest description. Contains objects like:\n// name: {\n// materials: { 'material_name': { ... } ... },\n// decodeParams: {\n// decodeOffsets: [ ... ],\n// decodeScales: [ ... ],\n// },\n// urls: {\n// 'url': [\n// { material: 'material_name',\n// attribRange: [#, #],\n// indexRange: [#, #],\n// names: [ 'object names' ... ],\n// lengths: [#, #, # ... ]\n// }\n// ],\n// ...\n// }\n// }\n\nvar DEFAULT_DECODE_PARAMS = {\n\n decodeOffsets: [-4095, -4095, -4095, 0, 0, -511, -511, -511],\n decodeScales: [1/8191, 1/8191, 1/8191, 1/1023, 1/1023, 1/1023, 1/1023, 1/1023]\n\n // TODO: normal decoding? (see walt.js)\n // needs to know: input, output (from vertex format!)\n //\n // Should split attrib/index.\n // 1) Decode position and non-normal attributes.\n // 2) Decode indices, computing normals\n // 3) Maybe normalize normals? Only necessary for refinement, or fixed?\n // 4) Maybe refine normals? Should this be part of regular refinement?\n // 5) Morphing\n\n};\n\n// Triangle strips!\n\n// TODO: will it be an optimization to specialize this method at\n// runtime for different combinations of stride, decodeOffset and\n// decodeScale?\n\nTHREE.UTF8Loader.prototype.decompressAttribsInner_ = function ( str, inputStart, inputEnd,\n output, outputStart, stride,\n decodeOffset, decodeScale ) {\n\n var prev = 0;\n\n for ( var j = inputStart; j < inputEnd; j ++ ) {\n\n var code = str.charCodeAt( j );\n prev += ( code >> 1 ) ^ ( -( code & 1 ) );\n\n output[ outputStart ] = decodeScale * ( prev + decodeOffset );\n outputStart += stride;\n\n }\n\n};\n\nTHREE.UTF8Loader.prototype.decompressIndices_ = function( str, inputStart, numIndices,\n output, outputStart ) {\n\n\tvar highest = 0;\n\n for ( var i = 0; i < numIndices; i ++ ) {\n\n var code = str.charCodeAt( inputStart ++ );\n\n output[ outputStart ++ ] = highest - code;\n\n if ( code === 0 ) {\n\n highest ++;\n\n }\n\n }\n\n};\n\nTHREE.UTF8Loader.prototype.decompressAABBs_ = function ( str, inputStart, numBBoxen,\n decodeOffsets, decodeScales ) {\n var numFloats = 6 * numBBoxen;\n\n var inputEnd = inputStart + numFloats;\n var outputStart = 0;\n\n var bboxen = new Float32Array( numFloats );\n\n for ( var i = inputStart; i < inputEnd; i += 6 ) {\n\n var minX = str.charCodeAt(i + 0) + decodeOffsets[0];\n var minY = str.charCodeAt(i + 1) + decodeOffsets[1];\n var minZ = str.charCodeAt(i + 2) + decodeOffsets[2];\n\n var radiusX = (str.charCodeAt(i + 3) + 1) >> 1;\n var radiusY = (str.charCodeAt(i + 4) + 1) >> 1;\n var radiusZ = (str.charCodeAt(i + 5) + 1) >> 1;\n\n bboxen[ outputStart++ ] = decodeScales[0] * (minX + radiusX);\n bboxen[ outputStart++ ] = decodeScales[1] * (minY + radiusY);\n bboxen[ outputStart++ ] = decodeScales[2] * (minZ + radiusZ);\n\n bboxen[ outputStart++ ] = decodeScales[0] * radiusX;\n bboxen[ outputStart++ ] = decodeScales[1] * radiusY;\n bboxen[ outputStart++ ] = decodeScales[2] * radiusZ;\n\n }\n\n return bboxen;\n\n};\n\nTHREE.UTF8Loader.prototype.decompressMesh = function ( str, meshParams, decodeParams, name, idx, callback ) {\n\n // Extract conversion parameters from attribArrays.\n\n var stride = decodeParams.decodeScales.length;\n\n var decodeOffsets = decodeParams.decodeOffsets;\n var decodeScales = decodeParams.decodeScales;\n\n var attribStart = meshParams.attribRange[0];\n var numVerts = meshParams.attribRange[1];\n\n // Decode attributes.\n\n var inputOffset = attribStart;\n var attribsOut = new Float32Array( stride * numVerts );\n\n for (var j = 0; j < stride; j ++ ) {\n\n var end = inputOffset + numVerts;\n\n\t\tvar decodeScale = decodeScales[j];\n\n if ( decodeScale ) {\n\n // Assume if decodeScale is never set, simply ignore the\n // attribute.\n\n this.decompressAttribsInner_( str, inputOffset, end,\n attribsOut, j, stride,\n decodeOffsets[j], decodeScale );\n }\n\n inputOffset = end;\n\n }\n\n var indexStart = meshParams.indexRange[ 0 ];\n var numIndices = 3 * meshParams.indexRange[ 1 ];\n\n var indicesOut = new Uint16Array( numIndices );\n\n this.decompressIndices_( str, inputOffset, numIndices, indicesOut, 0 );\n\n // Decode bboxen.\n\n var bboxen = undefined;\n var bboxOffset = meshParams.bboxes;\n\n if ( bboxOffset ) {\n\n bboxen = this.decompressAABBs_( str, bboxOffset, meshParams.names.length, decodeOffsets, decodeScales );\n }\n\n callback( name, idx, attribsOut, indicesOut, bboxen, meshParams );\n\n};\n\nTHREE.UTF8Loader.prototype.copyAttrib = function ( stride, attribsOutFixed, lastAttrib, index ) {\n\n for ( var j = 0; j < stride; j ++ ) {\n\n lastAttrib[ j ] = attribsOutFixed[ stride * index + j ];\n\n }\n\n};\n\nTHREE.UTF8Loader.prototype.decodeAttrib2 = function ( str, stride, decodeOffsets, decodeScales, deltaStart,\n numVerts, attribsOut, attribsOutFixed, lastAttrib,\n index ) {\n\n for ( var j = 0; j < 5; j ++ ) {\n\n var code = str.charCodeAt( deltaStart + numVerts*j + index );\n var delta = ( code >> 1) ^ (-(code & 1));\n\n lastAttrib[ j ] += delta;\n attribsOutFixed[ stride * index + j ] = lastAttrib[ j ];\n attribsOut[ stride * index + j ] = decodeScales[ j ] * ( lastAttrib[ j ] + decodeOffsets[ j ] );\n }\n\n};\n\nTHREE.UTF8Loader.prototype.accumulateNormal = function ( i0, i1, i2, attribsOutFixed, crosses ) {\n\n var p0x = attribsOutFixed[ 8*i0 ];\n var p0y = attribsOutFixed[ 8*i0 + 1 ];\n var p0z = attribsOutFixed[ 8*i0 + 2 ];\n\n var p1x = attribsOutFixed[ 8*i1 ];\n var p1y = attribsOutFixed[ 8*i1 + 1 ];\n var p1z = attribsOutFixed[ 8*i1 + 2 ];\n\n var p2x = attribsOutFixed[ 8*i2 ];\n var p2y = attribsOutFixed[ 8*i2 + 1 ];\n var p2z = attribsOutFixed[ 8*i2 + 2 ];\n\n p1x -= p0x;\n p1y -= p0y;\n p1z -= p0z;\n\n p2x -= p0x;\n p2y -= p0y;\n p2z -= p0z;\n\n p0x = p1y*p2z - p1z*p2y;\n p0y = p1z*p2x - p1x*p2z;\n p0z = p1x*p2y - p1y*p2x;\n\n crosses[ 3*i0 ] += p0x;\n crosses[ 3*i0 + 1 ] += p0y;\n crosses[ 3*i0 + 2 ] += p0z;\n\n crosses[ 3*i1 ] += p0x;\n crosses[ 3*i1 + 1 ] += p0y;\n crosses[ 3*i1 + 2 ] += p0z;\n\n crosses[ 3*i2 ] += p0x;\n crosses[ 3*i2 + 1 ] += p0y;\n crosses[ 3*i2 + 2 ] += p0z;\n\n};\n\nTHREE.UTF8Loader.prototype.decompressMesh2 = function( str, meshParams, decodeParams, name, idx, callback ) {\n\n var MAX_BACKREF = 96;\n\n // Extract conversion parameters from attribArrays.\n\n var stride = decodeParams.decodeScales.length;\n\n\tvar decodeOffsets = decodeParams.decodeOffsets;\n var decodeScales = decodeParams.decodeScales;\n\n var deltaStart = meshParams.attribRange[ 0 ];\n var numVerts = meshParams.attribRange[ 1 ];\n\n var codeStart = meshParams.codeRange[ 0 ];\n var codeLength = meshParams.codeRange[ 1 ];\n\n var numIndices = 3 * meshParams.codeRange[ 2 ];\n\n var indicesOut = new Uint16Array( numIndices );\n\n var crosses = new Int32Array( 3 * numVerts );\n\n var lastAttrib = new Uint16Array( stride );\n\n var attribsOutFixed = new Uint16Array( stride * numVerts );\n var attribsOut = new Float32Array( stride * numVerts );\n\n var highest = 0;\n var outputStart = 0;\n\n for ( var i = 0; i < numIndices; i += 3 ) {\n\n var code = str.charCodeAt( codeStart ++ );\n\n var max_backref = Math.min( i, MAX_BACKREF );\n\n if ( code < max_backref ) {\n\n // Parallelogram\n\n var winding = code % 3;\n var backref = i - ( code - winding );\n var i0, i1, i2;\n\n switch ( winding ) {\n\n case 0:\n\n i0 = indicesOut[ backref + 2 ];\n i1 = indicesOut[ backref + 1 ];\n i2 = indicesOut[ backref + 0 ];\n break;\n\n case 1:\n\n i0 = indicesOut[ backref + 0 ];\n i1 = indicesOut[ backref + 2 ];\n i2 = indicesOut[ backref + 1 ];\n break;\n\n case 2:\n\n i0 = indicesOut[ backref + 1 ];\n i1 = indicesOut[ backref + 0 ];\n i2 = indicesOut[ backref + 2 ];\n break;\n\n }\n\n indicesOut[ outputStart ++ ] = i0;\n indicesOut[ outputStart ++ ] = i1;\n\n code = str.charCodeAt( codeStart ++ );\n\n var index = highest - code;\n indicesOut[ outputStart ++ ] = index;\n\n if ( code === 0 ) {\n\n for (var j = 0; j < 5; j ++ ) {\n\n var deltaCode = str.charCodeAt( deltaStart + numVerts * j + highest );\n\n var prediction = ((deltaCode >> 1) ^ (-(deltaCode & 1))) +\n attribsOutFixed[stride*i0 + j] +\n attribsOutFixed[stride*i1 + j] -\n attribsOutFixed[stride*i2 + j];\n\n lastAttrib[j] = prediction;\n\n attribsOutFixed[ stride * highest + j ] = prediction;\n attribsOut[ stride * highest + j ] = decodeScales[ j ] * ( prediction + decodeOffsets[ j ] );\n\n }\n\n highest ++;\n\n } else {\n\n this.copyAttrib( stride, attribsOutFixed, lastAttrib, index );\n\n }\n\n this.accumulateNormal( i0, i1, index, attribsOutFixed, crosses );\n\n } else {\n\n // Simple\n\n var index0 = highest - ( code - max_backref );\n\n indicesOut[ outputStart ++ ] = index0;\n\n if ( code === max_backref ) {\n\n this.decodeAttrib2( str, stride, decodeOffsets, decodeScales, deltaStart,\n numVerts, attribsOut, attribsOutFixed, lastAttrib,\n highest ++ );\n\n } else {\n\n this.copyAttrib(stride, attribsOutFixed, lastAttrib, index0);\n\n }\n\n code = str.charCodeAt( codeStart ++ );\n\n var index1 = highest - code;\n indicesOut[ outputStart ++ ] = index1;\n\n if ( code === 0 ) {\n\n this.decodeAttrib2( str, stride, decodeOffsets, decodeScales, deltaStart,\n numVerts, attribsOut, attribsOutFixed, lastAttrib,\n highest ++ );\n\n } else {\n\n this.copyAttrib( stride, attribsOutFixed, lastAttrib, index1 );\n\n }\n\n code = str.charCodeAt( codeStart ++ );\n\n var index2 = highest - code;\n indicesOut[ outputStart ++ ] = index2;\n\n if ( code === 0 ) {\n\n for ( var j = 0; j < 5; j ++ ) {\n\n lastAttrib[ j ] = ( attribsOutFixed[ stride * index0 + j ] + attribsOutFixed[ stride * index1 + j ] ) / 2;\n\n }\n\n this.decodeAttrib2( str, stride, decodeOffsets, decodeScales, deltaStart,\n numVerts, attribsOut, attribsOutFixed, lastAttrib,\n highest ++ );\n\n } else {\n\n this.copyAttrib( stride, attribsOutFixed, lastAttrib, index2 );\n\n }\n\n this.accumulateNormal( index0, index1, index2, attribsOutFixed, crosses );\n\n }\n\n }\n\n for ( var i = 0; i < numVerts; i ++ ) {\n\n var nx = crosses[ 3*i ];\n var ny = crosses[ 3*i + 1 ];\n var nz = crosses[ 3*i + 2 ];\n\n var norm = 511.0 / Math.sqrt( nx*nx + ny*ny + nz*nz );\n\n var cx = str.charCodeAt( deltaStart + 5*numVerts + i );\n var cy = str.charCodeAt( deltaStart + 6*numVerts + i );\n var cz = str.charCodeAt( deltaStart + 7*numVerts + i );\n\n attribsOut[ stride*i + 5 ] = norm*nx + ((cx >> 1) ^ (-(cx & 1)));\n attribsOut[ stride*i + 6 ] = norm*ny + ((cy >> 1) ^ (-(cy & 1)));\n attribsOut[ stride*i + 7 ] = norm*nz + ((cz >> 1) ^ (-(cz & 1)));\n }\n\n callback( name, idx, attribsOut, indicesOut, undefined, meshParams );\n\n};\n\nTHREE.UTF8Loader.prototype.downloadMesh = function ( path, name, meshEntry, decodeParams, callback ) {\n var func = \"THREE.UTF8Loader.downloadMesh\";\n\n\n var loader = this;\n var idx = 0;\n\n function onprogress( req, e ) {\n\n while ( idx < meshEntry.length ) {\n\n var meshParams = meshEntry[ idx ];\n var indexRange = meshParams.indexRange;\n\n if ( indexRange ) {\n\n var meshEnd = indexRange[ 0 ] + 3 * indexRange[ 1 ];\n\n if ( req.responseText.length < meshEnd ) break;\n\n loader.decompressMesh( req.responseText, meshParams, decodeParams, name, idx, callback );\n\n } else {\n\n var codeRange = meshParams.codeRange;\n var meshEnd = codeRange[ 0 ] + codeRange[ 1 ];\n\n if ( req.responseText.length < meshEnd ) break;\n\n loader.decompressMesh2( req.responseText, meshParams, decodeParams, name, idx, callback );\n }\n\n ++idx;\n\n }\n\n };\n\n THREE.UTF8Loader.getHttpRequest( path, function( req, e ) {\n\n if ( req.status === 200 || req.status === 0 ) {\n\n onprogress( req, e );\n\n }\n\n // TODO: handle errors.\n\n }, onprogress );\n};\n\nTHREE.UTF8Loader.prototype.downloadMeshes = function ( path, meshUrlMap, decodeParams, callback ) {\n\n for ( var url in meshUrlMap ) {\n\n var meshEntry = meshUrlMap[url];\n this.downloadMesh( path + url, url, meshEntry, decodeParams, callback );\n\n }\n\n};\n\nTHREE.UTF8Loader.prototype.createMeshCallback = function( materialBaseUrl, loadModelInfo, allDoneCallback ) {\n\n\tvar nCompletedUrls = 0;\n var nExpectedUrls = 0;\n\n var expectedMeshesPerUrl = {};\n var decodedMeshesPerUrl = {};\n\n\tvar modelParts = {};\n\n\tvar meshUrlMap = loadModelInfo.urls;\n\n for ( var url in meshUrlMap ) {\n\n expectedMeshesPerUrl[ url ] = meshUrlMap[ url ].length;\n decodedMeshesPerUrl[ url ] = 0;\n\n\t\tnExpectedUrls ++;\n\n modelParts[ url ] = new THREE.Object3D();\n\n }\n\n var model = new THREE.Object3D();\n\n // Prepare materials first...\n\n var materialCreator = new THREE.MTLLoader.MaterialCreator( materialBaseUrl, loadModelInfo.options );\n materialCreator.setMaterials( loadModelInfo.materials );\n\n materialCreator.preload();\n\n\t// Create callback for creating mesh parts\n\n\tvar bufferGeometryCreator = new THREE.UTF8Loader.BufferGeometryCreator();\n\n\tvar meshCallback = function( name, idx, attribArray, indexArray, bboxen, meshParams ) {\n\n // Got ourselves a new mesh\n\n // name identifies this part of the model (url)\n // idx is the mesh index of this mesh of the part\n // attribArray defines the vertices\n // indexArray defines the faces\n // bboxen defines the bounding box\n // meshParams contains the material info\n\n\t\tvar geometry = bufferGeometryCreator.create( attribArray, indexArray );\n var material = materialCreator.create( meshParams.material );\n\n\t\tvar mesh = new THREE.Mesh( geometry, material );\n modelParts[ name ].add( mesh );\n\n //model.add(new THREE.Mesh(geometry, material));\n\n decodedMeshesPerUrl[ name ] ++;\n\n if ( decodedMeshesPerUrl[ name ] === expectedMeshesPerUrl[ name ] ) {\n\n nCompletedUrls ++;\n\n model.add( modelParts[ name ] );\n\n if ( nCompletedUrls === nExpectedUrls ) {\n\n // ALL DONE!!!\n\n allDoneCallback( model );\n\n }\n\n }\n\n };\n\n\treturn meshCallback;\n\n};\n\nTHREE.UTF8Loader.prototype.downloadModel = function ( geometryBase, materialBase, model, callback ) {\n\n var meshCallback = this.createMeshCallback( materialBase, model, callback );\n this.downloadMeshes( geometryBase, model.urls, model.decodeParams, meshCallback );\n\n};\n\nTHREE.UTF8Loader.prototype.downloadModelJson = function ( jsonUrl, options, callback ) {\n\n THREE.UTF8Loader.getJsonRequest( jsonUrl, function( loaded ) {\n\n if ( ! loaded.decodeParams ) {\n\n if ( options && options.decodeParams ) {\n\n loaded.decodeParams = options.decodeParams;\n\n } else {\n\n loaded.decodeParams = DEFAULT_DECODE_PARAMS;\n\n }\n\n }\n\n loaded.options = options;\n\n var geometryBase = jsonUrl.substr( 0, jsonUrl.lastIndexOf( \"/\" ) + 1 );\n var materialBase = geometryBase;\n\n if ( options && options.geometryBase ) {\n\n geometryBase = options.geometryBase;\n\n if ( geometryBase.charAt( geometryBase.length - 1 ) !== \"/\" ) {\n\n geometryBase = geometryBase + \"/\";\n\n }\n\n }\n\n if ( options && options.materialBase ) {\n\n materialBase = options.materialBase;\n\n if ( materialBase.charAt( materialBase.length - 1 ) !== \"/\" ) {\n\n materialBase = materialBase + \"/\";\n\n }\n\n }\n\n this.downloadModel( geometryBase, materialBase, loaded, callback );\n\n }.bind( this ) );\n\n};\n\n// XMLHttpRequest stuff\n\nTHREE.UTF8Loader.getHttpRequest = function( url, onload, opt_onprogress ) {\n var func = \"THREE.UTF8Loader.getHttpRequest\";\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\n var req = {responseText: res};\n onload(req);\n\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n var LISTENERS = {\n\n load: function( e ) { onload( req, e ); },\n progress: function( e ) { opt_onprogress( req, e ); }\n\n };\n\n var req = new XMLHttpRequest();\n THREE.UTF8Loader.addListeners( req, LISTENERS );\n\n req.open( 'GET', url, true );\n req.send( null );\n}\n\nTHREE.UTF8Loader.getJsonRequest = function( url, onjson ) {\n\n THREE.UTF8Loader.getHttpRequest( url,\n function( e ) { onjson( JSON.parse( e.responseText ) ); },\n function() {} );\n\n}\n\nTHREE.UTF8Loader.addListeners = function( dom, listeners ) {\n\n // TODO: handle event capture, object binding.\n\n for ( var key in listeners ) {\n\n dom.addEventListener( key, listeners[ key ] );\n\n }\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/VRMLLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/VRMLLoader.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.VRMLLoader = function () {};\n\nTHREE.VRMLLoader.prototype = {\n\n\tconstructor: THREE.VRMLLoader,\n\n\t// for IndexedFaceSet support\n\tisRecordingPoints: false,\n\tisRecordingFaces: false,\n\tpoints: [],\n\tindexes : [],\n\n\t// for Background support\n\tisRecordingAngles: false,\n\tisRecordingColors: false,\n\tangles: [],\n\tcolors: [],\n\n\trecordingFieldname: null,\n\n\tload: function ( url, callback ) {\n var func = \"THREE.VRMLLoader.load\";\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n \n\t var object = this.parse(res);\n\t this.dispatchEvent({type: 'load', content: object});\n\t if (callback) callback(object);\n \n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\t\tvar scope = this;\n\t\tvar request = new XMLHttpRequest();\n\n\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\tvar object = scope.parse( event.target.responseText );\n\n\t\t\tscope.dispatchEvent( { type: 'load', content: object } );\n\n\t\t\tif ( callback ) callback( object );\n\n\t\t}, false );\n\n\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\tscope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );\n\n\t\t}, false );\n\n\t\trequest.addEventListener( 'error', function () {\n\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\n\n\t\t}, false );\n\n\t\trequest.open( 'GET', url, true );\n\t\trequest.send( null );\n\n\t},\n\n\tparse: function ( data ) {\n\n\t\tvar parseV1 = function ( lines, scene ) {\n\n\t\t\tconsole.warn( 'VRML V1.0 not supported yet' );\n\n\t\t};\n\n\t\tvar parseV2 = function ( lines, scene ) {\n\t\t\tvar defines = {};\n\t\t\tvar float_pattern = /(\\b|\\-|\\+)([\\d\\.e]+)/;\n\t\t\tvar float3_pattern = /([\\d\\.\\+\\-e]+),?\\s+([\\d\\.\\+\\-e]+),?\\s+([\\d\\.\\+\\-e]+)/;\n\n\t\t\t/**\n\t\t\t* Interpolates colors a and b following their relative distance\n\t\t\t* expressed by t.\n\t\t\t*\n\t\t\t* @param float a\n\t\t\t* @param float b\n\t\t\t* @param float t\n\t\t\t* @returns {Color}\n\t\t\t*/\n\t\t\tvar interpolateColors = function(a, b, t) {\n\t\t\t var deltaR = a.r - b.r;\n\t\t\t var deltaG = a.g - b.g;\n\t\t\t var deltaB = a.b - b.b;\n\n\t\t\t var c = new THREE.Color();\n\n\t\t\t c.r = a.r - t * deltaR;\n\t\t\t c.g = a.g - t * deltaG;\n\t\t\t c.b = a.b - t * deltaB;\n\n\t\t\t return c;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Vertically paints the faces interpolating between the\n\t\t\t * specified colors at the specified angels. This is used for the Background\n\t\t\t * node, but could be applied to other nodes with multiple faces as well.\n\t\t\t *\n\t\t\t * When used with the Background node, default is directionIsDown is true if\n\t\t\t * interpolating the skyColor down from the Zenith. When interpolationg up from\n\t\t\t * the Nadir i.e. interpolating the groundColor, the directionIsDown is false.\n\t\t\t *\n\t\t\t * The first angle is never specified, it is the Zenith (0 rad). Angles are specified\n\t\t\t * in radians. The geometry is thought a sphere, but could be anything. The color interpolation\n\t\t\t * is linear along the Y axis in any case.\n\t\t\t *\n\t\t\t * You must specify one more color than you have angles at the beginning of the colors array.\n\t\t\t * This is the color of the Zenith (the top of the shape).\n\t\t\t *\n\t\t\t * @param geometry\n\t\t\t * @param radius\n\t\t\t * @param angles\n\t\t\t * @param colors\n\t\t\t * @param boolean directionIsDown Whether to work bottom up or top down.\n\t\t\t */\n\t\t\tvar paintFaces = function (geometry, radius, angles, colors, directionIsDown) {\n\n\t\t\t\tvar f, n, p, vertexIndex, color;\n\n\t\t\t\tvar direction = directionIsDown ? 1 : -1;\n\n\t\t\t\tvar faceIndices = [ 'a', 'b', 'c', 'd' ];\n\n\t\t\t\tvar coord = [ ], aColor, bColor, t = 1, A = {}, B = {}, applyColor = false, colorIndex;\n\n\t\t\t\tfor ( var k = 0; k < angles.length; k++ ) {\n\n\t\t\t\t\tvar vec = { };\n\n\t\t\t\t\t// push the vector at which the color changes\n\t\t\t\t\tvec.y = direction * ( Math.cos( angles[k] ) * radius);\n\n\t\t\t\t\tvec.x = direction * ( Math.sin( angles[k] ) * radius);\n\n\t\t\t\t\tcoord.push( vec );\n\n\t\t\t\t}\n\n\t\t\t\t// painting the colors on the faces\n\t\t\t\tfor ( var i = 0; i < geometry.faces.length ; i++ ) {\n\n\t\t\t\t\tf = geometry.faces[ i ];\n\n\t\t\t\t\tn = ( f instanceof THREE.Face3 ) ? 3 : 4;\n\n\t\t\t\t\tfor ( var j = 0; j < n; j++ ) {\n\n\t\t\t\t\t\tvertexIndex = f[ faceIndices[ j ] ];\n\n\t\t\t\t\t\tp = geometry.vertices[ vertexIndex ];\n\n\t\t\t\t\t\tfor ( var index = 0; index < colors.length; index++ ) {\n\n\t\t\t\t\t\t\t// linear interpolation between aColor and bColor, calculate proportion\n\t\t\t\t\t\t\t// A is previous point (angle)\n\t\t\t\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\t\t\t\tA.x = 0;\n\t\t\t\t\t\t\t\tA.y = directionIsDown ? radius : -1 * radius;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tA.x = coord[ index-1 ].x;\n\t\t\t\t\t\t\t\tA.y = coord[ index-1 ].y;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// B is current point (angle)\n\t\t\t\t\t\t\tB = coord[index];\n\n\t\t\t\t\t\t\tif ( undefined !== B ) {\n\t\t\t\t\t\t\t\t// p has to be between the points A and B which we interpolate\n\t\t\t\t\t\t\t\tapplyColor = directionIsDown ? p.y <= A.y && p.y > B.y : p.y >= A.y && p.y < B.y;\n\n\t\t\t\t\t\t\t\tif (applyColor) {\n\n\t\t\t\t\t\t\t\t\tbColor = colors[ index + 1 ];\n\n\t\t\t\t\t\t\t\t\taColor = colors[ index ];\n\n\t\t\t\t\t\t\t\t\t// below is simple linear interpolation\n\t\t\t\t\t\t\t\t\tt = Math.abs( p.y - A.y ) / ( A.y - B.y );\n\n\t\t\t\t\t\t\t\t\t// to make it faster, you can only calculate this if the y coord changes, the color is the same for points with the same y\n\t\t\t\t\t\t\t\t\tcolor = interpolateColors( aColor, bColor, t );\n\n\t\t\t\t\t\t\t\t\tf.vertexColors[ j ] = color;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if ( undefined === f.vertexColors[ j ] ) {\n\t\t\t\t\t\t\t\tcolorIndex = directionIsDown ? colors.length -1 : 0;\n\t\t\t\t\t\t\t\tf.vertexColors[ j ] = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar parseProperty = function (node, line) {\n\n\t\t\t\tvar parts = [], part, property = {}, fieldName;\n\n\t\t\t\t/**\n\t\t\t\t * Expression for matching relevant information, such as a name or value, but not the separators\n\t\t\t\t * @type {RegExp}\n\t\t\t\t */\n\t\t\t\tvar regex = /[^\\s,\\[\\]]+/g;\n\n\t\t\t\tvar point, index, angles, colors;\n\n\t\t\t\twhile (null != ( part = regex.exec(line) ) ) {\n\t\t\t\t\tparts.push(part[0]);\n\t\t\t\t}\n\n\t\t\t\tfieldName = parts[0];\n\n\n\t\t\t\t// trigger several recorders\n\t\t\t\tswitch (fieldName) {\n\t\t\t\t\tcase 'skyAngle':\n\t\t\t\t\tcase 'groundAngle':\n\t\t\t\t\t\tthis.recordingFieldname = fieldName;\n\t\t\t\t\t\tthis.isRecordingAngles = true;\n\t\t\t\t\t\tthis.angles = [];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'skyColor':\n\t\t\t\t\tcase 'groundColor':\n\t\t\t\t\t\tthis.recordingFieldname = fieldName;\n\t\t\t\t\t\tthis.isRecordingColors = true;\n\t\t\t\t\t\tthis.colors = [];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'point':\n\t\t\t\t\t\tthis.recordingFieldname = fieldName;\n\t\t\t\t\t\tthis.isRecordingPoints = true;\n\t\t\t\t\t\tthis.points = [];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'coordIndex':\n\t\t\t\t\t\tthis.recordingFieldname = fieldName;\n\t\t\t\t\t\tthis.isRecordingFaces = true;\n\t\t\t\t\t\tthis.indexes = [];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (this.isRecordingFaces) {\n\n\t\t\t\t\t// the parts hold the indexes as strings\n\t\t\t\t\tif (parts.length > 0) {\n\t\t\t\t\t\tindex = [];\n\n\t\t\t\t\t\tfor (var ind = 0;ind < parts.length; ind++) {\n\n\t\t\t\t\t\t\t// the part should either be positive integer or -1\n\t\t\t\t\t\t\tif (!/(-?\\d+)/.test( parts[ind]) ) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// end of current face\n\t\t\t\t\t\t\tif (parts[ind] === \"-1\") {\n\t\t\t\t\t\t\t\tif (index.length > 0) {\n\t\t\t\t\t\t\t\t this.indexes.push(index);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// start new one\n\t\t\t\t\t\t\t\tindex = [];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tindex.push(parseInt( parts[ind]) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// end\n\t\t\t\t\tif (/]/.exec(line)) {\n\t\t\t\t\t\tthis.isRecordingFaces = false;\n\t\t\t\t\t\tnode.coordIndex = this.indexes;\n\t\t\t\t\t}\n\n\t\t\t\t} else if (this.isRecordingPoints) {\n\n\t\t\t\t\tparts = float3_pattern.exec(line);\n\n\t\t\t\t\t// parts may be empty on first and last line\n\t\t\t\t\tif (null != parts) {\n\t\t\t\t\t\tpoint = {\n\t\t\t\t\t\t\tx: parseFloat(parts[1]),\n\t\t\t\t\t\t\ty: parseFloat(parts[2]),\n\t\t\t\t\t\t\tz: parseFloat(parts[3])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.points.push(point);\n\t\t\t\t\t}\n\n\t\t\t\t\t// end\n\t\t\t\t\tif ( /]/.exec(line) ) {\n\t\t\t\t\t\tthis.isRecordingPoints = false;\n\t\t\t\t\t\tnode.points = this.points;\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( this.isRecordingAngles ) {\n\n\t\t\t\t\t// the parts hold the angles as strings\n\t\t\t\t\tif ( parts.length > 0 ) {\n\n\t\t\t\t\t\tfor ( var ind = 0;ind < parts.length; ind++ ) {\n\n\t\t\t\t\t\t\t// the part should be a float\n\t\t\t\t\t\t\tif ( ! float_pattern.test( parts[ind] ) ) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.angles.push( parseFloat( parts[ind] ) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// end\n\t\t\t\t\tif ( /]/.exec(line) ) {\n\t\t\t\t\t\tthis.isRecordingAngles = false;\n\t\t\t\t\t\tnode[this.recordingFieldname] = this.angles;\n\t\t\t\t\t}\n\n\t\t\t\t} else if (this.isRecordingColors) {\n\t\t\t\t\t// this is the float3 regex with the g modifier added, you could also explode the line by comma first (faster probably)\n\t\t\t\t\tvar float3_repeatable = /([\\d\\.\\+\\-e]+),?\\s+([\\d\\.\\+\\-e]+),?\\s+([\\d\\.\\+\\-e]+)/g;\n\n\t\t\t\t\twhile( null !== (parts = float3_repeatable.exec(line) ) ) {\n\n\t\t\t\t\t\tcolor = {\n\t\t\t\t\t\t\tr: parseFloat(parts[1]),\n\t\t\t\t\t\t\tg: parseFloat(parts[2]),\n\t\t\t\t\t\t\tb: parseFloat(parts[3])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.colors.push(color);\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// end\n\t\t\t\t\tif (/]/.exec(line)) {\n\t\t\t\t\t\tthis.isRecordingColors = false;\n\t\t\t\t\t\tnode[this.recordingFieldname] = this.colors;\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( parts[parts.length -1] !== 'NULL' && fieldName !== 'children') {\n\n\t\t\t\t\tswitch (fieldName) {\n\n\t\t\t\t\t\tcase 'diffuseColor':\n\t\t\t\t\t\tcase 'emissiveColor':\n\t\t\t\t\t\tcase 'specularColor':\n\t\t\t\t\t\tcase 'color':\n\n\t\t\t\t\t\t\tif (parts.length != 4) {\n\t\t\t\t\t\t\t\tconsole.warn('Invalid color format detected for ' + fieldName );\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tproperty = {\n\t\t\t\t\t\t\t\t'r' : parseFloat(parts[1]),\n\t\t\t\t\t\t\t\t'g' : parseFloat(parts[2]),\n\t\t\t\t\t\t\t\t'b' : parseFloat(parts[3])\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'translation':\n\t\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tcase 'size':\n\t\t\t\t\t\t\tif (parts.length != 4) {\n\t\t\t\t\t\t\t\tconsole.warn('Invalid vector format detected for ' + fieldName);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tproperty = {\n\t\t\t\t\t\t\t\t'x' : parseFloat(parts[1]),\n\t\t\t\t\t\t\t\t'y' : parseFloat(parts[2]),\n\t\t\t\t\t\t\t\t'z' : parseFloat(parts[3])\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'radius':\n\t\t\t\t\t\tcase 'topRadius':\n\t\t\t\t\t\tcase 'bottomRadius':\n\t\t\t\t\t\tcase 'height':\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tcase 'shininess':\n\t\t\t\t\t\tcase 'ambientIntensity':\n\t\t\t\t\t\t\tif (parts.length != 2) {\n\t\t\t\t\t\t\t\tconsole.warn('Invalid single float value specification detected for ' + fieldName);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tproperty = parseFloat(parts[1]);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'rotation':\n\t\t\t\t\t\t\tif (parts.length != 5) {\n\t\t\t\t\t\t\t\tconsole.warn('Invalid quaternion format detected for ' + fieldName);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tproperty = {\n\t\t\t\t\t\t\t\t'x' : parseFloat(parts[1]),\n\t\t\t\t\t\t\t\t'y' : parseFloat(parts[2]),\n\t\t\t\t\t\t\t\t'z' : parseFloat(parts[3]),\n\t\t\t\t\t\t\t\t'w' : parseFloat(parts[4])\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ccw':\n\t\t\t\t\t\tcase 'solid':\n\t\t\t\t\t\tcase 'colorPerVertex':\n\t\t\t\t\t\tcase 'convex':\n\t\t\t\t\t\t\tif (parts.length != 2) {\n\t\t\t\t\t\t\t\tconsole.warn('Invalid format detected for ' + fieldName);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tproperty = parts[1] === 'TRUE' ? true : false;\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tnode[fieldName] = property;\n\t\t\t\t}\n\n\t\t\t\treturn property;\n\t\t\t};\n\n\t\t\tvar getTree = function ( lines ) {\n\n\t\t\t\tvar tree = { 'string': 'Scene', children: [] };\n\t\t\t\tvar current = tree;\n\t\t\t\tvar matches;\n\t\t\t\tvar specification;\n\n\t\t\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\t\tvar comment = '';\n\n\t\t\t\t\tvar line = lines[ i ];\n\n\t\t\t\t\t// omit whitespace only lines\n\t\t\t\t\tif ( null !== ( result = /^\\s+?$/g.exec( line ) ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tline = line.trim();\n\n\t\t\t\t\t// skip empty lines\n\t\t\t\t\tif (line === '') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( /#/.exec( line ) ) {\n\n\t\t\t\t\t\tvar parts = line.split('#');\n\n\t\t\t\t\t\t// discard everything after the #, it is a comment\n\t\t\t\t\t\tline = parts[0];\n\n\t\t\t\t\t\t// well, let's also keep the comment\n\t\t\t\t\t\tcomment = parts[1];\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( matches = /([^\\s]*){1}\\s?{/.exec( line ) ) { // first subpattern should match the Node name\n\n\t\t\t\t\t\tvar block = { 'nodeType' : matches[1], 'string': line, 'parent': current, 'children': [],'comment' : comment};\n\t\t\t\t\t\tcurrent.children.push( block );\n\t\t\t\t\t\tcurrent = block;\n\n\t\t\t\t\t\tif ( /}/.exec( line ) ) {\n\t\t\t\t\t\t\t// example: geometry Box { size 1 1 1 } # all on the same line\n\t\t\t\t\t\t\tspecification = /{(.*)}/.exec( line )[ 1 ];\n\n\t\t\t\t\t\t\t// todo: remove once new parsing is complete?\n\t\t\t\t\t\t\tblock.children.push( specification );\n\n\t\t\t\t\t\t\tparseProperty(current, specification);\n\n\t\t\t\t\t\t\tcurrent = current.parent;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( /}/.exec( line ) ) {\n\n\t\t\t\t\t\tcurrent = current.parent;\n\n\t\t\t\t\t} else if ( line !== '' ) {\n\n\t\t\t\t\t\tparseProperty(current, line);\n\t\t\t\t\t\t// todo: remove once new parsing is complete? we still do not parse geometry and appearance the new way\n\t\t\t\t\t\tcurrent.children.push( line );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn tree;\n\t\t\t}\n\n\t\t\tvar parseNode = function ( data, parent ) {\n\n\t\t\t\t// console.log( data );\n\n\t\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\t\tif ( /USE/.exec( data ) ) {\n\n\t\t\t\t\t\tvar defineKey = /USE\\s+?(\\w+)/.exec( data )[ 1 ];\n\n\t\t\t\t\t\tif (undefined == defines[defineKey]) {\n\t\t\t\t\t\t\tconsole.warn(defineKey + ' is not defined.');\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( /appearance/.exec( data ) && defineKey ) {\n\n\t\t\t\t\t\t\t\tparent.material = defines[ defineKey ].clone();\n\n\t\t\t\t\t\t\t} else if ( /geometry/.exec( data ) && defineKey ) {\n\n\t\t\t\t\t\t\t\tparent.geometry = defines[ defineKey ].clone();\n\n\t\t\t\t\t\t\t\t// the solid property is not cloned with clone(), is only needed for VRML loading, so we need to transfer it\n\t\t\t\t\t\t\t\tif (undefined !== defines[ defineKey ].solid && defines[ defineKey ].solid === false) {\n\t\t\t\t\t\t\t\t\tparent.geometry.solid = false;\n\t\t\t\t\t\t\t\t\tparent.material.side = THREE.DoubleSide;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if (defineKey){\n\n\t\t\t\t\t\t\t\tvar object = defines[ defineKey ].clone();\n\t\t\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar object = parent;\n\n\t\t\t\tif ( 'Transform' === data.nodeType || 'Group' === data.nodeType ) {\n\n\t\t\t\t\tobject = new THREE.Object3D();\n\n\t\t\t\t\tif ( /DEF/.exec( data.string ) ) {\n\t\t\t\t\t\tobject.name = /DEF\\s+(\\w+)/.exec( data.string )[ 1 ];\n\t\t\t\t\t\tdefines[ object.name ] = object;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( undefined !== data['translation'] ) {\n\n\t\t\t\t\t\tvar t = data.translation;\n\n\t\t\t\t\t\tobject.position.set(t.x, t.y, t.z);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( undefined !== data.rotation ) {\n\n\t\t\t\t\t\tvar r = data.rotation;\n\n\t\t\t\t\t\tobject.quaternion.setFromAxisAngle( new THREE.Vector3( r.x, r.y, r.z ), r.w );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( undefined !== data.scale ) {\n\n\t\t\t\t\t\tvar s = data.scale;\n\n\t\t\t\t\t\tobject.scale.set( s.x, s.y, s.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tparent.add( object );\n\n\t\t\t\t} else if ( 'Shape' === data.nodeType ) {\n\n\t\t\t\t\tobject = new THREE.Mesh();\n\n\t\t\t\t\tif ( /DEF/.exec( data.string ) ) {\n\n\t\t\t\t\t\tobject.name = /DEF (\\w+)/.exec( data.string )[ 1 ];\n\n\t\t\t\t\t\tdefines[ object.name ] = object;\n\t\t\t\t\t}\n\n\t\t\t\t\tparent.add( object );\n\n\t\t\t\t} else if ( 'Background' === data.nodeType ) {\n\n\t\t\t\t\tvar segments = 20;\n\n\t\t\t\t\t// sky (full sphere):\n\t\t\t\t\tvar radius = 2e4;\n\n\t\t\t\t\tvar skyGeometry = new THREE.SphereGeometry( radius, segments, segments );\n\n\t\t\t\t\tvar skyMaterial = new THREE.MeshBasicMaterial( { color: 'white', vertexColors: THREE.VertexColors, shading: THREE.NoShading } );\n\n\t\t\t\t\tskyMaterial.side = THREE.BackSide;\n\n\t\t\t\t\tskyMaterial.fog = false;\n\n\t\t\t\t\tskyMaterial.color = new THREE.Color();\n\n\t\t\t\t\tpaintFaces( skyGeometry, radius, data.skyAngle, data.skyColor, true );\n\n\t\t\t\t\tvar sky = new THREE.Mesh( skyGeometry, skyMaterial );\n\n\t\t\t\t\tscene.add( sky );\n\n\t\t\t\t\t// ground (half sphere):\n\n\t\t\t\t\tradius = 1.2e4;\n\n\t\t\t\t\tvar groundGeometry = new THREE.SphereGeometry( radius, segments, segments, 0, 2 * Math.PI, 0.5 * Math.PI, 1.5 * Math.PI );\n\n\t\t\t\t\tvar groundMaterial = new THREE.MeshBasicMaterial( { color: 'white', vertexColors: THREE.VertexColors, shading: THREE.NoShading } );\n\n\t\t\t\t\tgroundMaterial.side = THREE.BackSide;\n\n\t\t\t\t\tgroundMaterial.fog = false;\n\n\t\t\t\t\tgroundMaterial.color = new THREE.Color();\n\n\t\t\t\t\tpaintFaces( groundGeometry, radius, data.groundAngle, data.groundColor, false );\n\n\t\t\t\t\tvar ground = new THREE.Mesh( groundGeometry, groundMaterial );\n\n\t\t\t\t\tscene.add( ground );\n\n\t\t\t\t} else if ( /geometry/.exec( data.string ) ) {\n\n\t\t\t\t\tif ( 'Box' === data.nodeType ) {\n\n\t\t\t\t\t\tvar s = data.size;\n\n\t\t\t\t\t\tparent.geometry = new THREE.BoxGeometry( s.x, s.y, s.z );\n\n\t\t\t\t\t} else if ( 'Cylinder' === data.nodeType ) {\n\n\t\t\t\t\t\tparent.geometry = new THREE.CylinderGeometry( data.radius, data.radius, data.height );\n\n\t\t\t\t\t} else if ( 'Cone' === data.nodeType ) {\n\n\t\t\t\t\t\tparent.geometry = new THREE.CylinderGeometry( data.topRadius, data.bottomRadius, data.height );\n\n\t\t\t\t\t} else if ( 'Sphere' === data.nodeType ) {\n\n\t\t\t\t\t\tparent.geometry = new THREE.SphereGeometry( data.radius );\n\n\t\t\t\t\t} else if ( 'IndexedFaceSet' === data.nodeType ) {\n\n\t\t\t\t\t\tvar geometry = new THREE.Geometry();\n\n\t\t\t\t\t\tvar indexes;\n\n\t\t\t\t\t\tfor ( var i = 0, j = data.children.length; i < j; i++ ) {\n\n\t\t\t\t\t\t\tvar child = data.children[ i ];\n\n\t\t\t\t\t\t\tvar vec;\n\n\t\t\t\t\t\t\tif ( 'Coordinate' === child.nodeType ) {\n\n\t\t\t\t\t\t\t\tfor ( var k = 0, l = child.points.length; k < l; k++ ) {\n\n\t\t\t\t\t\t\t\t\tvar point = child.points[ k ];\n\n\t\t\t\t\t\t\t\t\tvec = new THREE.Vector3( point.x, point.y, point.z );\n\n\t\t\t\t\t\t\t\t\tgeometry.vertices.push( vec );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar skip = 0;\n\n\t\t\t\t\t\t// read this: http://math.hws.edu/eck/cs424/notes2013/16_Threejs_Advanced.html\n\t\t\t\t\t\tfor ( var i = 0, j = data.coordIndex.length; i < j; i++ ) {\n\n\t\t\t\t\t\t\tindexes = data.coordIndex[i];\n\n\t\t\t\t\t\t\t// vrml support multipoint indexed face sets (more then 3 vertices). You must calculate the composing triangles here\n\t\t\t\t\t\t\tskip = 0;\n\n\t\t\t\t\t\t\t// todo: this is the time to check if the faces are ordered ccw or not (cw)\n\n\t\t\t\t\t\t\t// Face3 only works with triangles, but IndexedFaceSet allows shapes with more then three vertices, build them of triangles\n\t\t\t\t\t\t\twhile ( indexes.length >= 3 && skip < ( indexes.length -2 ) ) {\n\n\t\t\t\t\t\t\t\tvar face = new THREE.Face3(\n\t\t\t\t\t\t\t\t\tindexes[0],\n\t\t\t\t\t\t\t\t\tindexes[skip + 1],\n\t\t\t\t\t\t\t\t\tindexes[skip + 2],\n\t\t\t\t\t\t\t\t\tnull // normal, will be added later\n\t\t\t\t\t\t\t\t\t// todo: pass in the color, if a color index is present\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tskip++;\n\n\t\t\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( false === data.solid ) {\n\t\t\t\t\t\t\tparent.material.side = THREE.DoubleSide;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// we need to store it on the geometry for use with defines\n\t\t\t\t\t\tgeometry.solid = data.solid;\n\n\t\t\t\t\t\tgeometry.computeFaceNormals();\n\t\t\t\t\t\t//geometry.computeVertexNormals(); // does not show\n\t\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\t\t\t// see if it's a define\n\t\t\t\t\t\tif ( /DEF/.exec( data.string ) ) {\n\t\t\t\t\t\t\tgeometry.name = /DEF (\\w+)/.exec( data.string )[ 1 ];\n\t\t\t\t\t\t\tdefines[ geometry.name ] = geometry;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent.geometry = geometry;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\n\t\t\t\t} else if ( /appearance/.exec( data.string ) ) {\n\n\t\t\t\t\tfor ( var i = 0; i < data.children.length; i ++ ) {\n\n\t\t\t\t\t\tvar child = data.children[ i ];\n\n\t\t\t\t\t\tif ( 'Material' === child.nodeType ) {\n\t\t\t\t\t\t\tvar material = new THREE.MeshPhongMaterial();\n\n\t\t\t\t\t\t\tif ( undefined !== child.diffuseColor ) {\n\n\t\t\t\t\t\t\t\tvar d = child.diffuseColor;\n\n\t\t\t\t\t\t\t\tmaterial.color.setRGB( d.r, d.g, d.b );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( undefined !== child.emissiveColor ) {\n\n\t\t\t\t\t\t\t\tvar e = child.emissiveColor;\n\n\t\t\t\t\t\t\t\tmaterial.emissive.setRGB( e.r, e.g, e.b );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( undefined !== child.specularColor ) {\n\n\t\t\t\t\t\t\t\tvar s = child.specularColor;\n\n\t\t\t\t\t\t\t\tmaterial.specular.setRGB( s.r, s.g, s.b );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( undefined !== child.transparency ) {\n\n\t\t\t\t\t\t\t\tvar t = child.transparency;\n\n\t\t\t\t\t\t\t\t// transparency is opposite of opacity\n\t\t\t\t\t\t\t\tmaterial.opacity = Math.abs( 1 - t );\n\n\t\t\t\t\t\t\t\tmaterial.transparent = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( /DEF/.exec( data.string ) ) {\n\n\t\t\t\t\t\t\t\tmaterial.name = /DEF (\\w+)/.exec( data.string )[ 1 ];\n\n\t\t\t\t\t\t\t\tdefines[ material.name ] = material;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tparent.material = material;\n\n\t\t\t\t\t\t\t// material found, stop looping\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, l = data.children.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar child = data.children[ i ];\n\n\t\t\t\t\tparseNode( data.children[ i ], object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparseNode( getTree( lines ), scene );\n\n\t\t};\n\n\t\tvar scene = new THREE.Scene();\n\n\t\tvar lines = data.split( '\\n' );\n\n\t\tvar header = lines.shift();\n\n\t\tif ( /V1.0/.exec( header ) ) {\n\n\t\t\tparseV1( lines, scene );\n\n\t\t} else if ( /V2.0/.exec( header ) ) {\n\n\t\t\tparseV2( lines, scene );\n\n\t\t}\n\n\t\treturn scene;\n\n\t}\n\n};\n\nTHREE.EventDispatcher.prototype.apply( THREE.VRMLLoader.prototype );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/VTKLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/VTKLoader.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.VTKLoader = function () {};\n\nTHREE.VTKLoader.prototype = {\n\n\tconstructor: THREE.VTKLoader,\n\n\tload: function ( url, callback ) {\n var func = \"THREE.VTKLoader.load\";\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n \n var geometry = this.parse(res);\n this.dispatchEvent({type: 'load', content: geometry});\n if (callback) callback(geometry);\n \n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\t\tvar scope = this;\n\t\tvar request = new XMLHttpRequest();\n\n\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\tvar geometry = scope.parse( event.target.responseText );\n\n\t\t\tscope.dispatchEvent( { type: 'load', content: geometry } );\n\n\t\t\tif ( callback ) callback( geometry );\n\n\t\t}, false );\n\n\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\tscope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );\n\n\t\t}, false );\n\n\t\trequest.addEventListener( 'error', function () {\n\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\n\n\t\t}, false );\n\n\t\trequest.open( 'GET', url, true );\n\t\trequest.send( null );\n\n\t},\n\n\tparse: function ( data ) {\n\n\t\tvar geometry = new THREE.Geometry();\n\n\t\tvar vertex = function ( x, y, z ) {\n\n\t\t\tgeometry.vertices.push( new THREE.Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tvar face3 = function ( a, b, c ) {\n\n\t\t\tgeometry.faces.push( new THREE.Face3( a, b, c ) );\n\n\t\t}\n\n\t\tvar pattern, result;\n\n\t\t// float float float\n\n\t\tpattern = /([\\+|\\-]?[\\d]+[\\.]*[\\d|\\-|e]*)[ ]+([\\+|\\-]?[\\d]+[\\.]*[\\d|\\-|e]*)[ ]+([\\+|\\-]?[\\d]+[\\.]*[\\d|\\-|e]*)/g;\n\n\t\twhile ( ( result = pattern.exec( data ) ) !== null ) {\n\n\t\t\t// [\"1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n\t\t\tvertex( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\n\t\t}\n\n\t\t// 3 int int int\n\n\t\tpattern = /3[ ]+([\\d]+)[ ]+([\\d]+)[ ]+([\\d]+)/g;\n\n\t\twhile ( ( result = pattern.exec( data ) ) !== null ) {\n\n\t\t\t// [\"3 1 2 3\", \"1\", \"2\", \"3\"]\n\n\t\t\tface3( parseInt( result[ 1 ] ), parseInt( result[ 2 ] ), parseInt( result[ 3 ] ) );\n\n\t\t}\n\n\t\t// 4 int int int int\n\n\t\tpattern = /4[ ]+([\\d]+)[ ]+([\\d]+)[ ]+([\\d]+)[ ]+([\\d]+)/g;\n\n\t\twhile ( ( result = pattern.exec( data ) ) !== null ) {\n\n\t\t\t// [\"4 1 2 3 4\", \"1\", \"2\", \"3\", \"4\"]\n\n\t\t\tface3( parseInt( result[ 1 ] ), parseInt( result[ 2 ] ), parseInt( result[ 4 ] ) );\n\t\t\tface3( parseInt( result[ 2 ] ), parseInt( result[ 3 ] ), parseInt( result[ 4 ] ) );\n\n\t\t}\n\n\t\tgeometry.computeFaceNormals();\n\t\tgeometry.computeVertexNormals();\n\t\tgeometry.computeBoundingSphere();\n\n\t\treturn geometry;\n\n\t}\n\n};\n\nTHREE.EventDispatcher.prototype.apply( THREE.VTKLoader.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/msgpack-js.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/msgpack-js.js",
"module-type": "library",
"text": "THREE.msgpack = {};\n\nTHREE.msgpack.inspect = function(buffer) {\n if (buffer === undefined) return \"undefined\";\n var view;\n var type;\n if (buffer instanceof ArrayBuffer) {\n type = \"ArrayBuffer\";\n view = new DataView(buffer);\n }\n else if (buffer instanceof DataView) {\n type = \"DataView\";\n view = buffer;\n }\n if (!view) return JSON.stringify(buffer);\n var bytes = [];\n for (var i = 0; i < buffer.byteLength; i++) {\n if (i > 20) {\n bytes.push(\"...\");\n break;\n }\n var byte = view.getUint8(i).toString(16);\n if (byte.length === 1) byte = \"0\" + byte;\n bytes.push(byte);\n }\n return \"<\" + type + \" \" + bytes.join(\" \") + \">\";\n};\n\n// Encode string as utf8 into dataview at offset\nTHREE.msgpack.utf8Write = function(view, offset, string) {\n var byteLength = view.byteLength;\n for(var i = 0, l = string.length; i < l; i++) {\n var codePoint = string.charCodeAt(i);\n\n // One byte of UTF-8\n if (codePoint < 0x80) {\n view.setUint8(offset++, codePoint >>> 0 & 0x7f | 0x00);\n continue;\n }\n\n // Two bytes of UTF-8\n if (codePoint < 0x800) {\n view.setUint8(offset++, codePoint >>> 6 & 0x1f | 0xc0);\n view.setUint8(offset++, codePoint >>> 0 & 0x3f | 0x80);\n continue;\n }\n\n // Three bytes of UTF-8. \n if (codePoint < 0x10000) {\n view.setUint8(offset++, codePoint >>> 12 & 0x0f | 0xe0);\n view.setUint8(offset++, codePoint >>> 6 & 0x3f | 0x80);\n view.setUint8(offset++, codePoint >>> 0 & 0x3f | 0x80);\n continue;\n }\n\n // Four bytes of UTF-8\n if (codePoint < 0x110000) {\n view.setUint8(offset++, codePoint >>> 18 & 0x07 | 0xf0);\n view.setUint8(offset++, codePoint >>> 12 & 0x3f | 0x80);\n view.setUint8(offset++, codePoint >>> 6 & 0x3f | 0x80);\n view.setUint8(offset++, codePoint >>> 0 & 0x3f | 0x80);\n continue;\n }\n throw new Error(\"bad codepoint \" + codePoint);\n }\n};\n\nTHREE.msgpack.utf8Read = function(view, offset, length) {\n var string = \"\";\n for (var i = offset, end = offset + length; i < end; i++) {\n var byte = view.getUint8(i);\n // One byte character\n if ((byte & 0x80) === 0x00) {\n string += String.fromCharCode(byte);\n continue;\n }\n // Two byte character\n if ((byte & 0xe0) === 0xc0) {\n string += String.fromCharCode(\n ((byte & 0x0f) << 6) | \n (view.getUint8(++i) & 0x3f)\n );\n continue;\n }\n // Three byte character\n if ((byte & 0xf0) === 0xe0) {\n string += String.fromCharCode(\n ((byte & 0x0f) << 12) |\n ((view.getUint8(++i) & 0x3f) << 6) |\n ((view.getUint8(++i) & 0x3f) << 0)\n );\n continue;\n }\n // Four byte character\n if ((byte & 0xf8) === 0xf0) {\n string += String.fromCharCode(\n ((byte & 0x07) << 18) |\n ((view.getUint8(++i) & 0x3f) << 12) |\n ((view.getUint8(++i) & 0x3f) << 6) |\n ((view.getUint8(++i) & 0x3f) << 0)\n );\n continue;\n }\n throw new Error(\"Invalid byte \" + byte.toString(16));\n }\n return string;\n};\n\nTHREE.msgpack.utf8ByteCount = function(string) {\n var count = 0;\n for(var i = 0, l = string.length; i < l; i++) {\n var codePoint = string.charCodeAt(i);\n if (codePoint < 0x80) {\n count += 1;\n continue;\n }\n if (codePoint < 0x800) {\n count += 2;\n continue;\n }\n if (codePoint < 0x10000) {\n count += 3;\n continue;\n }\n if (codePoint < 0x110000) {\n count += 4;\n continue;\n }\n throw new Error(\"bad codepoint \" + codePoint);\n }\n return count;\n};\n\nTHREE.msgpack.encode = function(value) {\n var buffer = new ArrayBuffer(sizeof(value));\n var view = new DataView(buffer);\n THREE.msgpack.encode1(value, view, 0);\n return buffer;\n};\n\n// http://wiki.msgpack.org/display/MSGPACK/Format+specification\n// I've extended the protocol to have two new types that were previously reserved.\n// buffer 16 11011000 0xd8\n// buffer 32 11011001 0xd9\n// These work just like raw16 and raw32 except they are node buffers instead of strings.\n//\n// Also I've added a type for `undefined`\n// undefined 11000100 0xc4\n\nTHREE.msgpack.Decoder = function(view, offset) {\n this.offset = offset || 0;\n this.view = view;\n};\nTHREE.msgpack.Decoder.prototype.map = function (length) {\n var value = {};\n for (var i = 0; i < length; i++) {\n var key = this.parse();\n value[key] = this.parse();\n }\n return value;\n};\nTHREE.msgpack.Decoder.prototype.buf = function (length) {\n var value = new ArrayBuffer(length);\n (new Uint8Array(value)).set(new Uint8Array(this.view.buffer, this.offset, length), 0);\n this.offset += length;\n return value;\n};\nTHREE.msgpack.Decoder.prototype.raw = function (length) {\n var value = THREE.msgpack.utf8Read(this.view, this.offset, length);\n this.offset += length;\n return value;\n};\nTHREE.msgpack.Decoder.prototype.array = function (length) {\n var value = new Array(length);\n for (var i = 0; i < length; i++) {\n value[i] = this.parse();\n }\n return value;\n};\nTHREE.msgpack.Decoder.prototype.parse = function () {\n var type = this.view.getUint8(this.offset);\n var value, length;\n // FixRaw\n if ((type & 0xe0) === 0xa0) {\n length = type & 0x1f;\n this.offset++;\n return this.raw(length);\n }\n // FixMap\n if ((type & 0xf0) === 0x80) {\n length = type & 0x0f;\n this.offset++;\n return this.map(length);\n }\n // FixArray\n if ((type & 0xf0) === 0x90) {\n length = type & 0x0f;\n this.offset++;\n return this.array(length);\n }\n // Positive FixNum\n if ((type & 0x80) === 0x00) {\n this.offset++;\n return type;\n }\n // Negative Fixnum\n if ((type & 0xe0) === 0xe0) {\n value = this.view.getInt8(this.offset);\n this.offset++;\n return value;\n }\n switch (type) {\n // raw 16\n case 0xda:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.raw(length);\n // raw 32\n case 0xdb:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.raw(length);\n // nil\n case 0xc0:\n this.offset++;\n return null;\n // false\n case 0xc2:\n this.offset++;\n return false;\n // true\n case 0xc3:\n this.offset++;\n return true;\n // undefined\n case 0xc4:\n this.offset++;\n return undefined;\n // uint8\n case 0xcc:\n value = this.view.getUint8(this.offset + 1);\n this.offset += 2;\n return value;\n // uint 16\n case 0xcd:\n value = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return value;\n // uint 32\n case 0xce:\n value = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return value;\n // int 8\n case 0xd0:\n value = this.view.getInt8(this.offset + 1);\n this.offset += 2;\n return value;\n // int 16\n case 0xd1:\n value = this.view.getInt16(this.offset + 1);\n this.offset += 3;\n return value;\n // int 32\n case 0xd2:\n value = this.view.getInt32(this.offset + 1);\n this.offset += 5;\n return value;\n // map 16\n case 0xde:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.map(length);\n // map 32\n case 0xdf:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.map(length);\n // array 16\n case 0xdc:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.array(length);\n // array 32\n case 0xdd:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.array(length);\n // buffer 16\n case 0xd8:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.buf(length);\n // buffer 32\n case 0xd9:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.buf(length);\n // float\n case 0xca:\n value = this.view.getFloat32(this.offset + 1);\n this.offset += 5;\n return value;\n // double\n case 0xcb:\n value = this.view.getFloat64(this.offset + 1);\n this.offset += 9;\n return value;\n }\n throw new Error(\"Unknown type 0x\" + type.toString(16));\n};\nTHREE.msgpack.decode = function(buffer) {\n var view = new DataView(buffer);\n var decoder = new THREE.msgpack.Decoder(view);\n var value = decoder.parse();\n if (decoder.offset !== buffer.byteLength) throw new Error((buffer.byteLength - decoder.offset) + \" trailing bytes\");\n return value;\n};\n\nTHREE.msgpack.encode1 = function(value, view, offset) {\n var type = typeof value;\n\n // Strings Bytes\n if (type === \"string\") {\n var length = utf8ByteCount(value);\n // fix raw\n if (length < 0x20) {\n view.setUint8(offset, length | 0xa0);\n THREE.msgpack.utf8Write(view, offset + 1, value);\n return 1 + length;\n }\n // raw 16\n if (length < 0x10000) {\n view.setUint8(offset, 0xda);\n view.setUint16(offset + 1, length);\n THREE.msgpack.utf8Write(view, offset + 3, value);\n return 3 + length;\n }\n // raw 32\n if (length < 0x100000000) {\n view.setUint8(offset, 0xdb);\n view.setUint32(offset + 1, length);\n THREE.msgpack.utf8Write(view, offset + 5, value);\n return 5 + length;\n }\n }\n\n if (value instanceof ArrayBuffer) {\n var length = value.byteLength;\n // buffer 16\n if (length < 0x10000) {\n view.setUint8(offset, 0xd8);\n view.setUint16(offset + 1, length);\n (new Uint8Array(view.buffer)).set(new Uint8Array(value), offset + 3);\n return 3 + length;\n }\n // buffer 32\n if (length < 0x100000000) {\n view.setUint8(offset, 0xd9);\n view.setUint32(offset + 1, length);\n (new Uint8Array(view.buffer)).set(new Uint8Array(value), offset + 5);\n return 5 + length;\n }\n }\n \n if (type === \"number\") {\n // Floating Point\n if ((value << 0) !== value) {\n view.setUint8(offset, 0xcb);\n view.setFloat64(offset + 1, value);\n return 9;\n }\n\n // Integers\n if (value >=0) {\n // positive fixnum\n if (value < 0x80) {\n view.setUint8(offset, value);\n return 1;\n }\n // uint 8\n if (value < 0x100) {\n view.setUint8(offset, 0xcc);\n view.setUint8(offset + 1, value);\n return 2;\n }\n // uint 16\n if (value < 0x10000) {\n view.setUint8(offset, 0xcd);\n view.setUint16(offset + 1, value);\n return 3;\n }\n // uint 32\n if (value < 0x100000000) {\n view.setUint8(offset, 0xce);\n view.setUint32(offset + 1, value);\n return 5;\n }\n throw new Error(\"Number too big 0x\" + value.toString(16));\n }\n // negative fixnum\n if (value >= -0x20) {\n view.setInt8(offset, value);\n return 1;\n }\n // int 8\n if (value >= -0x80) {\n view.setUint8(offset, 0xd0);\n view.setInt8(offset + 1, value);\n return 2;\n }\n // int 16\n if (value >= -0x8000) {\n view.setUint8(offset, 0xd1);\n view.setInt16(offset + 1, value);\n return 3;\n }\n // int 32\n if (value >= -0x80000000) {\n view.setUint8(offset, 0xd2);\n view.setInt32(offset + 1, value);\n return 5;\n }\n throw new Error(\"Number too small -0x\" + (-value).toString(16).substr(1));\n }\n \n // undefined\n if (type === \"undefined\") {\n view.setUint8(offset, 0xc4);\n return 1;\n }\n \n // null\n if (value === null) {\n view.setUint8(offset, 0xc0);\n return 1;\n }\n\n // Boolean\n if (type === \"boolean\") {\n view.setUint8(offset, value ? 0xc3 : 0xc2);\n return 1;\n }\n \n // Container Types\n if (type === \"object\") {\n var length, size = 0;\n var isArray = Array.isArray(value);\n\n if (isArray) {\n length = value.length;\n }\n else {\n var keys = Object.keys(value);\n length = keys.length;\n }\n\n var size;\n if (length < 0x10) {\n view.setUint8(offset, length | (isArray ? 0x90 : 0x80));\n size = 1;\n }\n else if (length < 0x10000) {\n view.setUint8(offset, isArray ? 0xdc : 0xde);\n view.setUint16(offset + 1, length);\n size = 3;\n }\n else if (length < 0x100000000) {\n view.setUint8(offset, isArray ? 0xdd : 0xdf);\n view.setUint32(offset + 1, length);\n size = 5;\n }\n\n if (isArray) {\n for (var i = 0; i < length; i++) {\n size += THREE.msgpack.encode(value[i], view, offset + size);\n }\n }\n else {\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n size += THREE.msgpack.encode(key, view, offset + size);\n size += THREE.msgpack.encode(value[key], view, offset + size);\n }\n }\n \n return size;\n }\n throw new Error(\"Unknown type \" + type);\n};\n\nTHREE.msgpack.sizeof = function(value) {\n var type = typeof value;\n\n // Raw Bytes\n if (type === \"string\") {\n var length = THREE.msgpack.utf8ByteCount(value);\n if (length < 0x20) {\n return 1 + length;\n }\n if (length < 0x10000) {\n return 3 + length;\n }\n if (length < 0x100000000) {\n return 5 + length;\n }\n }\n \n if (value instanceof ArrayBuffer) {\n var length = value.byteLength;\n if (length < 0x10000) {\n return 3 + length;\n }\n if (length < 0x100000000) {\n return 5 + length;\n }\n }\n \n if (type === \"number\") {\n // Floating Point\n // double\n if (value << 0 !== value) return 9;\n\n // Integers\n if (value >=0) {\n // positive fixnum\n if (value < 0x80) return 1;\n // uint 8\n if (value < 0x100) return 2;\n // uint 16\n if (value < 0x10000) return 3;\n // uint 32\n if (value < 0x100000000) return 5;\n // uint 64\n if (value < 0x10000000000000000) return 9;\n throw new Error(\"Number too big 0x\" + value.toString(16));\n }\n // negative fixnum\n if (value >= -0x20) return 1;\n // int 8\n if (value >= -0x80) return 2;\n // int 16\n if (value >= -0x8000) return 3;\n // int 32\n if (value >= -0x80000000) return 5;\n // int 64\n if (value >= -0x8000000000000000) return 9;\n throw new Error(\"Number too small -0x\" + value.toString(16).substr(1));\n }\n \n // Boolean, null, undefined\n if (type === \"boolean\" || type === \"undefined\" || value === null) return 1;\n \n // Container Types\n if (type === \"object\") {\n var length, size = 0;\n if (Array.isArray(value)) {\n length = value.length;\n for (var i = 0; i < length; i++) {\n size += sizeof(value[i]);\n }\n }\n else {\n var keys = Object.keys(value);\n length = keys.length;\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n size += sizeof(key) + sizeof(value[key]);\n }\n }\n if (length < 0x10) {\n return 1 + size;\n }\n if (length < 0x10000) {\n return 3 + size;\n }\n if (length < 0x100000000) {\n return 5 + size;\n }\n throw new Error(\"Array or object too long 0x\" + length.toString(16));\n }\n throw new Error(\"Unknown type \" + type);\n};"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/CTMLoader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/CTMLoader.js",
"module-type": "library",
"text": "/**\n * Loader for CTM encoded models generated by OpenCTM tools:\n *\thttp://openctm.sourceforge.net/\n *\n * Uses js-openctm library by Juan Mellado\n *\thttp://code.google.com/p/js-openctm/\n *\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.CTMLoader = function ( showStatus ) {\n\n\tTHREE.Loader.call( this, showStatus );\n\n};\n\nTHREE.CTMLoader.prototype = Object.create( THREE.Loader.prototype );\n\n// Load multiple CTM parts defined in JSON\n\nTHREE.CTMLoader.prototype.loadParts = function( url, callback, parameters ) {\n var func = \"THREE.CTMLoader.loadParts\";\n\n\tparameters = parameters || {};\n\n\tvar scope = this;\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\n var basePath = parameters.basePath ? parameters.basePath : this.extractUrlBase(url);\n var jsonObject = JSON.parse(res);\n var materials = [], geometries = [], counter = 0;\n function callbackFinal(geometry) {\n counter += 1;\n geometries.push(geometry);\n if (counter === jsonObject.offsets.length) {\n\tcallback(geometries, materials);\n }\n }\n\n // init materials\n for (var i = 0; i < jsonObject.materials.length; i++) {\n materials[i] = scope.createMaterial(jsonObject.materials[i], basePath);\n }\n\n // load joined CTM file\n var partUrl = basePath + jsonObject.data;\n var parametersPart = {useWorker: parameters.useWorker, offsets: jsonObject.offsets};\n scope.load(partUrl, callbackFinal, parametersPart);\n\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\tvar xhr = new XMLHttpRequest();\n\n\tvar basePath = parameters.basePath ? parameters.basePath : this.extractUrlBase( url );\n\n\txhr.onreadystatechange = function() {\n\n\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\tif ( xhr.status === 200 || xhr.status === 0 ) {\n\n\t\t\t\tvar jsonObject = JSON.parse( xhr.responseText );\n\n\t\t\t\tvar materials = [], geometries = [], counter = 0;\n\n\t\t\t\tfunction callbackFinal( geometry ) {\n\n\t\t\t\t\tcounter += 1;\n\n\t\t\t\t\tgeometries.push( geometry );\n\n\t\t\t\t\tif ( counter === jsonObject.offsets.length ) {\n\n\t\t\t\t\t\tcallback( geometries, materials );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// init materials\n\n\t\t\t\tfor ( var i = 0; i < jsonObject.materials.length; i ++ ) {\n\n\t\t\t\t\tmaterials[ i ] = scope.createMaterial( jsonObject.materials[ i ], basePath );\n\n\t\t\t\t}\n\n\t\t\t\t// load joined CTM file\n\n\t\t\t\tvar partUrl = basePath + jsonObject.data;\n\t\t\t\tvar parametersPart = { useWorker: parameters.useWorker, offsets: jsonObject.offsets };\n\t\t\t\tscope.load( partUrl, callbackFinal, parametersPart );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\txhr.open( \"GET\", url, true );\n\txhr.setRequestHeader( \"Content-Type\", \"text/plain\" );\n\txhr.send( null );\n\n};\n\n// Load CTMLoader compressed models\n//\t- parameters\n//\t\t- url (required)\n//\t\t- callback (required)\n\nTHREE.CTMLoader.prototype.load = function( url, callback, parameters ) {\n var func = \"THREE.CTMLoader.load\";\n\n\tparameters = parameters || {};\n\n\tvar scope = this;\n\n\tvar offsets = parameters.offsets !== undefined ? parameters.offsets : [ 0 ];\n\n if (TiddlyWiki && url.match(/^tw:/)) {\n var res = TiddlyWiki.load(url);\n //hack.log(\"res.length = \"+res.length, hack.loader, func);\n\n var binaryData = new Uint8Array(res);\n var s = Date.now();\n if (parameters.useWorker) {\n if (TiddlyWiki) {\n alert(func+\": Worker() not supported !\");\n return;\n }\n var worker = new Worker(\"js/loaders/ctm/CTMWorker.js\");\n worker.onmessage = function(event) {\n\tvar files = event.data;\n\tfor (var i = 0; i < files.length; i++) {\n\t var ctmFile = files[ i ];\n\t var e1 = Date.now();\n\t // console.log( \"CTM data parse time [worker]: \" + (e1-s) + \" ms\" );\n\t scope.createModel( ctmFile, callback );\n\t var e = Date.now();\n\t console.log(\"model load time [worker]: \" + (e-e1) + \" ms, total: \" + (e-s));\n\t}\n };\n worker.postMessage({\"data\": binaryData, \"offsets\": offsets});\n } else {\n for (var i = 0; i < offsets.length; i++) {\n\tvar stream = new CTM.Stream(binaryData);\n\tstream.offset = offsets[i];\n\tvar ctmFile = new CTM.File(stream);\n\tscope.createModel(ctmFile, callback);\n }\n //var e = Date.now();\n //console.log( \"CTM data parse time [inline]: \" + (e-s) + \" ms\" );\n }\n\n hack.log(\"url: \"+url+\": loaded\", hack.loader, func);\n return;\n }\n\n\tvar xhr = new XMLHttpRequest(),\n\t\tcallbackProgress = null;\n\n\tvar length = 0;\n\n\txhr.onreadystatechange = function() {\n\n\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\tif ( xhr.status === 200 || xhr.status === 0 ) {\n\n\t\t\t\tvar binaryData = new Uint8Array(xhr.response);\n\n\t\t\t\tvar s = Date.now();\n\n\t\t\t\tif ( parameters.useWorker ) {\n\n\t\t\t\t\tvar worker = new Worker( \"js/loaders/ctm/CTMWorker.js\" );\n\n\t\t\t\t\tworker.onmessage = function( event ) {\n\n\t\t\t\t\t\tvar files = event.data;\n\n\t\t\t\t\t\tfor ( var i = 0; i < files.length; i ++ ) {\n\n\t\t\t\t\t\t\tvar ctmFile = files[ i ];\n\n\t\t\t\t\t\t\tvar e1 = Date.now();\n\t\t\t\t\t\t\t// console.log( \"CTM data parse time [worker]: \" + (e1-s) + \" ms\" );\n\n\t\t\t\t\t\t\tscope.createModel( ctmFile, callback );\n\n\t\t\t\t\t\t\tvar e = Date.now();\n\t\t\t\t\t\t\tconsole.log( \"model load time [worker]: \" + (e-e1) + \" ms, total: \" + (e-s));\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t};\n\n\t\t\t\t\tworker.postMessage( { \"data\": binaryData, \"offsets\": offsets } );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < offsets.length; i ++ ) {\n\n\t\t\t\t\t\tvar stream = new CTM.Stream( binaryData );\n\t\t\t\t\t\tstream.offset = offsets[ i ];\n\n\t\t\t\t\t\tvar ctmFile = new CTM.File( stream );\n\n\t\t\t\t\t\tscope.createModel( ctmFile, callback );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//var e = Date.now();\n\t\t\t\t\t//console.log( \"CTM data parse time [inline]: \" + (e-s) + \" ms\" );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"Couldn't load [\" + url + \"] [\" + xhr.status + \"]\" );\n\n\t\t\t}\n\n\t\t} else if ( xhr.readyState === 3 ) {\n\n\t\t\tif ( callbackProgress ) {\n\n\t\t\t\tif ( length === 0 ) {\n\n\t\t\t\t\tlength = xhr.getResponseHeader( \"Content-Length\" );\n\n\t\t\t\t}\n\n\t\t\t\tcallbackProgress( { total: length, loaded: xhr.responseText.length } );\n\n\t\t\t}\n\n\t\t} else if ( xhr.readyState === 2 ) {\n\n\t\t\tlength = xhr.getResponseHeader( \"Content-Length\" );\n\n\t\t}\n\n\t}\n\n\txhr.open( \"GET\", url, true );\n\txhr.responseType = \"arraybuffer\";\n\n\txhr.send( null );\n\n};\n\n\nTHREE.CTMLoader.prototype.createModel = function ( file, callback ) {\n\n\tvar Model = function () {\n\n\t\tTHREE.BufferGeometry.call( this );\n\n\t\tthis.materials = [];\n\n\t\tvar indices = file.body.indices,\n\t\tpositions = file.body.vertices,\n\t\tnormals = file.body.normals;\n\n\t\tvar uvs, colors;\n\n\t\tvar uvMaps = file.body.uvMaps;\n\n\t\tif ( uvMaps !== undefined && uvMaps.length > 0 ) {\n\n\t\t\tuvs = uvMaps[ 0 ].uv;\n\n\t\t}\n\n\t\tvar attrMaps = file.body.attrMaps;\n\n\t\tif ( attrMaps !== undefined && attrMaps.length > 0 && attrMaps[ 0 ].name === 'Color' ) {\n\n\t\t\tcolors = attrMaps[ 0 ].attr;\n\n\t\t}\n\n\t\tthis.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n\n\t\tif ( normals !== undefined ) {\n\n\t\t\tthis.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );\n\n\t\t}\n\n\t\tif ( uvs !== undefined ) {\n\n\t\t\tthis.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );\n\n\t\t}\n\n\t\tif ( colors !== undefined ) {\n\n\t\t\tthis.addAttribute( 'color', new THREE.BufferAttribute( colors, 4 ) );\n\n\t\t}\n\n\t}\n\n\tModel.prototype = Object.create( THREE.BufferGeometry.prototype );\n\n\tvar geometry = new Model();\n\n\tgeometry.computeOffsets();\n\n\t// compute vertex normals if not present in the CTM model\n\tif ( geometry.attributes[ \"normal\" ] === undefined ) {\n\t\tgeometry.computeVertexNormals();\n\t}\n\n\tcallback( geometry );\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/ctm.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/ctm.js",
"module-type": "library",
"text": "(function(){\n/*\nCopyright (c) 2011 Juan Mellado\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n/*\nReferences:\n- \"OpenCTM: The Open Compressed Triangle Mesh file format\" by Marcus Geelnard\n http://openctm.sourceforge.net/\n*/\n\nvar CTM = CTM || {};\n\nCTM.CompressionMethod = {\n RAW: 0x00574152,\n MG1: 0x0031474d,\n MG2: 0x0032474d\n};\n\nCTM.Flags = {\n NORMALS: 0x00000001\n};\n\nCTM.File = function(stream){\n this.load(stream);\n};\n\nCTM.File.prototype.load = function(stream){\n this.header = new CTM.FileHeader(stream);\n\n this.body = new CTM.FileBody(this.header);\n \n this.getReader().read(stream, this.body);\n};\n\nCTM.File.prototype.getReader = function(){\n var reader;\n\n switch(this.header.compressionMethod){\n case CTM.CompressionMethod.RAW:\n reader = new CTM.ReaderRAW();\n break;\n case CTM.CompressionMethod.MG1:\n reader = new CTM.ReaderMG1();\n break;\n case CTM.CompressionMethod.MG2:\n reader = new CTM.ReaderMG2();\n break;\n }\n\n return reader;\n};\n\nCTM.FileHeader = function(stream){\n stream.readInt32(); //magic \"OCTM\"\n this.fileFormat = stream.readInt32();\n this.compressionMethod = stream.readInt32();\n this.vertexCount = stream.readInt32();\n this.triangleCount = stream.readInt32();\n this.uvMapCount = stream.readInt32();\n this.attrMapCount = stream.readInt32();\n this.flags = stream.readInt32();\n this.comment = stream.readString();\n};\n\nCTM.FileHeader.prototype.hasNormals = function(){\n return this.flags & CTM.Flags.NORMALS;\n};\n\nCTM.FileBody = function(header){\n var i = header.triangleCount * 3,\n v = header.vertexCount * 3,\n n = header.hasNormals()? header.vertexCount * 3: 0,\n u = header.vertexCount * 2,\n a = header.vertexCount * 4,\n j = 0;\n\n var data = new ArrayBuffer(\n (i + v + n + (u * header.uvMapCount) + (a * header.attrMapCount) ) * 4);\n\n this.indices = new Uint32Array(data, 0, i);\n\n this.vertices = new Float32Array(data, i * 4, v);\n\n if ( header.hasNormals() ){\n this.normals = new Float32Array(data, (i + v) * 4, n);\n }\n \n if (header.uvMapCount){\n this.uvMaps = [];\n for (j = 0; j < header.uvMapCount; ++ j){\n this.uvMaps[j] = {uv: new Float32Array(data,\n (i + v + n + (j * u) ) * 4, u) };\n }\n }\n \n if (header.attrMapCount){\n this.attrMaps = [];\n for (j = 0; j < header.attrMapCount; ++ j){\n this.attrMaps[j] = {attr: new Float32Array(data,\n (i + v + n + (u * header.uvMapCount) + (j * a) ) * 4, a) };\n }\n }\n};\n\nCTM.FileMG2Header = function(stream){\n stream.readInt32(); //magic \"MG2H\"\n this.vertexPrecision = stream.readFloat32();\n this.normalPrecision = stream.readFloat32();\n this.lowerBoundx = stream.readFloat32();\n this.lowerBoundy = stream.readFloat32();\n this.lowerBoundz = stream.readFloat32();\n this.higherBoundx = stream.readFloat32();\n this.higherBoundy = stream.readFloat32();\n this.higherBoundz = stream.readFloat32();\n this.divx = stream.readInt32();\n this.divy = stream.readInt32();\n this.divz = stream.readInt32();\n \n this.sizex = (this.higherBoundx - this.lowerBoundx) / this.divx;\n this.sizey = (this.higherBoundy - this.lowerBoundy) / this.divy;\n this.sizez = (this.higherBoundz - this.lowerBoundz) / this.divz;\n};\n\nCTM.ReaderRAW = function(){\n};\n\nCTM.ReaderRAW.prototype.read = function(stream, body){\n this.readIndices(stream, body.indices);\n this.readVertices(stream, body.vertices);\n \n if (body.normals){\n this.readNormals(stream, body.normals);\n }\n if (body.uvMaps){\n this.readUVMaps(stream, body.uvMaps);\n }\n if (body.attrMaps){\n this.readAttrMaps(stream, body.attrMaps);\n }\n};\n\nCTM.ReaderRAW.prototype.readIndices = function(stream, indices){\n stream.readInt32(); //magic \"INDX\"\n stream.readArrayInt32(indices);\n};\n\nCTM.ReaderRAW.prototype.readVertices = function(stream, vertices){\n stream.readInt32(); //magic \"VERT\"\n stream.readArrayFloat32(vertices);\n};\n\nCTM.ReaderRAW.prototype.readNormals = function(stream, normals){\n stream.readInt32(); //magic \"NORM\"\n stream.readArrayFloat32(normals);\n};\n\nCTM.ReaderRAW.prototype.readUVMaps = function(stream, uvMaps){\n var i = 0;\n for (; i < uvMaps.length; ++ i){\n stream.readInt32(); //magic \"TEXC\"\n\n uvMaps[i].name = stream.readString();\n uvMaps[i].filename = stream.readString();\n stream.readArrayFloat32(uvMaps[i].uv);\n }\n};\n\nCTM.ReaderRAW.prototype.readAttrMaps = function(stream, attrMaps){\n var i = 0;\n for (; i < attrMaps.length; ++ i){\n stream.readInt32(); //magic \"ATTR\"\n\n attrMaps[i].name = stream.readString();\n stream.readArrayFloat32(attrMaps[i].attr);\n }\n};\n\nCTM.ReaderMG1 = function(){\n};\n\nCTM.ReaderMG1.prototype.read = function(stream, body){\n this.readIndices(stream, body.indices);\n this.readVertices(stream, body.vertices);\n \n if (body.normals){\n this.readNormals(stream, body.normals);\n }\n if (body.uvMaps){\n this.readUVMaps(stream, body.uvMaps);\n }\n if (body.attrMaps){\n this.readAttrMaps(stream, body.attrMaps);\n }\n};\n\nCTM.ReaderMG1.prototype.readIndices = function(stream, indices){\n stream.readInt32(); //magic \"INDX\"\n stream.readInt32(); //packed size\n \n var interleaved = new CTM.InterleavedStream(indices, 3);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n\n CTM.restoreIndices(indices, indices.length);\n};\n\nCTM.ReaderMG1.prototype.readVertices = function(stream, vertices){\n stream.readInt32(); //magic \"VERT\"\n stream.readInt32(); //packed size\n \n var interleaved = new CTM.InterleavedStream(vertices, 1);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n};\n\nCTM.ReaderMG1.prototype.readNormals = function(stream, normals){\n stream.readInt32(); //magic \"NORM\"\n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(normals, 3);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n};\n\nCTM.ReaderMG1.prototype.readUVMaps = function(stream, uvMaps){\n var i = 0;\n for (; i < uvMaps.length; ++ i){\n stream.readInt32(); //magic \"TEXC\"\n\n uvMaps[i].name = stream.readString();\n uvMaps[i].filename = stream.readString();\n \n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(uvMaps[i].uv, 2);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n }\n};\n\nCTM.ReaderMG1.prototype.readAttrMaps = function(stream, attrMaps){\n var i = 0;\n for (; i < attrMaps.length; ++ i){\n stream.readInt32(); //magic \"ATTR\"\n\n attrMaps[i].name = stream.readString();\n \n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(attrMaps[i].attr, 4);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n }\n};\n\nCTM.ReaderMG2 = function(){\n};\n\nCTM.ReaderMG2.prototype.read = function(stream, body){\n this.MG2Header = new CTM.FileMG2Header(stream);\n \n this.readVertices(stream, body.vertices);\n this.readIndices(stream, body.indices);\n \n if (body.normals){\n this.readNormals(stream, body);\n }\n if (body.uvMaps){\n this.readUVMaps(stream, body.uvMaps);\n }\n if (body.attrMaps){\n this.readAttrMaps(stream, body.attrMaps);\n }\n};\n\nCTM.ReaderMG2.prototype.readVertices = function(stream, vertices){\n stream.readInt32(); //magic \"VERT\"\n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(vertices, 3);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n \n var gridIndices = this.readGridIndices(stream, vertices);\n \n CTM.restoreVertices(vertices, this.MG2Header, gridIndices, this.MG2Header.vertexPrecision);\n};\n\nCTM.ReaderMG2.prototype.readGridIndices = function(stream, vertices){\n stream.readInt32(); //magic \"GIDX\"\n stream.readInt32(); //packed size\n \n var gridIndices = new Uint32Array(vertices.length / 3);\n \n var interleaved = new CTM.InterleavedStream(gridIndices, 1);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n \n CTM.restoreGridIndices(gridIndices, gridIndices.length);\n \n return gridIndices;\n};\n\nCTM.ReaderMG2.prototype.readIndices = function(stream, indices){\n stream.readInt32(); //magic \"INDX\"\n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(indices, 3);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n\n CTM.restoreIndices(indices, indices.length);\n};\n\nCTM.ReaderMG2.prototype.readNormals = function(stream, body){\n stream.readInt32(); //magic \"NORM\"\n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(body.normals, 3);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n\n var smooth = CTM.calcSmoothNormals(body.indices, body.vertices);\n\n CTM.restoreNormals(body.normals, smooth, this.MG2Header.normalPrecision);\n};\n\nCTM.ReaderMG2.prototype.readUVMaps = function(stream, uvMaps){\n var i = 0;\n for (; i < uvMaps.length; ++ i){\n stream.readInt32(); //magic \"TEXC\"\n\n uvMaps[i].name = stream.readString();\n uvMaps[i].filename = stream.readString();\n \n var precision = stream.readFloat32();\n \n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(uvMaps[i].uv, 2);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n \n CTM.restoreMap(uvMaps[i].uv, 2, precision);\n }\n};\n\nCTM.ReaderMG2.prototype.readAttrMaps = function(stream, attrMaps){\n var i = 0;\n for (; i < attrMaps.length; ++ i){\n stream.readInt32(); //magic \"ATTR\"\n\n attrMaps[i].name = stream.readString();\n \n var precision = stream.readFloat32();\n \n stream.readInt32(); //packed size\n\n var interleaved = new CTM.InterleavedStream(attrMaps[i].attr, 4);\n LZMA.decompress(stream, stream, interleaved, interleaved.data.length);\n \n CTM.restoreMap(attrMaps[i].attr, 4, precision);\n }\n};\n\nCTM.restoreIndices = function(indices, len){\n var i = 3;\n if (len > 0){\n indices[2] += indices[0];\n indices[1] += indices[0];\n }\n for (; i < len; i += 3){\n indices[i] += indices[i - 3];\n \n if (indices[i] === indices[i - 3]){\n indices[i + 1] += indices[i - 2];\n }else{\n indices[i + 1] += indices[i];\n }\n\n indices[i + 2] += indices[i];\n }\n};\n\nCTM.restoreGridIndices = function(gridIndices, len){\n var i = 1;\n for (; i < len; ++ i){\n gridIndices[i] += gridIndices[i - 1];\n }\n};\n\nCTM.restoreVertices = function(vertices, grid, gridIndices, precision){\n var gridIdx, delta, x, y, z,\n intVertices = new Uint32Array(vertices.buffer, vertices.byteOffset, vertices.length),\n ydiv = grid.divx, zdiv = ydiv * grid.divy,\n prevGridIdx = 0x7fffffff, prevDelta = 0,\n i = 0, j = 0, len = gridIndices.length;\n\n for (; i < len; j += 3){\n x = gridIdx = gridIndices[i ++];\n \n z = ~~(x / zdiv);\n x -= ~~(z * zdiv);\n y = ~~(x / ydiv);\n x -= ~~(y * ydiv);\n\n delta = intVertices[j];\n if (gridIdx === prevGridIdx){\n delta += prevDelta;\n }\n\n vertices[j] = grid.lowerBoundx +\n x * grid.sizex + precision * delta;\n vertices[j + 1] = grid.lowerBoundy +\n y * grid.sizey + precision * intVertices[j + 1];\n vertices[j + 2] = grid.lowerBoundz +\n z * grid.sizez + precision * intVertices[j + 2];\n\n prevGridIdx = gridIdx;\n prevDelta = delta;\n }\n};\n\nCTM.restoreNormals = function(normals, smooth, precision){\n var ro, phi, theta, sinPhi,\n nx, ny, nz, by, bz, len,\n intNormals = new Uint32Array(normals.buffer, normals.byteOffset, normals.length),\n i = 0, k = normals.length,\n PI_DIV_2 = 3.141592653589793238462643 * 0.5;\n\n for (; i < k; i += 3){\n ro = intNormals[i] * precision;\n phi = intNormals[i + 1];\n\n if (phi === 0){\n normals[i] = smooth[i] * ro;\n normals[i + 1] = smooth[i + 1] * ro;\n normals[i + 2] = smooth[i + 2] * ro;\n }else{\n \n if (phi <= 4){\n theta = (intNormals[i + 2] - 2) * PI_DIV_2;\n }else{\n theta = ( (intNormals[i + 2] * 4 / phi) - 2) * PI_DIV_2;\n }\n \n phi *= precision * PI_DIV_2;\n sinPhi = ro * Math.sin(phi);\n\n nx = sinPhi * Math.cos(theta);\n ny = sinPhi * Math.sin(theta);\n nz = ro * Math.cos(phi);\n\n bz = smooth[i + 1];\n by = smooth[i] - smooth[i + 2];\n\n len = Math.sqrt(2 * bz * bz + by * by);\n if (len > 1e-20){\n by /= len;\n bz /= len;\n }\n\n normals[i] = smooth[i] * nz +\n (smooth[i + 1] * bz - smooth[i + 2] * by) * ny - bz * nx;\n normals[i + 1] = smooth[i + 1] * nz -\n (smooth[i + 2] + smooth[i] ) * bz * ny + by * nx;\n normals[i + 2] = smooth[i + 2] * nz +\n (smooth[i] * by + smooth[i + 1] * bz) * ny + bz * nx;\n }\n }\n};\n\nCTM.restoreMap = function(map, count, precision){\n var delta, value,\n intMap = new Uint32Array(map.buffer, map.byteOffset, map.length),\n i = 0, j, len = map.length;\n\n for (; i < count; ++ i){\n delta = 0;\n\n for (j = i; j < len; j += count){\n value = intMap[j];\n \n delta += value & 1? -( (value + 1) >> 1): value >> 1;\n \n map[j] = delta * precision;\n }\n }\n};\n\nCTM.calcSmoothNormals = function(indices, vertices){\n var smooth = new Float32Array(vertices.length),\n indx, indy, indz, nx, ny, nz,\n v1x, v1y, v1z, v2x, v2y, v2z, len,\n i, k;\n\n for (i = 0, k = indices.length; i < k;){\n indx = indices[i ++] * 3;\n indy = indices[i ++] * 3;\n indz = indices[i ++] * 3;\n\n v1x = vertices[indy] - vertices[indx];\n v2x = vertices[indz] - vertices[indx];\n v1y = vertices[indy + 1] - vertices[indx + 1];\n v2y = vertices[indz + 1] - vertices[indx + 1];\n v1z = vertices[indy + 2] - vertices[indx + 2];\n v2z = vertices[indz + 2] - vertices[indx + 2];\n \n nx = v1y * v2z - v1z * v2y;\n ny = v1z * v2x - v1x * v2z;\n nz = v1x * v2y - v1y * v2x;\n \n len = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (len > 1e-10){\n nx /= len;\n ny /= len;\n nz /= len;\n }\n \n smooth[indx] += nx;\n smooth[indx + 1] += ny;\n smooth[indx + 2] += nz;\n smooth[indy] += nx;\n smooth[indy + 1] += ny;\n smooth[indy + 2] += nz;\n smooth[indz] += nx;\n smooth[indz + 1] += ny;\n smooth[indz + 2] += nz;\n }\n\n for (i = 0, k = smooth.length; i < k; i += 3){\n len = Math.sqrt(smooth[i] * smooth[i] + \n smooth[i + 1] * smooth[i + 1] +\n smooth[i + 2] * smooth[i + 2]);\n\n if(len > 1e-10){\n smooth[i] /= len;\n smooth[i + 1] /= len;\n smooth[i + 2] /= len;\n }\n }\n\n return smooth;\n};\n\nCTM.isLittleEndian = (function(){\n var buffer = new ArrayBuffer(2),\n bytes = new Uint8Array(buffer),\n ints = new Uint16Array(buffer);\n\n bytes[0] = 1;\n\n return ints[0] === 1;\n}());\n\nCTM.InterleavedStream = function(data, count){\n this.data = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n this.offset = CTM.isLittleEndian? 3: 0;\n this.count = count * 4;\n this.len = this.data.length;\n};\n\nCTM.InterleavedStream.prototype.writeByte = function(value){\n this.data[this.offset] = value;\n \n this.offset += this.count;\n if (this.offset >= this.len){\n \n this.offset -= this.len - 4;\n if (this.offset >= this.count){\n \n this.offset -= this.count + (CTM.isLittleEndian? 1: -1);\n }\n }\n};\n\nCTM.Stream = function(data){\n this.data = data;\n this.offset = 0;\n};\n\nCTM.Stream.prototype.TWO_POW_MINUS23 = Math.pow(2, -23);\n\nCTM.Stream.prototype.TWO_POW_MINUS126 = Math.pow(2, -126);\n\nCTM.Stream.prototype.readByte = function(){\n return this.data[this.offset ++] & 0xff;\n};\n\nCTM.Stream.prototype.readInt32 = function(){\n var i = this.readByte();\n i |= this.readByte() << 8;\n i |= this.readByte() << 16;\n return i | (this.readByte() << 24);\n};\n\nCTM.Stream.prototype.readFloat32 = function(){\n var m = this.readByte();\n m += this.readByte() << 8;\n\n var b1 = this.readByte();\n var b2 = this.readByte();\n\n m += (b1 & 0x7f) << 16; \n var e = ( (b2 & 0x7f) << 1) | ( (b1 & 0x80) >>> 7);\n var s = b2 & 0x80? -1: 1;\n\n if (e === 255){\n return m !== 0? NaN: s * Infinity;\n }\n if (e > 0){\n return s * (1 + (m * this.TWO_POW_MINUS23) ) * Math.pow(2, e - 127);\n }\n if (m !== 0){\n return s * m * this.TWO_POW_MINUS126;\n }\n return s * 0;\n};\n\nCTM.Stream.prototype.readString = function(){\n var len = this.readInt32();\n\n this.offset += len;\n\n return String.fromCharCode.apply(null,this.data.subarray(this.offset - len, this.offset));\n};\n\nCTM.Stream.prototype.readArrayInt32 = function(array){\n var i = 0, len = array.length;\n \n while(i < len){\n array[i ++] = this.readInt32();\n }\n\n return array;\n};\n\nCTM.Stream.prototype.readArrayFloat32 = function(array){\n var i = 0, len = array.length;\n\n while(i < len){\n array[i ++] = this.readFloat32();\n }\n\n return array;\n};\n\nexports.CTM = CTM;})();\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/lzma.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/lzma.js",
"module-type": "library",
"text": "(function(){\n\nvar LZMA = LZMA || {};\n\nLZMA.OutWindow = function(){\n this._windowSize = 0;\n};\n\nLZMA.OutWindow.prototype.create = function(windowSize){\n if ( (!this._buffer) || (this._windowSize !== windowSize) ){\n this._buffer = [];\n }\n this._windowSize = windowSize;\n this._pos = 0;\n this._streamPos = 0;\n};\n\nLZMA.OutWindow.prototype.flush = function(){\n var size = this._pos - this._streamPos;\n if (size !== 0){\n while(size --){\n this._stream.writeByte(this._buffer[this._streamPos ++]);\n }\n if (this._pos >= this._windowSize){\n this._pos = 0;\n }\n this._streamPos = this._pos;\n }\n};\n\nLZMA.OutWindow.prototype.releaseStream = function(){\n this.flush();\n this._stream = null;\n};\n\nLZMA.OutWindow.prototype.setStream = function(stream){\n this.releaseStream();\n this._stream = stream;\n};\n\nLZMA.OutWindow.prototype.init = function(solid){\n if (!solid){\n this._streamPos = 0;\n this._pos = 0;\n }\n};\n\nLZMA.OutWindow.prototype.copyBlock = function(distance, len){\n var pos = this._pos - distance - 1;\n if (pos < 0){\n pos += this._windowSize;\n }\n while(len --){\n if (pos >= this._windowSize){\n pos = 0;\n }\n this._buffer[this._pos ++] = this._buffer[pos ++];\n if (this._pos >= this._windowSize){\n this.flush();\n }\n }\n};\n\nLZMA.OutWindow.prototype.putByte = function(b){\n this._buffer[this._pos ++] = b;\n if (this._pos >= this._windowSize){\n this.flush();\n }\n};\n\nLZMA.OutWindow.prototype.getByte = function(distance){\n var pos = this._pos - distance - 1;\n if (pos < 0){\n pos += this._windowSize;\n }\n return this._buffer[pos];\n};\n\nLZMA.RangeDecoder = function(){\n};\n\nLZMA.RangeDecoder.prototype.setStream = function(stream){\n this._stream = stream;\n};\n\nLZMA.RangeDecoder.prototype.releaseStream = function(){\n this._stream = null;\n};\n\nLZMA.RangeDecoder.prototype.init = function(){\n var i = 5;\n\n this._code = 0;\n this._range = -1;\n \n while(i --){\n this._code = (this._code << 8) | this._stream.readByte();\n }\n};\n\nLZMA.RangeDecoder.prototype.decodeDirectBits = function(numTotalBits){\n var result = 0, i = numTotalBits, t;\n\n while(i --){\n this._range >>>= 1;\n t = (this._code - this._range) >>> 31;\n this._code -= this._range & (t - 1);\n result = (result << 1) | (1 - t);\n\n if ( (this._range & 0xff000000) === 0){\n this._code = (this._code << 8) | this._stream.readByte();\n this._range <<= 8;\n }\n }\n\n return result;\n};\n\nLZMA.RangeDecoder.prototype.decodeBit = function(probs, index){\n var prob = probs[index],\n newBound = (this._range >>> 11) * prob;\n\n if ( (this._code ^ 0x80000000) < (newBound ^ 0x80000000) ){\n this._range = newBound;\n probs[index] += (2048 - prob) >>> 5;\n if ( (this._range & 0xff000000) === 0){\n this._code = (this._code << 8) | this._stream.readByte();\n this._range <<= 8;\n }\n return 0;\n }\n\n this._range -= newBound;\n this._code -= newBound;\n probs[index] -= prob >>> 5;\n if ( (this._range & 0xff000000) === 0){\n this._code = (this._code << 8) | this._stream.readByte();\n this._range <<= 8;\n }\n return 1;\n};\n\nLZMA.initBitModels = function(probs, len){\n while(len --){\n probs[len] = 1024;\n }\n};\n\nLZMA.BitTreeDecoder = function(numBitLevels){\n this._models = [];\n this._numBitLevels = numBitLevels;\n};\n\nLZMA.BitTreeDecoder.prototype.init = function(){\n LZMA.initBitModels(this._models, 1 << this._numBitLevels);\n};\n\nLZMA.BitTreeDecoder.prototype.decode = function(rangeDecoder){\n var m = 1, i = this._numBitLevels;\n\n while(i --){\n m = (m << 1) | rangeDecoder.decodeBit(this._models, m);\n }\n return m - (1 << this._numBitLevels);\n};\n\nLZMA.BitTreeDecoder.prototype.reverseDecode = function(rangeDecoder){\n var m = 1, symbol = 0, i = 0, bit;\n\n for (; i < this._numBitLevels; ++ i){\n bit = rangeDecoder.decodeBit(this._models, m);\n m = (m << 1) | bit;\n symbol |= bit << i;\n }\n return symbol;\n};\n\nLZMA.reverseDecode2 = function(models, startIndex, rangeDecoder, numBitLevels){\n var m = 1, symbol = 0, i = 0, bit;\n\n for (; i < numBitLevels; ++ i){\n bit = rangeDecoder.decodeBit(models, startIndex + m);\n m = (m << 1) | bit;\n symbol |= bit << i;\n }\n return symbol;\n};\n\nLZMA.LenDecoder = function(){\n this._choice = [];\n this._lowCoder = [];\n this._midCoder = [];\n this._highCoder = new LZMA.BitTreeDecoder(8);\n this._numPosStates = 0;\n};\n\nLZMA.LenDecoder.prototype.create = function(numPosStates){\n for (; this._numPosStates < numPosStates; ++ this._numPosStates){\n this._lowCoder[this._numPosStates] = new LZMA.BitTreeDecoder(3);\n this._midCoder[this._numPosStates] = new LZMA.BitTreeDecoder(3);\n }\n};\n\nLZMA.LenDecoder.prototype.init = function(){\n var i = this._numPosStates;\n LZMA.initBitModels(this._choice, 2);\n while(i --){\n this._lowCoder[i].init();\n this._midCoder[i].init();\n }\n this._highCoder.init();\n};\n\nLZMA.LenDecoder.prototype.decode = function(rangeDecoder, posState){\n if (rangeDecoder.decodeBit(this._choice, 0) === 0){\n return this._lowCoder[posState].decode(rangeDecoder);\n }\n if (rangeDecoder.decodeBit(this._choice, 1) === 0){\n return 8 + this._midCoder[posState].decode(rangeDecoder);\n }\n return 16 + this._highCoder.decode(rangeDecoder);\n};\n\nLZMA.Decoder2 = function(){\n this._decoders = [];\n};\n\nLZMA.Decoder2.prototype.init = function(){\n LZMA.initBitModels(this._decoders, 0x300);\n};\n\nLZMA.Decoder2.prototype.decodeNormal = function(rangeDecoder){\n var symbol = 1;\n\n do{\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this._decoders, symbol);\n }while(symbol < 0x100);\n\n return symbol & 0xff;\n};\n\nLZMA.Decoder2.prototype.decodeWithMatchByte = function(rangeDecoder, matchByte){\n var symbol = 1, matchBit, bit;\n\n do{\n matchBit = (matchByte >> 7) & 1;\n matchByte <<= 1;\n bit = rangeDecoder.decodeBit(this._decoders, ( (1 + matchBit) << 8) + symbol);\n symbol = (symbol << 1) | bit;\n if (matchBit !== bit){\n while(symbol < 0x100){\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this._decoders, symbol);\n }\n break;\n }\n }while(symbol < 0x100);\n\n return symbol & 0xff;\n};\n\nLZMA.LiteralDecoder = function(){\n};\n\nLZMA.LiteralDecoder.prototype.create = function(numPosBits, numPrevBits){\n var i;\n\n if (this._coders\n && (this._numPrevBits === numPrevBits)\n && (this._numPosBits === numPosBits) ){\n return;\n }\n this._numPosBits = numPosBits;\n this._posMask = (1 << numPosBits) - 1;\n this._numPrevBits = numPrevBits;\n\n this._coders = [];\n\n i = 1 << (this._numPrevBits + this._numPosBits);\n while(i --){\n this._coders[i] = new LZMA.Decoder2();\n }\n};\n\nLZMA.LiteralDecoder.prototype.init = function(){\n var i = 1 << (this._numPrevBits + this._numPosBits);\n while(i --){\n this._coders[i].init();\n }\n};\n\nLZMA.LiteralDecoder.prototype.getDecoder = function(pos, prevByte){\n return this._coders[( (pos & this._posMask) << this._numPrevBits)\n + ( (prevByte & 0xff) >>> (8 - this._numPrevBits) )];\n};\n\nLZMA.Decoder = function(){\n this._outWindow = new LZMA.OutWindow();\n this._rangeDecoder = new LZMA.RangeDecoder();\n this._isMatchDecoders = [];\n this._isRepDecoders = [];\n this._isRepG0Decoders = [];\n this._isRepG1Decoders = [];\n this._isRepG2Decoders = [];\n this._isRep0LongDecoders = [];\n this._posSlotDecoder = [];\n this._posDecoders = [];\n this._posAlignDecoder = new LZMA.BitTreeDecoder(4);\n this._lenDecoder = new LZMA.LenDecoder();\n this._repLenDecoder = new LZMA.LenDecoder();\n this._literalDecoder = new LZMA.LiteralDecoder();\n this._dictionarySize = -1;\n this._dictionarySizeCheck = -1;\n\n this._posSlotDecoder[0] = new LZMA.BitTreeDecoder(6);\n this._posSlotDecoder[1] = new LZMA.BitTreeDecoder(6);\n this._posSlotDecoder[2] = new LZMA.BitTreeDecoder(6);\n this._posSlotDecoder[3] = new LZMA.BitTreeDecoder(6);\n};\n\nLZMA.Decoder.prototype.setDictionarySize = function(dictionarySize){\n if (dictionarySize < 0){\n return false;\n }\n if (this._dictionarySize !== dictionarySize){\n this._dictionarySize = dictionarySize;\n this._dictionarySizeCheck = Math.max(this._dictionarySize, 1);\n this._outWindow.create( Math.max(this._dictionarySizeCheck, 4096) );\n }\n return true;\n};\n\nLZMA.Decoder.prototype.setLcLpPb = function(lc, lp, pb){\n var numPosStates = 1 << pb;\n\n if (lc > 8 || lp > 4 || pb > 4){\n return false;\n }\n\n this._literalDecoder.create(lp, lc);\n\n this._lenDecoder.create(numPosStates);\n this._repLenDecoder.create(numPosStates);\n this._posStateMask = numPosStates - 1;\n\n return true;\n};\n\nLZMA.Decoder.prototype.init = function(){\n var i = 4;\n\n this._outWindow.init(false);\n\n LZMA.initBitModels(this._isMatchDecoders, 192);\n LZMA.initBitModels(this._isRep0LongDecoders, 192);\n LZMA.initBitModels(this._isRepDecoders, 12);\n LZMA.initBitModels(this._isRepG0Decoders, 12);\n LZMA.initBitModels(this._isRepG1Decoders, 12);\n LZMA.initBitModels(this._isRepG2Decoders, 12);\n LZMA.initBitModels(this._posDecoders, 114);\n\n this._literalDecoder.init();\n\n while(i --){\n this._posSlotDecoder[i].init();\n }\n\n this._lenDecoder.init();\n this._repLenDecoder.init();\n this._posAlignDecoder.init();\n this._rangeDecoder.init();\n};\n\nLZMA.Decoder.prototype.decode = function(inStream, outStream, outSize){\n var state = 0, rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0, nowPos64 = 0, prevByte = 0,\n posState, decoder2, len, distance, posSlot, numDirectBits;\n\n this._rangeDecoder.setStream(inStream);\n this._outWindow.setStream(outStream);\n\n this.init();\n\n while(outSize < 0 || nowPos64 < outSize){\n posState = nowPos64 & this._posStateMask;\n\n if (this._rangeDecoder.decodeBit(this._isMatchDecoders, (state << 4) + posState) === 0){\n decoder2 = this._literalDecoder.getDecoder(nowPos64 ++, prevByte);\n\n if (state >= 7){\n prevByte = decoder2.decodeWithMatchByte(this._rangeDecoder, this._outWindow.getByte(rep0) );\n }else{\n prevByte = decoder2.decodeNormal(this._rangeDecoder);\n }\n this._outWindow.putByte(prevByte);\n\n state = state < 4? 0: state - (state < 10? 3: 6);\n\n }else{\n\n if (this._rangeDecoder.decodeBit(this._isRepDecoders, state) === 1){\n len = 0;\n if (this._rangeDecoder.decodeBit(this._isRepG0Decoders, state) === 0){\n if (this._rangeDecoder.decodeBit(this._isRep0LongDecoders, (state << 4) + posState) === 0){\n state = state < 7? 9: 11;\n len = 1;\n }\n }else{\n if (this._rangeDecoder.decodeBit(this._isRepG1Decoders, state) === 0){\n distance = rep1;\n }else{\n if (this._rangeDecoder.decodeBit(this._isRepG2Decoders, state) === 0){\n distance = rep2;\n }else{\n distance = rep3;\n rep3 = rep2;\n }\n rep2 = rep1;\n }\n rep1 = rep0;\n rep0 = distance;\n }\n if (len === 0){\n len = 2 + this._repLenDecoder.decode(this._rangeDecoder, posState);\n state = state < 7? 8: 11;\n }\n }else{\n rep3 = rep2;\n rep2 = rep1;\n rep1 = rep0;\n\n len = 2 + this._lenDecoder.decode(this._rangeDecoder, posState);\n state = state < 7? 7: 10;\n\n posSlot = this._posSlotDecoder[len <= 5? len - 2: 3].decode(this._rangeDecoder);\n if (posSlot >= 4){\n\n numDirectBits = (posSlot >> 1) - 1;\n rep0 = (2 | (posSlot & 1) ) << numDirectBits;\n\n if (posSlot < 14){\n rep0 += LZMA.reverseDecode2(this._posDecoders,\n rep0 - posSlot - 1, this._rangeDecoder, numDirectBits);\n }else{\n rep0 += this._rangeDecoder.decodeDirectBits(numDirectBits - 4) << 4;\n rep0 += this._posAlignDecoder.reverseDecode(this._rangeDecoder);\n if (rep0 < 0){\n if (rep0 === -1){\n break;\n }\n return false;\n }\n }\n }else{\n rep0 = posSlot;\n }\n }\n\n if (rep0 >= nowPos64 || rep0 >= this._dictionarySizeCheck){\n return false;\n }\n\n this._outWindow.copyBlock(rep0, len);\n nowPos64 += len;\n prevByte = this._outWindow.getByte(0);\n }\n }\n\n this._outWindow.flush();\n this._outWindow.releaseStream();\n this._rangeDecoder.releaseStream();\n\n return true;\n};\n\nLZMA.Decoder.prototype.setDecoderProperties = function(properties){\n var value, lc, lp, pb, dictionarySize;\n\n if (properties.size < 5){\n return false;\n }\n\n value = properties.readByte();\n lc = value % 9;\n value = ~~(value / 9);\n lp = value % 5;\n pb = ~~(value / 5);\n\n if ( !this.setLcLpPb(lc, lp, pb) ){\n return false;\n }\n\n dictionarySize = properties.readByte();\n dictionarySize |= properties.readByte() << 8;\n dictionarySize |= properties.readByte() << 16;\n dictionarySize += properties.readByte() * 16777216;\n\n return this.setDictionarySize(dictionarySize);\n};\n\nLZMA.decompress = function(properties, inStream, outStream, outSize){\n var decoder = new LZMA.Decoder();\n\n if ( !decoder.setDecoderProperties(properties) ){\n throw \"Incorrect stream properties\";\n }\n\n if ( !decoder.decode(inStream, outStream, outSize) ){\n throw \"Error in data stream\";\n }\n\n return true;\n};\n\nexports.LZMA = LZMA;})();\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/License/js-lzma.txt": {
"type": "text/plain",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/License/js-lzma.txt",
"text": "Copyright (c) 2011 Juan Mellado\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/License/js-openctm.txt": {
"type": "text/plain",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/License/js-openctm.txt",
"text": "Copyright (c) 2011 Juan Mellado\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
},
"$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/License/OpenCTM.txt": {
"type": "text/plain",
"title": "$:/plugins/rboue/Three.js/Lib/Loaders/Ctm/License/OpenCTM.txt",
"text": "Copyright (c) 2009-2010 Marcus Geelnard\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n 1. The origin of this software must not be misrepresented; you must not\n claim that you wrote the original software. If you use this software\n in a product, an acknowledgment in the product documentation would be\n appreciated but is not required.\n\n 2. Altered source versions must be plainly marked as such, and must not\n be misrepresented as being the original software.\n\n 3. This notice may not be removed or altered from any source\n distribution.\n"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/RaytracingRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/RaytracingRenderer.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RaytracingRenderer = function ( parameters ) {\n\n\tconsole.log( 'THREE.RaytracingRenderer', THREE.REVISION );\n\n\tparameters = parameters || {};\n\n // *TiddlyWiki*\n var _self = this;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tvar context = canvas.getContext( '2d', {\n\t\talpha: parameters.alpha === true\n\t} );\n\n\tvar maxRecursionDepth = 3;\n\n\tvar canvasWidth, canvasHeight;\n\tvar canvasWidthHalf, canvasHeightHalf;\n\n\tvar clearColor = new THREE.Color( 0x000000 );\n\n\tvar origin = new THREE.Vector3();\n\tvar direction = new THREE.Vector3();\n\n\tvar cameraPosition = new THREE.Vector3();\n\n\tvar raycaster = new THREE.Raycaster( origin, direction );\n\tvar raycasterLight = new THREE.Raycaster();\n\n\tvar perspective;\n\tvar modelViewMatrix = new THREE.Matrix4();\n\tvar cameraNormalMatrix = new THREE.Matrix3();\n\n\tvar objects;\n\tvar lights = [];\n\tvar cache = {};\n\n\tvar animationFrameId = null;\n\n\tthis.domElement = canvas;\n\n\tthis.autoClear = true;\n\n\tthis.setClearColor = function ( color, alpha ) {\n\n\t\tclearColor.set( color );\n\n\t};\n\n\tthis.setSize = function ( width, height ) {\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tcanvasWidth = canvas.width;\n\t\tcanvasHeight = canvas.height;\n\n\t\tcanvasWidthHalf = Math.floor( canvasWidth / 2 );\n\t\tcanvasHeightHalf = Math.floor( canvasHeight / 2 );\n\n\t\tcontext.fillStyle = 'white';\n\n\t};\n\n\tthis.setSize( canvas.width, canvas.height );\n\n\tthis.clear = function () {\n\n\t};\n\n\t//\n\n\tvar spawnRay = ( function () {\n\n\t\tvar diffuseColor = new THREE.Color();\n\t\tvar specularColor = new THREE.Color();\n\t\tvar lightColor = new THREE.Color();\n\t\tvar schlick = new THREE.Color();\n\n\t\tvar lightContribution = new THREE.Color();\n\n\t\tvar eyeVector = new THREE.Vector3();\n\t\tvar lightVector = new THREE.Vector3();\n\t\tvar normalVector = new THREE.Vector3();\n\t\tvar halfVector = new THREE.Vector3();\n\n\t\tvar localPoint = new THREE.Vector3();\n\t\tvar reflectionVector = new THREE.Vector3();\n\n\t\tvar tmpVec = new THREE.Vector3();\n\n\t\tvar tmpColor = [];\n\n\t\tfor ( var i = 0; i < maxRecursionDepth; i ++ ) {\n\n\t\t\ttmpColor[ i ] = new THREE.Color();\n\n\t\t}\n\n\t\treturn function ( rayOrigin, rayDirection, outputColor, recursionDepth ) {\n\n\t\t\tvar ray = raycaster.ray;\n\n\t\t\tray.origin = rayOrigin;\n\t\t\tray.direction = rayDirection;\n\n\t\t\t//\n\n\t\t\tvar rayLight = raycasterLight.ray;\n\n\t\t\t//\n\n\t\t\toutputColor.setRGB( 0, 0, 0 );\n\n\t\t\t//\n\n\t\t\tvar intersections = raycaster.intersectObjects( objects, true );\n\n\t\t\t// ray didn't find anything\n\t\t\t// (here should come setting of background color?)\n\n\t\t\tif ( intersections.length === 0 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// ray hit\n\n\t\t\tvar intersection = intersections[ 0 ];\n\n\t\t\tvar point = intersection.point;\n\t\t\tvar object = intersection.object;\n\t\t\tvar material = object.material;\n\t\t\tvar face = intersection.face;\n\n\t\t\tvar vertices = object.geometry.vertices;\n\n\t\t\t//\n\n\t\t\tvar _object = cache[ object.id ];\n\n\t\t\tlocalPoint.copy( point ).applyMatrix4( _object.inverseMatrix );\n\t\t\teyeVector.subVectors( raycaster.ray.origin, point ).normalize();\n\n\t\t\t// resolve pixel diffuse color\n\n\t\t\tif ( material instanceof THREE.MeshLambertMaterial ||\n\t\t\t\t material instanceof THREE.MeshPhongMaterial ||\n\t\t\t\t material instanceof THREE.MeshBasicMaterial ) {\n\n\t\t\t\tdiffuseColor.copyGammaToLinear( material.color );\n\n\t\t\t} else {\n\n\t\t\t\tdiffuseColor.setRGB( 1, 1, 1 );\n\n\t\t\t}\n\n\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\n\n\t\t\t\tdiffuseColor.multiply( face.color );\n\n\t\t\t}\n\n\t\t\t// compute light shading\n\n\t\t\trayLight.origin.copy( point );\n\n\t\t\tif ( material instanceof THREE.MeshBasicMaterial ) {\n\n\t\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\t\tlightVector.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tlightVector.sub( point );\n\n\t\t\t\t\trayLight.direction.copy( lightVector ).normalize();\n\n\t\t\t\t\tvar intersections = raycasterLight.intersectObjects( objects, true );\n\n\t\t\t\t\t// point in shadow\n\n\t\t\t\t\tif ( intersections.length > 0 ) continue;\n\n\t\t\t\t\t// point visible\n\n\t\t\t\t\toutputColor.add( diffuseColor );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material instanceof THREE.MeshLambertMaterial ||\n\t\t\t\t\t\tmaterial instanceof THREE.MeshPhongMaterial ) {\n\n\t\t\t\tvar normalComputed = false;\n\n\t\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\t\tlightColor.copyGammaToLinear( light.color );\n\n\t\t\t\t\tlightVector.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tlightVector.sub( point );\n\n\t\t\t\t\trayLight.direction.copy( lightVector ).normalize();\n\n\t\t\t\t\tvar intersections = raycasterLight.intersectObjects( objects, true );\n\n\t\t\t\t\t// point in shadow\n\n\t\t\t\t\tif ( intersections.length > 0 ) continue;\n\n\t\t\t\t\t// point lit\n\n\t\t\t\t\tif ( normalComputed === false ) {\n\n\t\t\t\t\t\t// the same normal can be reused for all lights\n\t\t\t\t\t\t// (should be possible to cache even more)\n\n\t\t\t\t\t\tcomputePixelNormal( normalVector, localPoint, material.shading, face, vertices );\n\t\t\t\t\t\tnormalVector.applyMatrix3( _object.normalMatrix ).normalize();\n\n\t\t\t\t\t\tnormalComputed = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// compute attenuation\n\n\t\t\t\t\tvar attenuation = 1.0;\n\n\t\t\t\t\tif ( light.physicalAttenuation === true ) {\n\n\t\t\t\t\t\tattenuation = lightVector.length();\n\t\t\t\t\t\tattenuation = 1.0 / ( attenuation * attenuation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlightVector.normalize();\n\n\t\t\t\t\t// compute diffuse\n\n\t\t\t\t\tvar dot = Math.max( normalVector.dot( lightVector ), 0 );\n\t\t\t\t\tvar diffuseIntensity = dot * light.intensity;\n\n\t\t\t\t\tlightContribution.copy( diffuseColor );\n\t\t\t\t\tlightContribution.multiply( lightColor );\n\t\t\t\t\tlightContribution.multiplyScalar( diffuseIntensity * attenuation );\n\n\t\t\t\t\toutputColor.add( lightContribution );\n\n\t\t\t\t\t// compute specular\n\n\t\t\t\t\tif ( material instanceof THREE.MeshPhongMaterial ) {\n\n\t\t\t\t\t\thalfVector.addVectors( lightVector, eyeVector ).normalize();\n\n\t\t\t\t\t\tvar dotNormalHalf = Math.max( normalVector.dot( halfVector ), 0.0 );\n\t\t\t\t\t\tvar specularIntensity = Math.max( Math.pow( dotNormalHalf, material.shininess ), 0.0 ) * diffuseIntensity;\n\n\t\t\t\t\t\tvar specularNormalization = ( material.shininess + 2.0 ) / 8.0;\n\n\t\t\t\t\t\tspecularColor.copyGammaToLinear( material.specular );\n\n\t\t\t\t\t\tvar alpha = Math.pow( Math.max( 1.0 - lightVector.dot( halfVector ), 0.0 ), 5.0 );\n\n\t\t\t\t\t\tschlick.r = specularColor.r + ( 1.0 - specularColor.r ) * alpha;\n\t\t\t\t\t\tschlick.g = specularColor.g + ( 1.0 - specularColor.g ) * alpha;\n\t\t\t\t\t\tschlick.b = specularColor.b + ( 1.0 - specularColor.b ) * alpha;\n\n\t\t\t\t\t\tlightContribution.copy( schlick );\n\n\t\t\t\t\t\tlightContribution.multiply( lightColor );\n\t\t\t\t\t\tlightContribution.multiplyScalar( specularNormalization * specularIntensity * attenuation );\n\t\t\t\t\t\toutputColor.add( lightContribution );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reflection / refraction\n\n\t\t\tvar reflectivity = material.reflectivity;\n\n\t\t\tif ( ( material.mirror || material.glass ) && reflectivity > 0 && recursionDepth < maxRecursionDepth ) {\n\n\t\t\t\tif ( material.mirror ) {\n\n\t\t\t\t\treflectionVector.copy( rayDirection );\n\t\t\t\t\treflectionVector.reflect( normalVector );\n\n\t\t\t\t} else if ( material.glass ) {\n\n\t\t\t\t\tvar eta = material.refractionRatio;\n\n\t\t\t\t\tvar dotNI = rayDirection.dot( normalVector )\n\t\t\t\t\tvar k = 1.0 - eta * eta * ( 1.0 - dotNI * dotNI );\n\n\t\t\t\t\tif ( k < 0.0 ) {\n\n\t\t\t\t\t\treflectionVector.set( 0, 0, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treflectionVector.copy( rayDirection );\n\t\t\t\t\t\treflectionVector.multiplyScalar( eta );\n\n\t\t\t\t\t\tvar alpha = eta * dotNI + Math.sqrt( k );\n\t\t\t\t\t\ttmpVec.copy( normalVector );\n\t\t\t\t\t\ttmpVec.multiplyScalar( alpha );\n\t\t\t\t\t\treflectionVector.sub( tmpVec );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar theta = Math.max( eyeVector.dot( normalVector ), 0.0 );\n\t\t\t\tvar rf0 = reflectivity;\n\t\t\t\tvar fresnel = rf0 + ( 1.0 - rf0 ) * Math.pow( ( 1.0 - theta ), 5.0 );\n\n\t\t\t\tvar weight = fresnel;\n\n\t\t\t\tvar zColor = tmpColor[ recursionDepth ];\n\n\t\t\t\tspawnRay( point, reflectionVector, zColor, recursionDepth + 1 );\n\n\t\t\t\tif ( material.specular !== undefined ) {\n\n\t\t\t\t\tzColor.multiply( material.specular );\n\n\t\t\t\t}\n\n\t\t\t\tzColor.multiplyScalar( weight );\n\t\t\t\toutputColor.multiplyScalar( 1 - weight );\n\t\t\t\toutputColor.add( zColor );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tvar computePixelNormal = ( function () {\n\n\t\tvar tmpVec1 = new THREE.Vector3();\n\t\tvar tmpVec2 = new THREE.Vector3();\n\t\tvar tmpVec3 = new THREE.Vector3();\n\n\t\treturn function ( outputVector, point, shading, face, vertices ) {\n\n\t\t\tvar faceNormal = face.normal;\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( shading === THREE.FlatShading ) {\n\n\t\t\t\toutputVector.copy( faceNormal );\n\n\t\t\t} else if ( shading === THREE.SmoothShading ) {\n\n\t\t\t\t// compute barycentric coordinates\n\n\t\t\t\tvar vA = vertices[ face.a ];\n\t\t\t\tvar vB = vertices[ face.b ];\n\t\t\t\tvar vC = vertices[ face.c ];\n\n\t\t\t\ttmpVec3.crossVectors( tmpVec1.subVectors( vB, vA ), tmpVec2.subVectors( vC, vA ) );\n\t\t\t\tvar areaABC = faceNormal.dot( tmpVec3 );\n\n\t\t\t\ttmpVec3.crossVectors( tmpVec1.subVectors( vB, point ), tmpVec2.subVectors( vC, point ) );\n\t\t\t\tvar areaPBC = faceNormal.dot( tmpVec3 );\n\t\t\t\tvar a = areaPBC / areaABC;\n\n\t\t\t\ttmpVec3.crossVectors( tmpVec1.subVectors( vC, point ), tmpVec2.subVectors( vA, point ) );\n\t\t\t\tvar areaPCA = faceNormal.dot( tmpVec3 );\n\t\t\t\tvar b = areaPCA / areaABC;\n\n\t\t\t\tvar c = 1.0 - a - b;\n\n\t\t\t\t// compute interpolated vertex normal\n\n\t\t\t\ttmpVec1.copy( vertexNormals[ 0 ] );\n\t\t\t\ttmpVec1.multiplyScalar( a );\n\n\t\t\t\ttmpVec2.copy( vertexNormals[ 1 ] );\n\t\t\t\ttmpVec2.multiplyScalar( b );\n\n\t\t\t\ttmpVec3.copy( vertexNormals[ 2 ] );\n\t\t\t\ttmpVec3.multiplyScalar( c );\n\n\t\t\t\toutputVector.addVectors( tmpVec1, tmpVec2 );\n\t\t\t\toutputVector.add( tmpVec3 );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tvar renderBlock = ( function () {\n\n\t\tvar blockSize = 64;\n\n\t\tvar canvasBlock = document.createElement( 'canvas' );\n\t\tcanvasBlock.width = blockSize;\n\t\tcanvasBlock.height = blockSize;\n\n\t\tvar contextBlock = canvasBlock.getContext( '2d', {\n\n\t\t\talpha: parameters.alpha === true\n\n\t\t} );\n\n\t\tvar imagedata = contextBlock.getImageData( 0, 0, blockSize, blockSize );\n\t\tvar data = imagedata.data;\n\n\t\tvar pixelColor = new THREE.Color();\n\n\t\treturn function ( blockX, blockY ) {\n\n\t\t\tvar index = 0;\n\n\t\t\tfor ( var y = 0; y < blockSize; y ++ ) {\n\n\t\t\t\tfor ( var x = 0; x < blockSize; x ++, index += 4 ) {\n\n\t\t\t\t\t// spawn primary ray at pixel position\n\n\t\t\t\t\torigin.copy( cameraPosition );\n\n\t\t\t\t\tdirection.set( x + blockX - canvasWidthHalf, - ( y + blockY - canvasHeightHalf ), - perspective );\n\t\t\t\t\tdirection.applyMatrix3( cameraNormalMatrix ).normalize();\n\n\t\t\t\t\tspawnRay( origin, direction, pixelColor, 0 );\n\n\t\t\t\t\t// convert from linear to gamma\n\n\t\t\t\t\tdata[ index ] = Math.sqrt( pixelColor.r ) * 255;\n\t\t\t\t\tdata[ index + 1 ] = Math.sqrt( pixelColor.g ) * 255;\n\t\t\t\t\tdata[ index + 2 ] = Math.sqrt( pixelColor.b ) * 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imagedata, blockX, blockY );\n\n\t\t\tblockX += blockSize;\n\n\t\t\tif ( blockX >= canvasWidth ) {\n\n\t\t\t\tblockX = 0;\n\t\t\t\tblockY += blockSize;\n\n\t\t\t if ( blockY >= canvasHeight ) {\n if (TiddlyWiki) {\n // End of rendering\n _self.endingCallback();\n }\n return;\n }\n\n\t\t\t}\n\n\t\t\tcontext.fillRect( blockX, blockY, blockSize, blockSize );\n\n\t\t\tanimationFrameId = requestAnimationFrame( function () {\n\n\t\t\t\trenderBlock( blockX, blockY );\n\n\t\t\t} );\n\n\t\t};\n\n\t}() );\n\n this.render = function ( scene, camera /* *TiddlyWiki* */, endingCallback ) {\n\n if (TiddlyWiki && endingCallback) {\n this.endingCallback = endingCallback;\n }\n\n\n\t\tif ( this.autoClear === true ) this.clear();\n\n\t\tcancelAnimationFrame( animationFrameId );\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\t\tcameraPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t//\n\n\t\tcameraNormalMatrix.getNormalMatrix( camera.matrixWorld );\n\t\torigin.copy( cameraPosition );\n\n\t\tperspective = 0.5 / Math.tan( THREE.Math.degToRad( camera.fov * 0.5 ) ) * canvasHeight;\n\n\t\tobjects = scene.children;\n\n\t\t// collect lights and set up object matrices\n\n\t\tlights.length = 0;\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object instanceof THREE.Light ) {\n\n\t\t\t\tlights.push( object );\n\n\t\t\t}\n\n\t\t\tif ( cache[ object.id ] === undefined ) {\n\n\t\t\t\tcache[ object.id ] = {\n\t\t\t\t\tnormalMatrix: new THREE.Matrix3(),\n\t\t\t\t\tinverseMatrix: new THREE.Matrix4()\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tmodelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld )\n\n\t\t\tvar _object = cache[ object.id ];\n\n\t\t\t_object.normalMatrix.getNormalMatrix( modelViewMatrix );\n\t\t\t_object.inverseMatrix.getInverse( object.matrixWorld );\n\n\t\t} );\n\n\t\trenderBlock( 0, 0 );\n\n\t};\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/CSS3DRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/CSS3DRenderer.js",
"module-type": "library",
"text": "/**\n * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.CSS3DObject = function ( element ) {\n\n\tTHREE.Object3D.call( this );\n\n\tthis.element = element;\n\tthis.element.style.position = 'absolute';\n\n\tthis.addEventListener( 'removed', function ( event ) {\n\n\t\tif ( this.element.parentNode !== null ) {\n\n\t\t\tthis.element.parentNode.removeChild( this.element );\n\n\t\t}\n\n\t} );\n\n};\n\nTHREE.CSS3DObject.prototype = Object.create( THREE.Object3D.prototype );\n\nTHREE.CSS3DSprite = function ( element ) {\n\n\tTHREE.CSS3DObject.call( this, element );\n\n};\n\nTHREE.CSS3DSprite.prototype = Object.create( THREE.CSS3DObject.prototype );\n\n//\n\nTHREE.CSS3DRenderer = function () {\n\n\tconsole.log( 'THREE.CSS3DRenderer', THREE.REVISION );\n\n\tvar _width, _height;\n\tvar _widthHalf, _heightHalf;\n\n\tvar matrix = new THREE.Matrix4();\n\t\n\tvar cache = {\n\t\tcamera: { fov: 0, style: '' },\n\t\tobjects: {}\n\t};\n\n\tvar domElement = document.createElement( 'div' );\n\tdomElement.style.overflow = 'hidden';\n\n\tdomElement.style.WebkitTransformStyle = 'preserve-3d';\n\tdomElement.style.MozTransformStyle = 'preserve-3d';\n\tdomElement.style.oTransformStyle = 'preserve-3d';\n\tdomElement.style.transformStyle = 'preserve-3d';\n\n\tthis.domElement = domElement;\n\n\tvar cameraElement = document.createElement( 'div' );\n\n\tcameraElement.style.WebkitTransformStyle = 'preserve-3d';\n\tcameraElement.style.MozTransformStyle = 'preserve-3d';\n\tcameraElement.style.oTransformStyle = 'preserve-3d';\n\tcameraElement.style.transformStyle = 'preserve-3d';\n\n\tdomElement.appendChild( cameraElement );\n\n\tthis.setClearColor = function () {\n\n\t};\n\n\tthis.setSize = function ( width, height ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_widthHalf = _width / 2;\n\t\t_heightHalf = _height / 2;\n\n\t\tdomElement.style.width = width + 'px';\n\t\tdomElement.style.height = height + 'px';\n\n\t\tcameraElement.style.width = width + 'px';\n\t\tcameraElement.style.height = height + 'px';\n\n\t};\n\n\tvar epsilon = function ( value ) {\n\n\t\treturn Math.abs( value ) < 0.000001 ? 0 : value;\n\n\t};\n\n\tvar getCameraCSSMatrix = function ( matrix ) {\n\n\t\tvar elements = matrix.elements;\n\n\t\treturn 'matrix3d(' +\n\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\tepsilon( - elements[ 1 ] ) + ',' +\n\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\tepsilon( elements[ 4 ] ) + ',' +\n\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\tepsilon( elements[ 6 ] ) + ',' +\n\t\t\tepsilon( elements[ 7 ] ) + ',' +\n\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\tepsilon( - elements[ 9 ] ) + ',' +\n\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\tepsilon( - elements[ 13 ] ) + ',' +\n\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\tepsilon( elements[ 15 ] ) +\n\t\t')';\n\n\t};\n\n\tvar getObjectCSSMatrix = function ( matrix ) {\n\n\t\tvar elements = matrix.elements;\n\n\t\treturn 'translate3d(-50%,-50%,0) matrix3d(' +\n\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\tepsilon( elements[ 1 ] ) + ',' +\n\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\tepsilon( - elements[ 4 ] ) + ',' +\n\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\tepsilon( - elements[ 6 ] ) + ',' +\n\t\t\tepsilon( - elements[ 7 ] ) + ',' +\n\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\tepsilon( elements[ 9 ] ) + ',' +\n\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\tepsilon( elements[ 13 ] ) + ',' +\n\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\tepsilon( elements[ 15 ] ) +\n\t\t')';\n\n\t};\n\n\tvar renderObject = function ( object, camera ) {\n\n\t\tif ( object instanceof THREE.CSS3DObject ) {\n\n\t\t\tvar style;\n\n\t\t\tif ( object instanceof THREE.CSS3DSprite ) {\n\n\t\t\t\t// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n\t\t\t\tmatrix.copy( camera.matrixWorldInverse );\n\t\t\t\tmatrix.transpose();\n\t\t\t\tmatrix.copyPosition( object.matrixWorld );\n\t\t\t\tmatrix.scale( object.scale );\n\n\t\t\t\tmatrix.elements[ 3 ] = 0;\n\t\t\t\tmatrix.elements[ 7 ] = 0;\n\t\t\t\tmatrix.elements[ 11 ] = 0;\n\t\t\t\tmatrix.elements[ 15 ] = 1;\n\n\t\t\t\tstyle = getObjectCSSMatrix( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tstyle = getObjectCSSMatrix( object.matrixWorld );\n\n\t\t\t}\n\n\t\t\tvar element = object.element;\n\t\t\tvar cachedStyle = cache.objects[ object.id ];\n\n\t\t\tif ( cachedStyle === undefined || cachedStyle !== style ) {\n\n\t\t\t\telement.style.WebkitTransform = style;\n\t\t\t\telement.style.MozTransform = style;\n\t\t\t\telement.style.oTransform = style;\n\t\t\t\telement.style.transform = style;\n\n\t\t\t\tcache.objects[ object.id ] = style;\n\n\t\t\t}\n\n\t\t\tif ( element.parentNode !== cameraElement ) {\n\n\t\t\t\tcameraElement.appendChild( element );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( object.children[ i ], camera );\n\n\t\t}\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tvar fov = 0.5 / Math.tan( THREE.Math.degToRad( camera.fov * 0.5 ) ) * _height;\n\n\t\tif ( cache.camera.fov !== fov ) {\n\n\t\t\tdomElement.style.WebkitPerspective = fov + \"px\";\n\t\t\tdomElement.style.MozPerspective = fov + \"px\";\n\t\t\tdomElement.style.oPerspective = fov + \"px\";\n\t\t\tdomElement.style.perspective = fov + \"px\";\n\n\t\t\tcache.camera.fov = fov;\n\n\t\t}\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\tvar style = \"translate3d(0,0,\" + fov + \"px)\" + getCameraCSSMatrix( camera.matrixWorldInverse ) +\n\t\t\t\" translate3d(\" + _widthHalf + \"px,\" + _heightHalf + \"px, 0)\";\n\n\t\tif ( cache.camera.style !== style ) {\n\n\t\t\tcameraElement.style.WebkitTransform = style;\n\t\t\tcameraElement.style.MozTransform = style;\n\t\t\tcameraElement.style.oTransform = style;\n\t\t\tcameraElement.style.transform = style;\n\t\t\t\n\t\t\tcache.camera.style = style;\n\n\t\t}\n\n\t\trenderObject( scene, camera );\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/SoftwareRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/SoftwareRenderer.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author ryg / http://farbrausch.de/~fg\n * @author mraleph / http://mrale.ph/\n */\n\nTHREE.SoftwareRenderer = function ( parameters ) {\n\n\tconsole.log( 'THREE.SoftwareRenderer', THREE.REVISION );\n\n\tparameters = parameters || {};\n\n\tvar canvas = document.createElement( 'canvas' );\n\tvar context = canvas.getContext( '2d', {\n\t\talpha: parameters.alpha === true\n\t} );\n\n\tvar shaders = {};\n\n\tvar canvasWidth, canvasHeight;\n\tvar canvasWBlocks, canvasHBlocks;\n\tvar viewportXScale, viewportYScale, viewportZScale;\n\tvar viewportXOffs, viewportYOffs, viewportZOffs;\n\n\tvar clearColor = new THREE.Color( 0x000000 );\n\n\tvar imagedata, data, zbuffer;\n\tvar numBlocks, blockMaxZ, blockFlags;\n\n\tvar BLOCK_ISCLEAR = (1 << 0);\n\tvar BLOCK_NEEDCLEAR = (1 << 1);\n\n\tvar subpixelBits = 4;\n\tvar subpixelBias = (1 << subpixelBits) - 1;\n\tvar blockShift = 3;\n\tvar blockSize = 1 << blockShift;\n\tvar maxZVal = (1 << 24); // Note: You want to size this so you don't get overflows.\n\n\tvar rectx1 = Infinity, recty1 = Infinity;\n\tvar rectx2 = 0, recty2 = 0;\n\n\tvar prevrectx1 = Infinity, prevrecty1 = Infinity;\n\tvar prevrectx2 = 0, prevrecty2 = 0;\n\n\tvar projector = new THREE.Projector();\n\n\tvar vector1 = new THREE.Vector3();\n\tvar vector2 = new THREE.Vector3();\n\tvar vector3 = new THREE.Vector3();\n\n\tthis.domElement = canvas;\n\n\tthis.autoClear = true;\n\n\t// WebGLRenderer compatibility\n\n\tthis.supportsVertexTextures = function () {};\n\tthis.setFaceCulling = function () {};\n\n\tthis.setClearColor = function ( color, alpha ) {\n\n\t\tclearColor.set( color );\n\n\t};\n\n\tthis.setSize = function ( width, height ) {\n\n\t\tcanvasWBlocks = Math.floor( width / blockSize );\n\t\tcanvasHBlocks = Math.floor( height / blockSize );\n\t\tcanvasWidth = canvasWBlocks * blockSize;\n\t\tcanvasHeight = canvasHBlocks * blockSize;\n\n\t\tvar fixScale = 1 << subpixelBits;\n\n\t\tviewportXScale = fixScale * canvasWidth / 2;\n\t\tviewportYScale = -fixScale * canvasHeight / 2;\n\t\tviewportZScale = maxZVal / 2;\n\t\tviewportXOffs = fixScale * canvasWidth / 2 + 0.5;\n\t\tviewportYOffs = fixScale * canvasHeight / 2 + 0.5;\n\t\tviewportZOffs = maxZVal / 2 + 0.5;\n\n\t\tcanvas.width = canvasWidth;\n\t\tcanvas.height = canvasHeight;\n\n\t\tcontext.fillStyle = clearColor.getStyle();\n\t\tcontext.fillRect( 0, 0, canvasWidth, canvasHeight );\n\n\t\timagedata = context.getImageData( 0, 0, canvasWidth, canvasHeight );\n\t\tdata = imagedata.data;\n\n\t\tzbuffer = new Int32Array( data.length / 4 );\n\n\t\tnumBlocks = canvasWBlocks * canvasHBlocks;\n\t\tblockMaxZ = new Int32Array( numBlocks );\n\t\tblockFlags = new Uint8Array( numBlocks );\n\n\t\tfor ( var i = 0, l = zbuffer.length; i < l; i ++ ) {\n\n\t\t\tzbuffer[ i ] = maxZVal;\n\n\t\t}\n\n\t\tfor ( var i = 0; i < numBlocks; i ++ ) {\n\n\t\t\tblockFlags[ i ] = BLOCK_ISCLEAR;\n\n\t\t}\n\n\t};\n\n\tthis.setSize( canvas.width, canvas.height );\n\n\tthis.clear = function () {\n\n\t\trectx1 = Infinity;\n\t\trecty1 = Infinity;\n\t\trectx2 = 0;\n\t\trecty2 = 0;\n\n\t\tfor ( var i = 0; i < numBlocks; i ++ ) {\n\n\t\t\tblockMaxZ[ i ] = maxZVal;\n\t\t\tblockFlags[ i ] = (blockFlags[ i ] & BLOCK_ISCLEAR) ? BLOCK_ISCLEAR : BLOCK_NEEDCLEAR;\n\n\t\t}\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( this.autoClear === true ) this.clear();\n\n\t\tvar renderData = projector.projectScene( scene, camera, false, false );\n\t\tvar elements = renderData.elements;\n\n\t\tfor ( var e = 0, el = elements.length; e < el; e ++ ) {\n\n\t\t\tvar element = elements[ e ];\n\t\t\tvar material = element.material;\n\t\t\tvar shader = getMaterialShader( material );\n\n\t\t\tif ( element instanceof THREE.RenderableFace ) {\n\n\t\t\t\tdrawTriangle(\n\t\t\t\t\telement.v1.positionScreen,\n\t\t\t\t\telement.v2.positionScreen,\n\t\t\t\t\telement.v3.positionScreen,\n\t\t\t\t\tshader, element, material\n\t\t\t\t);\n\n\t\t\t} else if ( element instanceof THREE.RenderableSprite ) {\n\n\t\t\t\tvar scaleX = element.scale.x * 0.5;\n\t\t\t\tvar scaleY = element.scale.y * 0.5;\n\n\t\t\t\tvector1.copy( element );\n\t\t\t\tvector1.x -= scaleX;\n\t\t\t\tvector1.y += scaleY;\n\n\t\t\t\tvector2.copy( element );\n\t\t\t\tvector2.x -= scaleX;\n\t\t\t\tvector2.y -= scaleY;\n\n\t\t\t\tvector3.copy( element );\n\t\t\t\tvector3.x += scaleX;\n\t\t\t\tvector3.y += scaleY;\n\n\t\t\t\tdrawTriangle(\n\t\t\t\t\tvector1, vector2, vector3,\n\t\t\t\t\tshader, element, material\n\t\t\t\t);\n\n\t\t\t\tvector1.copy( element );\n\t\t\t\tvector1.x += scaleX;\n\t\t\t\tvector1.y += scaleY;\n\n\t\t\t\tvector2.copy( element );\n\t\t\t\tvector2.x -= scaleX;\n\t\t\t\tvector2.y -= scaleY;\n\n\t\t\t\tvector3.copy( element );\n\t\t\t\tvector3.x += scaleX;\n\t\t\t\tvector3.y -= scaleY;\n\n\t\t\t\tdrawTriangle(\n\t\t\t\t\tvector1, vector2, vector3,\n\t\t\t\t\tshader, element, material\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfinishClear();\n\n\t\tvar x = Math.min( rectx1, prevrectx1 );\n\t\tvar y = Math.min( recty1, prevrecty1 );\n\t\tvar width = Math.max( rectx2, prevrectx2 ) - x;\n\t\tvar height = Math.max( recty2, prevrecty2 ) - y;\n\n\t\t/*\n\t\t// debug; draw zbuffer\n\n\t\tfor ( var i = 0, l = zbuffer.length; i < l; i++ ) {\n\n\t\t\tvar o = i * 4;\n\t\t\tvar v = (65535 - zbuffer[ i ]) >> 3;\n\t\t\tdata[ o + 0 ] = v;\n\t\t\tdata[ o + 1 ] = v;\n\t\t\tdata[ o + 2 ] = v;\n\t\t\tdata[ o + 3 ] = 255;\n\t\t}\n\t\t*/\n\n\t\tif ( x !== Infinity ) {\n\n\t\t\tcontext.putImageData( imagedata, 0, 0, x, y, width, height );\n\n\t\t}\n\n\t\tprevrectx1 = rectx1; prevrecty1 = recty1;\n\t\tprevrectx2 = rectx2; prevrecty2 = recty2;\n\n\t};\n\n\tfunction getMaterialShader( material ) {\n\n\t\tvar id = material.id;\n\t\tvar shader = shaders[ id ];\n\n\t\tif ( shaders[ id ] === undefined ) {\n\n\t\t\tif ( material instanceof THREE.MeshBasicMaterial ||\n\t\t\t material instanceof THREE.MeshLambertMaterial ||\n\t\t\t material instanceof THREE.MeshPhongMaterial ||\n\t\t\t material instanceof THREE.SpriteMaterial ) {\n\n\t\t\t\tvar string;\n\n\t\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\n\n\t\t\t\t\tstring = [\n\t\t\t\t\t\t'buffer[ offset ] = face.color.r * 255;',\n\t\t\t\t\t\t'buffer[ offset + 1 ] = face.color.g * 255;',\n\t\t\t\t\t\t'buffer[ offset + 2 ] = face.color.b * 255;',\n\t\t\t\t\t\t'buffer[ offset + 3 ] = material.opacity * 255;',\n\t\t\t\t\t].join('\\n');\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstring = [\n\t\t\t\t\t\t'buffer[ offset ] = material.color.r * 255;',\n\t\t\t\t\t\t'buffer[ offset + 1 ] = material.color.g * 255;',\n\t\t\t\t\t\t'buffer[ offset + 2 ] = material.color.b * 255;',\n\t\t\t\t\t\t'buffer[ offset + 3 ] = material.opacity * 255;',\n\t\t\t\t\t].join('\\n');\n\n\t\t\t\t}\n\n\t\t\t\tshader = new Function( 'buffer, offset, u, v, face, material', string );\n\n\t\t\t} else {\n\n\t\t\t\tvar string = [\n\t\t\t\t\t'buffer[ offset ] = u * 255;',\n\t\t\t\t\t'buffer[ offset + 1 ] = v * 255;',\n\t\t\t\t\t'buffer[ offset + 2 ] = 0;',\n\t\t\t\t\t'buffer[ offset + 3 ] = 255;'\n\t\t\t\t].join('\\n');\n\n\t\t\t\tshader = new Function( 'buffer, offset, u, v', string );\n\n\t\t\t}\n\n\t\t\tshaders[ id ] = shader;\n\n\t\t}\n\n\t\treturn shader;\n\n\t}\n\n\tfunction clearRectangle( x1, y1, x2, y2 ) {\n\n\t\tvar xmin = Math.max( Math.min( x1, x2 ), 0 );\n\t\tvar xmax = Math.min( Math.max( x1, x2 ), canvasWidth );\n\t\tvar ymin = Math.max( Math.min( y1, y2 ), 0 );\n\t\tvar ymax = Math.min( Math.max( y1, y2 ), canvasHeight );\n\n\t\tvar offset = ( xmin + ymin * canvasWidth ) * 4 + 3;\n\t\tvar linestep = ( canvasWidth - ( xmax - xmin ) ) * 4;\n\n\t\tfor ( var y = ymin; y < ymax; y ++ ) {\n\n\t\t\tfor ( var x = xmin; x < xmax; x ++ ) {\n\n\t\t\t\tdata[ offset += 4 ] = 0;\n\n\t\t\t}\n\n\t\t\toffset += linestep;\n\n\t\t}\n\n\t}\n\n\tfunction drawTriangle( v1, v2, v3, shader, face, material ) {\n\n\t\t// TODO: Implement per-pixel z-clipping\n\n\t\tif ( v1.z < -1 || v1.z > 1 || v2.z < -1 || v2.z > 1 || v3.z < -1 || v3.z > 1 ) return;\n\n\t\t// https://gist.github.com/2486101\n\t\t// explanation: http://pouet.net/topic.php?which=8760&page=1\n\n\t\t// 28.4 fixed-point coordinates\n\n\t\tvar x1 = (v1.x * viewportXScale + viewportXOffs) | 0;\n\t\tvar x2 = (v2.x * viewportXScale + viewportXOffs) | 0;\n\t\tvar x3 = (v3.x * viewportXScale + viewportXOffs) | 0;\n\n\t\tvar y1 = (v1.y * viewportYScale + viewportYOffs) | 0;\n\t\tvar y2 = (v2.y * viewportYScale + viewportYOffs) | 0;\n\t\tvar y3 = (v3.y * viewportYScale + viewportYOffs) | 0;\n\n\t\t// Z values (.28 fixed-point)\n\n\t\tvar z1 = (v1.z * viewportZScale + viewportZOffs) | 0;\n\t\tvar z2 = (v2.z * viewportZScale + viewportZOffs) | 0;\n\t\tvar z3 = (v3.z * viewportZScale + viewportZOffs) | 0;\n\n\t\t// Deltas\n\n\t\tvar dx12 = x1 - x2, dy12 = y2 - y1;\n\t\tvar dx23 = x2 - x3, dy23 = y3 - y2;\n\t\tvar dx31 = x3 - x1, dy31 = y1 - y3;\n\n\t\t// Bounding rectangle\n\n\t\tvar minx = Math.max( ( Math.min( x1, x2, x3 ) + subpixelBias ) >> subpixelBits, 0 );\n\t\tvar maxx = Math.min( ( Math.max( x1, x2, x3 ) + subpixelBias ) >> subpixelBits, canvasWidth );\n\t\tvar miny = Math.max( ( Math.min( y1, y2, y3 ) + subpixelBias ) >> subpixelBits, 0 );\n\t\tvar maxy = Math.min( ( Math.max( y1, y2, y3 ) + subpixelBias ) >> subpixelBits, canvasHeight );\n\n\t\trectx1 = Math.min( minx, rectx1 );\n\t\trectx2 = Math.max( maxx, rectx2 );\n\t\trecty1 = Math.min( miny, recty1 );\n\t\trecty2 = Math.max( maxy, recty2 );\n\n\t\t// Block size, standard 8x8 (must be power of two)\n\n\t\tvar q = blockSize;\n\n\t\t// Start in corner of 8x8 block\n\n\t\tminx &= ~(q - 1);\n\t\tminy &= ~(q - 1);\n\n\t\t// Constant part of half-edge functions\n\n\t\tvar c1 = dy12 * ((minx << subpixelBits) - x1) + dx12 * ((miny << subpixelBits) - y1);\n\t\tvar c2 = dy23 * ((minx << subpixelBits) - x2) + dx23 * ((miny << subpixelBits) - y2);\n\t\tvar c3 = dy31 * ((minx << subpixelBits) - x3) + dx31 * ((miny << subpixelBits) - y3);\n\n\t\t// Correct for fill convention\n\n\t\tif ( dy12 > 0 || ( dy12 == 0 && dx12 > 0 ) ) c1 ++;\n\t\tif ( dy23 > 0 || ( dy23 == 0 && dx23 > 0 ) ) c2 ++;\n\t\tif ( dy31 > 0 || ( dy31 == 0 && dx31 > 0 ) ) c3 ++;\n\n\t\t// Note this doesn't kill subpixel precision, but only because we test for >=0 (not >0).\n\t\t// It's a bit subtle. :)\n\t\tc1 = (c1 - 1) >> subpixelBits;\n\t\tc2 = (c2 - 1) >> subpixelBits;\n\t\tc3 = (c3 - 1) >> subpixelBits;\n\n\t\t// Z interpolation setup\n\n\t\tvar dz12 = z1 - z2, dz31 = z3 - z1;\n\t\tvar invDet = 1.0 / (dx12*dy31 - dx31*dy12);\n\t\tvar dzdx = (invDet * (dz12*dy31 - dz31*dy12)); // dz per one subpixel step in x\n\t\tvar dzdy = (invDet * (dz12*dx31 - dx12*dz31)); // dz per one subpixel step in y\n\n\t\t// Z at top/left corner of rast area\n\n\t\tvar cz = ( z1 + ((minx << subpixelBits) - x1) * dzdx + ((miny << subpixelBits) - y1) * dzdy ) | 0;\n\n\t\t// Z pixel steps\n\n\t\tvar zfixscale = (1 << subpixelBits);\n\t\tdzdx = (dzdx * zfixscale) | 0;\n\t\tdzdy = (dzdy * zfixscale) | 0;\n\n\t\t// Set up min/max corners\n\t\tvar qm1 = q - 1; // for convenience\n\t\tvar nmin1 = 0, nmax1 = 0;\n\t\tvar nmin2 = 0, nmax2 = 0;\n\t\tvar nmin3 = 0, nmax3 = 0;\n\t\tvar nminz = 0, nmaxz = 0;\n\t\tif (dx12 >= 0) nmax1 -= qm1*dx12; else nmin1 -= qm1*dx12;\n\t\tif (dy12 >= 0) nmax1 -= qm1*dy12; else nmin1 -= qm1*dy12;\n\t\tif (dx23 >= 0) nmax2 -= qm1*dx23; else nmin2 -= qm1*dx23;\n\t\tif (dy23 >= 0) nmax2 -= qm1*dy23; else nmin2 -= qm1*dy23;\n\t\tif (dx31 >= 0) nmax3 -= qm1*dx31; else nmin3 -= qm1*dx31;\n\t\tif (dy31 >= 0) nmax3 -= qm1*dy31; else nmin3 -= qm1*dy31;\n\t\tif (dzdx >= 0) nmaxz += qm1*dzdx; else nminz += qm1*dzdx;\n\t\tif (dzdy >= 0) nmaxz += qm1*dzdy; else nminz += qm1*dzdy;\n\n\t\t// Loop through blocks\n\t\tvar linestep = canvasWidth - q;\n\t\tvar scale = 1.0 / (c1 + c2 + c3);\n\n\t\tvar cb1 = c1;\n\t\tvar cb2 = c2;\n\t\tvar cb3 = c3;\n\t\tvar cbz = cz;\n\t\tvar qstep = -q;\n\t\tvar e1x = qstep * dy12;\n\t\tvar e2x = qstep * dy23;\n\t\tvar e3x = qstep * dy31;\n\t\tvar ezx = qstep * dzdx;\n\t\tvar x0 = minx;\n\n\t\tfor ( var y0 = miny; y0 < maxy; y0 += q ) {\n\n\t\t\t// New block line - keep hunting for tri outer edge in old block line dir\n\t\t\twhile ( x0 >= minx && x0 < maxx && cb1 >= nmax1 && cb2 >= nmax2 && cb3 >= nmax3 ) {\n\n\t\t\t\tx0 += qstep;\n\t\t\t\tcb1 += e1x;\n\t\t\t\tcb2 += e2x;\n\t\t\t\tcb3 += e3x;\n\t\t\t\tcbz += ezx;\n\n\t\t\t}\n\n\t\t\t// Okay, we're now in a block we know is outside. Reverse direction and go into main loop.\n\t\t\tqstep = -qstep;\n\t\t\te1x = -e1x;\n\t\t\te2x = -e2x;\n\t\t\te3x = -e3x;\n\t\t\tezx = -ezx;\n\n\t\t\twhile ( 1 ) {\n\n\t\t\t\t// Step everything\n\t\t\t\tx0 += qstep;\n\t\t\t\tcb1 += e1x;\n\t\t\t\tcb2 += e2x;\n\t\t\t\tcb3 += e3x;\n\t\t\t\tcbz += ezx;\n\n\t\t\t\t// We're done with this block line when at least one edge completely out\n\t\t\t\t// If an edge function is too small and decreasing in the current traversal\n\t\t\t\t// dir, we're done with this line.\n\t\t\t\tif (x0 < minx || x0 >= maxx) break;\n\t\t\t\tif (cb1 < nmax1) if (e1x < 0) break; else continue;\n\t\t\t\tif (cb2 < nmax2) if (e2x < 0) break; else continue;\n\t\t\t\tif (cb3 < nmax3) if (e3x < 0) break; else continue;\n\n\t\t\t\t// We can skip this block if it's already fully covered\n\t\t\t\tvar blockX = x0 >> blockShift;\n\t\t\t\tvar blockY = y0 >> blockShift;\n\t\t\t\tvar blockId = blockX + blockY * canvasWBlocks;\n\t\t\t\tvar minz = cbz + nminz;\n\n\t\t\t\t// farthest point in block closer than closest point in our tri?\n\t\t\t\tif ( blockMaxZ[ blockId ] < minz ) continue;\n\n\t\t\t\t// Need to do a deferred clear?\n\t\t\t\tvar bflags = blockFlags[ blockId ];\n\t\t\t\tif ( bflags & BLOCK_NEEDCLEAR) clearBlock( blockX, blockY );\n\t\t\t\tblockFlags[ blockId ] = bflags & ~( BLOCK_ISCLEAR | BLOCK_NEEDCLEAR );\n\n\t\t\t\t// Offset at top-left corner\n\t\t\t\tvar offset = x0 + y0 * canvasWidth;\n\n\t\t\t\t// Accept whole block when fully covered\n\t\t\t\tif ( cb1 >= nmin1 && cb2 >= nmin2 && cb3 >= nmin3 ) {\n\n\t\t\t\t\tvar maxz = cbz + nmaxz;\n\t\t\t\t\tblockMaxZ[ blockId ] = Math.min( blockMaxZ[ blockId ], maxz );\n\n\t\t\t\t\tvar cy1 = cb1;\n\t\t\t\t\tvar cy2 = cb2;\n\t\t\t\t\tvar cyz = cbz;\n\n\t\t\t\t\tfor ( var iy = 0; iy < q; iy ++ ) {\n\n\t\t\t\t\t\tvar cx1 = cy1;\n\t\t\t\t\t\tvar cx2 = cy2;\n\t\t\t\t\t\tvar cxz = cyz;\n\n\t\t\t\t\t\tfor ( var ix = 0; ix < q; ix ++ ) {\n\n\t\t\t\t\t\t\tvar z = cxz;\n\n\t\t\t\t\t\t\tif ( z < zbuffer[ offset ] ) {\n\t\t\t\t\t\t\t\tzbuffer[ offset ] = z;\n\t\t\t\t\t\t\t\tvar u = cx1 * scale;\n\t\t\t\t\t\t\t\tvar v = cx2 * scale;\n\t\t\t\t\t\t\t\tshader( data, offset * 4, u, v, face, material );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcx1 += dy12;\n\t\t\t\t\t\t\tcx2 += dy23;\n\t\t\t\t\t\t\tcxz += dzdx;\n\t\t\t\t\t\t\toffset++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcy1 += dx12;\n\t\t\t\t\t\tcy2 += dx23;\n\t\t\t\t\t\tcyz += dzdy;\n\t\t\t\t\t\toffset += linestep;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else { // Partially covered block\n\n\t\t\t\t\tvar cy1 = cb1;\n\t\t\t\t\tvar cy2 = cb2;\n\t\t\t\t\tvar cy3 = cb3;\n\t\t\t\t\tvar cyz = cbz;\n\n\t\t\t\t\tfor ( var iy = 0; iy < q; iy ++ ) {\n\n\t\t\t\t\t\tvar cx1 = cy1;\n\t\t\t\t\t\tvar cx2 = cy2;\n\t\t\t\t\t\tvar cx3 = cy3;\n\t\t\t\t\t\tvar cxz = cyz;\n\n\t\t\t\t\t\tfor ( var ix = 0; ix < q; ix ++ ) {\n\n\t\t\t\t\t\t\tif ( ( cx1 | cx2 | cx3 ) >= 0 ) {\n\n\t\t\t\t\t\t\t\tvar z = cxz;\n\n\t\t\t\t\t\t\t\tif ( z < zbuffer[ offset ] ) {\n\t\t\t\t\t\t\t\t\tvar u = cx1 * scale;\n\t\t\t\t\t\t\t\t\tvar v = cx2 * scale;\n\n\t\t\t\t\t\t\t\t\tzbuffer[ offset ] = z;\n\t\t\t\t\t\t\t\t\tshader( data, offset * 4, u, v, face, material );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcx1 += dy12;\n\t\t\t\t\t\t\tcx2 += dy23;\n\t\t\t\t\t\t\tcx3 += dy31;\n\t\t\t\t\t\t\tcxz += dzdx;\n\t\t\t\t\t\t\toffset++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcy1 += dx12;\n\t\t\t\t\t\tcy2 += dx23;\n\t\t\t\t\t\tcy3 += dx31;\n\t\t\t\t\t\tcyz += dzdy;\n\t\t\t\t\t\toffset += linestep;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Advance to next row of blocks\n\t\t\tcb1 += q*dx12;\n\t\t\tcb2 += q*dx23;\n\t\t\tcb3 += q*dx31;\n\t\t\tcbz += q*dzdy;\n\t\t}\n\n\t}\n\n\tfunction clearBlock( blockX, blockY ) {\n\n\t\tvar zoffset = blockX * blockSize + blockY * blockSize * canvasWidth;\n\t\tvar poffset = zoffset * 4;\n\n\t\tvar zlinestep = canvasWidth - blockSize;\n\t\tvar plinestep = zlinestep * 4;\n\n\t\tfor ( var y = 0; y < blockSize; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < blockSize; x ++ ) {\n\n\t\t\t\tzbuffer[ zoffset ++ ] = maxZVal;\n\n\t\t\t\tdata[ poffset ++ ] = clearColor.r * 255 | 0;\n\t\t\t\tdata[ poffset ++ ] = clearColor.g * 255 | 0;\n\t\t\t\tdata[ poffset ++ ] = clearColor.b * 255 | 0;\n\t\t\t\tdata[ poffset ++ ] = 255;\n\n\t\t\t}\n\n\t\t\tzoffset += zlinestep;\n\t\t\tpoffset += plinestep;\n\n\t\t}\n\n\t}\n\n\tfunction finishClear( ) {\n\n\t\tvar block = 0;\n\n\t\tfor ( var y = 0; y < canvasHBlocks; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < canvasWBlocks; x ++ ) {\n\n\t\t\t\tif ( blockFlags[ block ] & BLOCK_NEEDCLEAR ) {\n\n\t\t\t\t\tclearBlock( x, y );\n\t\t\t\t\tblockFlags[ block ] = BLOCK_ISCLEAR;\n\n\t\t\t\t}\n\n\t\t\t\tblock ++;\n\t\t\t}\n\n\t\t}\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/WebGLRenderer3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/WebGLRenderer3.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n *\n * parameters = {\n * canvas: canvas,\n * contextAttributes: {\n * alpha: false,\n * depth: true,\n * stencil: false,\n * antialias: true,\n * premultipliedAlpha: true,\n * preserveDrawingBuffer: false\n * }\n * }\n *\n */\n\nTHREE.WebGLRenderer3 = function ( parameters ) {\n\n\tconsole.log( 'THREE.WebGLRenderer3', THREE.REVISION );\n\n\tparameters = parameters || {};\n\n\tvar scope = this;\n\n\tvar canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' );\n\n\tvar devicePixelRatio = parameters.devicePixelRatio !== undefined\n\t\t\t\t? parameters.devicePixelRatio\n\t\t\t\t: self.devicePixelRatio !== undefined\n\t\t\t\t\t? self.devicePixelRatio\n\t\t\t\t\t: 1;\n\n\tvar gl;\n\n\ttry {\n\n\t\tvar attributes = parameters.contextAttributes || {};\n\t\t\n\t\tif ( attributes.alpha === undefined ) attributes.alpha = false;\n\n\t\tgl = canvas.getContext( 'webgl', attributes ) || canvas.getContext( 'experimental-webgl', attributes );\n\n\t\tif ( gl === null ) {\n\n\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t}\n\n\t} catch ( exception ) {\n\n\t\tconsole.error( exception );\n\n\t}\n\n\tvar precision = 'highp';\n\tvar extensions = {};\n\n\tif ( gl !== null ) {\n\n\t\textensions.element_index_uint = gl.getExtension( 'OES_element_index_uint' );\n\t\textensions.texture_float = gl.getExtension( 'OES_texture_float' );\n\t\textensions.texture_float_linear = gl.getExtension( 'OES_texture_float_linear' );\n\t\textensions.standard_derivatives = gl.getExtension( 'OES_standard_derivatives' );\n\t\textensions.texture_filter_anisotropic = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\textensions.compressed_texture_s3tc = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\n\t\tgl.clearColor( 0, 0, 0, 1 );\n\t\tgl.clearDepth( 1 );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.enable( gl.DEPTH_TEST );\n\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\tgl.enable( gl.CULL_FACE );\n\t\tgl.frontFace( gl.CCW );\n\t\tgl.cullFace( gl.BACK );\n\n\t\tgl.enable( gl.BLEND );\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t}\n\n\tvar clearColor = new THREE.Color( 0x000000 );\n\tvar clearAlpha = 0;\n\n\t//\n\n\tvar vector3 = new THREE.Vector3();\n\tvar frustum = new THREE.Frustum();\n\tvar normalMatrix = new THREE.Matrix3();\n\tvar modelViewMatrix = new THREE.Matrix4();\n\tvar cameraViewProjectionMatrix = new THREE.Matrix4();\n\n\t// buffers\n\n\tvar buffers = {};\n\n\tvar getBuffer = function ( geometry, material ) {\n\n\t\tvar hash = geometry.id.toString() + '+' + material.id.toString();\n\n\t\tif ( buffers[ hash ] !== undefined ) {\n\n\t\t\treturn buffers[ hash ];\n\n\t\t}\n\n\t\tvar vertices = geometry.vertices;\n\t\tvar faces = geometry.faces;\n\n\t\t//\n\n\t\tvar positions = [];\n\t\tvar addPosition = function ( position ) {\n\n\t\t\tpositions.push( position.x, position.y, position.z );\n\n\t\t}\n\n\t\tvar normals = [];\n\t\tvar addNormal = function ( normal ) {\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t}\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\t\t\tvar vertexNormals = face.vertexNormals.length > 0;\n\n\t\t\taddPosition( vertices[ face.a ] );\n\t\t\taddPosition( vertices[ face.b ] );\n\t\t\taddPosition( vertices[ face.c ] );\n\n\t\t\tif ( vertexNormals === true ) {\n\n\t\t\t\taddNormal( face.vertexNormals[ 0 ] );\n\t\t\t\taddNormal( face.vertexNormals[ 1 ] );\n\t\t\t\taddNormal( face.vertexNormals[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\taddNormal( face.normal );\n\t\t\t\taddNormal( face.normal );\n\t\t\t\taddNormal( face.normal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar buffer = {\n\t\t\tpositions: gl.createBuffer(),\n\t\t\tnormals: gl.createBuffer(),\n\t\t\tcount: positions.length / 3\n\t\t};\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer.positions );\n\t\tgl.bufferData( gl.ARRAY_BUFFER, new Float32Array( positions ), gl.STATIC_DRAW );\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer.normals );\n\t\tgl.bufferData( gl.ARRAY_BUFFER, new Float32Array( normals ), gl.STATIC_DRAW );\n\n\t\tbuffers[ hash ] = buffer;\n\n\t\tscope.info.memory.geometries ++;\n\n\t\treturn buffer;\n\n\t};\n\n\t// programs\n\n\tvar programs = {};\n\tvar programsCache = {};\n\n\tvar getProgram = function ( material ) {\n\n\t\tif ( programs[ material.id ] !== undefined ) {\n\n\t\t\treturn programs[ material.id ];\n\n\t\t}\n\n\t\tvar vertexShader = [\n\t\t\t'precision ' + precision + ' float;',\n\t\t\t\"precision \" + precision + \" int;\",\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t''\n\t\t].join( '\\n' );\n\n\t\tvar fragmentShader = [\n\t\t\t'precision ' + precision + ' float;',\n\t\t\t\"precision \" + precision + \" int;\",\n\t\t\t''\n\t\t].join( '\\n' );\n\n\t\tif ( material instanceof THREE.ShaderMaterial ) {\n\n\t\t\tvertexShader += material.vertexShader;\n\t\t\tfragmentShader += material.fragmentShader;\n\n\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\n\n\t\t\tvertexShader += [\n\t\t\t\t'varying vec3 vNormal;',\n\t\t\t\t'void main() {',\n\t\t\t\t'\tvNormal = normalize( normalMatrix * normal );',\n\t\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\t\t\t\t'}'\n\t\t\t].join( '\\n' );\n\n\t\t\tfragmentShader += [\n\t\t\t\t'varying vec3 vNormal;',\n\t\t\t\t'uniform float opacity;',\n\t\t\t\t'void main() {',\n\t\t\t\t'\tgl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );',\n\t\t\t\t'}'\n\t\t\t].join( '\\n' );\n\n\t\t} else {\n\n\t\t\tvertexShader += [\n\t\t\t\t'void main() {',\n\t\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\t\t\t\t'}'\n\t\t\t].join( '\\n' );\n\n\t\t\tfragmentShader += [\n\t\t\t\t'void main() {',\n\t\t\t\t'\tgl_FragColor = vec4( 1.0, 0, 0, 1.0 );',\n\t\t\t\t'}'\n\t\t\t].join( '\\n' );\n\n\t\t}\n\n\t\tvar program;\n\t\tvar code = vertexShader + fragmentShader;\n\n\t\tif ( programsCache[ code ] !== undefined ) {\n\n\t\t\tprogram = programsCache[ code ];\n\t\t\tprograms[ material.id ] = program;\n\n\t\t} else {\n\n\t\t\tprogram = gl.createProgram();\n\n\t\t\tgl.attachShader( program, createShader( gl.VERTEX_SHADER, vertexShader ) );\n\t\t\tgl.attachShader( program, createShader( gl.FRAGMENT_SHADER, fragmentShader ) );\n\t\t\tgl.linkProgram( program );\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === true ) {\n\n\t\t\t\tprogramsCache[ code ] = program;\n\t\t\t\tprograms[ material.id ] = program;\n\n\t\t\t\tscope.info.memory.programs ++;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'Program Info Log: ' + gl.getProgramInfoLog( program ) );\n\t\t\t\tconsole.error( 'VALIDATE_STATUS: ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) );\n\t\t\t\tconsole.error( 'GL_ERROR: ' + gl.getError() );\n\n\t\t\t\t// fallback\n\n\t\t\t\tprogram = getProgram( new THREE.MeshBasicMaterial() );\n\t\t\t\tprograms[ material.id ] = program;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn program;\n\n\t};\n\n\tvar createShader = function ( type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === true ) {\n\n\t\t\t// console.log( string );\n\n\t\t} else {\n\n\t\t\tconsole.error( gl.getShaderInfoLog( shader ), string );\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn shader;\n\n\t};\n\n\tthis.info = {\n\n\t\tmemory: {\n\n\t\t\tprograms: 0,\n\t\t\tgeometries: 0,\n\t\t\ttextures: 0\n\n\t\t},\n\n\t\trender: {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t}\n\n\t};\n\n\tthis.domElement = canvas;\n\tthis.extensions = extensions;\n\n\tthis.autoClear = true; // TODO: Make private\n\n\tthis.setClearColor = function ( color, alpha ) {\n\n\t\tclearColor.set( color );\n\t\tclearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\tgl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tcanvas.width = width * devicePixelRatio;\n\t\tcanvas.height = height * devicePixelRatio;\n\n\t\tif ( devicePixelRatio !== 1 && updateStyle !== false ) {\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tgl.viewport( 0, 0, canvas.width, canvas.height );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tvar bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= gl.COLOR_BUFFER_BIT;\n\t\tif ( depth === undefined || depth ) bits |= gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil === undefined || stencil ) bits |= gl.STENCIL_BUFFER_BIT;\n\n\t\tgl.clear( bits );\n\n\t};\n\n\t// blending\n\n\tvar currentBlending = null;\n\n\tvar setBlending = function ( blending ) {\n\n\t\tif ( blending !== currentBlending ) {\n\n\t\t\tif ( blending === THREE.NoBlending ) {\n\n\t\t\t\tgl.disable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tgl.enable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tcurrentBlending = blending;\n\n\t\t}\n\n\t};\n\n\t// depthTest\n\n\tvar currentDepthTest = null;\n\n\tvar setDepthTest = function ( value ) {\n\n\t\tif ( value !== currentDepthTest ) {\n\n\t\t\tvalue === true ? gl.enable( gl.DEPTH_TEST ) : gl.disable( gl.DEPTH_TEST );\n\t\t\tcurrentDepthTest = value;\n\n\t\t}\n\n\t};\n\n\t// depthWrite\n\n\tvar currentDepthWrite = null;\n\n\tvar setDepthWrite = function ( value ) {\n\n\t\tif ( value !== currentDepthWrite ) {\n\n\t\t\tgl.depthMask( value );\n\t\t\tcurrentDepthWrite = value;\n\n\t\t}\n\n\t};\n\n\tvar objectsOpaque = [];\n\tvar objectsTransparent = [];\n\n\tvar projectObject = function ( object ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tif ( object instanceof THREE.Mesh && frustum.intersectsObject( object ) === true ) {\n\n\t\t\t// TODO: Do not polute scene graph with .z\n\n\t\t\tif ( object.renderDepth !== null ) {\n\n\t\t\t\tobject.z = object.renderDepth;\n\n\t\t\t} else {\n\n\t\t\t\tvector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\tvector3.applyProjection( cameraViewProjectionMatrix );\n\n\t\t\t\tobject.z = vector3.z;\n\n\t\t\t}\n\n\t\t\tif ( object.material.transparent === true ) {\n\n\t\t\t\tobjectsTransparent.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsOpaque.push( object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( object.children[ i ] );\n\n\t\t}\n\n\t};\n\n\tvar sortOpaque = function ( a, b ) {\n\n\t\treturn a.z - b.z;\n\n\t};\n\n\tvar sortTransparent = function ( a, b ) {\n\n\t\treturn a.z !== b.z ? b.z - a.z : b.id - a.id;\n\n\t};\n\n\tvar currentBuffer, currentMaterial, currentProgram;\n\tvar locations = {};\n\n\tvar renderObject = function ( object, camera ) {\n\n\t\tvar buffer = getBuffer( object.geometry, object.material );\n\n\t\tvar material = object.material;\n\n\t\tif ( material !== currentMaterial ) {\n\n\t\t\tvar program = getProgram( object.material );\n\n\t\t\tif ( program !== currentProgram ) {\n\n\t\t\t\tgl.useProgram( program );\n\n\t\t\t\tlocations.modelViewMatrix = gl.getUniformLocation( program, 'modelViewMatrix' );\n\t\t\t\tlocations.normalMatrix = gl.getUniformLocation( program, 'normalMatrix' );\n\t\t\t\tlocations.projectionMatrix = gl.getUniformLocation( program, 'projectionMatrix' );\n\n\t\t\t\tlocations.position = gl.getAttribLocation( program, 'position' );\n\t\t\t\tlocations.normal = gl.getAttribLocation( program, 'normal' );\n\n\t\t\t\tgl.uniformMatrix4fv( locations.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\t\tcurrentProgram = program;\n\n\t\t\t}\n\n\t\t\tif ( material instanceof THREE.MeshNormalMaterial ) {\n\n\t\t\t\tgl.uniform1f( gl.getUniformLocation( program, 'opacity' ), material.opacity );\n\n\t\t\t} else if ( material instanceof THREE.ShaderMaterial ) {\n\n\t\t\t\tvar uniforms = material.uniforms;\n\n\t\t\t\tfor ( var uniform in uniforms ) {\n\n\t\t\t\t\tvar location = gl.getUniformLocation( program, uniform );\n\n\t\t\t\t\tvar type = uniforms[ uniform ].type;\n\t\t\t\t\tvar value = uniforms[ uniform ].value;\n\n\t\t\t\t\tif ( type === \"i\" ) { // single integer\n\n\t\t\t\t\t\tgl.uniform1i( location, value );\n\n\t\t\t\t\t} else if ( type === \"f\" ) { // single float\n\n\t\t\t\t\t\tgl.uniform1f( location, value );\n\n\t\t\t\t\t} else if ( type === \"v2\" ) { // single THREE.Vector2\n\n\t\t\t\t\t\tgl.uniform2f( location, value.x, value.y );\n\n\t\t\t\t\t} else if ( type === \"v3\" ) { // single THREE.Vector3\n\n\t\t\t\t\t\tgl.uniform3f( location, value.x, value.y, value.z );\n\n\t\t\t\t\t} else if ( type === \"v4\" ) { // single THREE.Vector4\n\n\t\t\t\t\t\tgl.uniform4f( location, value.x, value.y, value.z, value.w );\n\n\t\t\t\t\t} else if ( type === \"c\" ) { // single THREE.Color\n\n\t\t\t\t\t\tgl.uniform3f( location, value.r, value.g, value.b );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcurrentMaterial = material;\n\n\t\t}\n\n\t\tif ( buffer !== currentBuffer ) {\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer.positions );\n\t\t\tgl.enableVertexAttribArray( locations.position );\n\t\t\tgl.vertexAttribPointer( locations.position, 3, gl.FLOAT, false, 0, 0 );\n\n\t\t\tif ( locations.normal >= 0 ) {\n\n\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer.normals );\n\t\t\t\tgl.enableVertexAttribArray( locations.normal );\n\t\t\t\tgl.vertexAttribPointer( locations.normal, 3, gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tcurrentBuffer = buffer;\n\n\t\t}\n\n\t\tmodelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tnormalMatrix.getNormalMatrix( modelViewMatrix );\n\n\t\tgl.uniformMatrix4fv( locations.modelViewMatrix, false, modelViewMatrix.elements );\n\t\tgl.uniformMatrix3fv( locations.normalMatrix, false, normalMatrix.elements );\n\n\t\tgl.drawArrays( gl.TRIANGLES, 0, buffer.count );\n\n\t\tscope.info.render.calls ++;\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( this.autoClear === true ) this.clear();\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\tcameraViewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tfrustum.setFromMatrix( cameraViewProjectionMatrix );\n\n\t\tobjectsOpaque.length = 0;\n\t\tobjectsTransparent.length = 0;\n\n\t\tscope.info.render.calls = 0;\n\n\t\tcurrentBuffer = undefined;\n\t\tcurrentMaterial = undefined;\n\t\tcurrentProgram = undefined;\n\n\t\tprojectObject( scene );\n\n\t\tif ( objectsOpaque.length > 0 ) {\n\n\t\t\tobjectsOpaque.sort( sortOpaque );\n\n\t\t\tsetBlending( THREE.NoBlending );\n\n\t\t\tfor ( var i = 0, l = objectsOpaque.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( objectsOpaque[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsTransparent.length > 0 ) {\n\n\t\t\tobjectsTransparent.sort( sortTransparent );\n\n\t\t\tsetBlending( THREE.NormalBlending );\n\n\t\t\tfor ( var i = 0, l = objectsTransparent.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( objectsTransparent[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/WebGLDeferredRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/WebGLDeferredRenderer.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author MPanknin / http://www.redplant.de/\n */\n\nTHREE.WebGLDeferredRenderer = function ( parameters ) {\n\n\tvar _this = this;\n\n\tvar fullWidth = parameters.width !== undefined ? parameters.width : 800;\n\tvar fullHeight = parameters.height !== undefined ? parameters.height : 600;\n\tvar currentScale = parameters.scale !== undefined ? parameters.scale : 1;\n\n\tvar scaledWidth = Math.floor( currentScale * fullWidth );\n\tvar scaledHeight = Math.floor( currentScale * fullHeight );\n\n\tvar brightness = parameters.brightness !== undefined ? parameters.brightness : 1;\n\tvar tonemapping = parameters.tonemapping !== undefined ? parameters.tonemapping : THREE.SimpleOperator;\n\tvar antialias = parameters.antialias !== undefined ? parameters.antialias : false;\n\n\tthis.renderer = parameters.renderer;\n\n\tif ( this.renderer === undefined ) {\n\n\t\tthis.renderer = new THREE.WebGLRenderer( { antialias: false } );\n\t\tthis.renderer.setSize( fullWidth, fullHeight );\n\t\tthis.renderer.setClearColor( 0x000000, 0 );\n\n\t\tthis.renderer.autoClear = false;\n\n\t}\n\n\tthis.domElement = this.renderer.domElement;\n\n\t//\n\n\tvar gl = this.renderer.context;\n\n\t//\n\n\tvar currentCamera = null;\n\tvar projectionMatrixInverse = new THREE.Matrix4();\n\n\tvar positionVS = new THREE.Vector3();\n\tvar directionVS = new THREE.Vector3();\n\tvar tempVS = new THREE.Vector3();\n\n\tvar rightVS = new THREE.Vector3();\n\tvar normalVS = new THREE.Vector3();\n\tvar upVS = new THREE.Vector3();\n\n\t//\n\n\tvar geometryLightSphere = new THREE.SphereGeometry( 1, 16, 8 );\n\tvar geometryLightPlane = new THREE.PlaneGeometry( 2, 2 );\n\n\tvar black = new THREE.Color( 0x000000 );\n\n\tvar colorShader = THREE.ShaderDeferred[ \"color\" ];\n\tvar normalDepthShader = THREE.ShaderDeferred[ \"normalDepth\" ];\n\n\t//\n\n\tvar emissiveLightShader = THREE.ShaderDeferred[ \"emissiveLight\" ];\n\tvar pointLightShader = THREE.ShaderDeferred[ \"pointLight\" ];\n\tvar spotLightShader = THREE.ShaderDeferred[ \"spotLight\" ];\n\tvar directionalLightShader = THREE.ShaderDeferred[ \"directionalLight\" ];\n\tvar hemisphereLightShader = THREE.ShaderDeferred[ \"hemisphereLight\" ];\n\tvar areaLightShader = THREE.ShaderDeferred[ \"areaLight\" ];\n\n\tvar compositeShader = THREE.ShaderDeferred[ \"composite\" ];\n\n\t//\n\n\tvar compColor, compNormal, compDepth, compLight, compFinal;\n\tvar passColor, passNormal, passDepth, passLightFullscreen, passLightProxy, compositePass;\n\n\tvar effectFXAA;\n\n\t//\n\n\tvar lightSceneFullscreen, lightSceneProxy;\n\n\t//\n\n\tvar resizableMaterials = [];\n\n\t//\n\n\tvar invisibleMaterial = new THREE.ShaderMaterial();\n\tinvisibleMaterial.visible = false;\n\n\n\tvar defaultNormalDepthMaterial = new THREE.ShaderMaterial( {\n\n\t\tuniforms: THREE.UniformsUtils.clone( normalDepthShader.uniforms ),\n\t\tvertexShader: normalDepthShader.vertexShader,\n\t\tfragmentShader: normalDepthShader.fragmentShader,\n\t\tblending:\t\tTHREE.NoBlending\n\n\t} );\n\n\t//\n\n\tvar initDeferredMaterials = function ( object ) {\n\n\t\tif ( object.material instanceof THREE.MeshFaceMaterial ) {\n\n\t\t\tvar colorMaterials = [];\n\t\t\tvar normalDepthMaterials = [];\n\n\t\t\tvar materials = object.material.materials;\n\n\t\t\tfor ( var i = 0, il = materials.length; i < il; i ++ ) {\n\n\t\t\t\tvar deferredMaterials = createDeferredMaterials( materials[ i ] );\n\n\t\t\t\tif ( deferredMaterials.transparent ) {\n\n\t\t\t\t\tcolorMaterials.push( invisibleMaterial );\n\t\t\t\t\tnormalDepthMaterials.push( invisibleMaterial );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcolorMaterials.push( deferredMaterials.colorMaterial );\n\t\t\t\t\tnormalDepthMaterials.push( deferredMaterials.normalDepthMaterial );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobject.userData.colorMaterial = new THREE.MeshFaceMaterial( colorMaterials );\n\t\t\tobject.userData.normalDepthMaterial = new THREE.MeshFaceMaterial( normalDepthMaterials );\n\n\t\t} else {\n\n\t\t\tvar deferredMaterials = createDeferredMaterials( object.material );\n\n\t\t\tobject.userData.colorMaterial = deferredMaterials.colorMaterial;\n\t\t\tobject.userData.normalDepthMaterial = deferredMaterials.normalDepthMaterial;\n\t\t\tobject.userData.transparent = deferredMaterials.transparent;\n\n\t\t}\n\n\t};\n\n\tvar createDeferredMaterials = function ( originalMaterial ) {\n\n\t\tvar deferredMaterials = {};\n\n\t\t// color material\n\t\t// -----------------\n\t\t// \tdiffuse color\n\t\t//\tspecular color\n\t\t//\tshininess\n\t\t//\tdiffuse map\n\t\t//\tvertex colors\n\t\t//\talphaTest\n\t\t// \tmorphs\n\n\t\tvar uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );\n\t\tvar defines = { \"USE_MAP\": !! originalMaterial.map, \"USE_ENVMAP\": !! originalMaterial.envMap, \"GAMMA_INPUT\": true };\n\n\t\tvar material = new THREE.ShaderMaterial( {\n\n\t\t\tfragmentShader: colorShader.fragmentShader,\n\t\t\tvertexShader: \tcolorShader.vertexShader,\n\t\t\tuniforms: \t\tuniforms,\n\t\t\tdefines: \t\tdefines,\n\t\t\tshading:\t\toriginalMaterial.shading\n\n\t\t} );\n\n\t\tif ( originalMaterial instanceof THREE.MeshBasicMaterial ) {\n\n\t\t\tvar diffuse = black;\n\t\t\tvar emissive = originalMaterial.color;\n\n\t\t} else {\n\n\t\t\tvar diffuse = originalMaterial.color;\n\t\t\tvar emissive = originalMaterial.emissive !== undefined ? originalMaterial.emissive : black;\n\n\t\t}\n\n\t\tvar specular = originalMaterial.specular !== undefined ? originalMaterial.specular : black;\n\t\tvar shininess = originalMaterial.shininess !== undefined ? originalMaterial.shininess : 1;\n\t\tvar wrapAround = originalMaterial.wrapAround !== undefined ? ( originalMaterial.wrapAround ? -1 : 1 ) : 1;\n\t\tvar additiveSpecular = originalMaterial.metal !== undefined ? ( originalMaterial.metal ? 1 : -1 ) : -1;\n\n\t\tuniforms.emissive.value.copyGammaToLinear( emissive );\n\t\tuniforms.diffuse.value.copyGammaToLinear( diffuse );\n\t\tuniforms.specular.value.copyGammaToLinear( specular );\n\t\tuniforms.shininess.value = shininess;\n\t\tuniforms.wrapAround.value = wrapAround;\n\t\tuniforms.additiveSpecular.value = additiveSpecular;\n\n\t\tuniforms.map.value = originalMaterial.map;\n\n\t\tif ( originalMaterial.envMap ) {\n\n\t\t\tuniforms.envMap.value = originalMaterial.envMap;\n\t\t\tuniforms.useRefract.value = originalMaterial.envMap.mapping instanceof THREE.CubeRefractionMapping;\n\t\t\tuniforms.refractionRatio.value = originalMaterial.refractionRatio;\n\t\t\tuniforms.combine.value = originalMaterial.combine;\n\t\t\tuniforms.reflectivity.value = originalMaterial.reflectivity;\n\t\t\tuniforms.flipEnvMap.value = ( originalMaterial.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : -1;\n\n\t\t\tuniforms.samplerNormalDepth.value = compNormalDepth.renderTarget2;\n\t\t\tuniforms.viewWidth.value = scaledWidth;\n\t\t\tuniforms.viewHeight.value = scaledHeight;\n\n\t\t\tresizableMaterials.push( { \"material\": material } );\n\n\t\t}\n\n\t\tmaterial.vertexColors = originalMaterial.vertexColors;\n\t\tmaterial.morphTargets = originalMaterial.morphTargets;\n\t\tmaterial.morphNormals = originalMaterial.morphNormals;\n\t\tmaterial.skinning = originalMaterial.skinning;\n\n\t\tmaterial.alphaTest = originalMaterial.alphaTest;\n\t\tmaterial.wireframe = originalMaterial.wireframe;\n\n\t\t// uv repeat and offset setting priorities\n\t\t//\t1. color map\n\t\t//\t2. specular map\n\t\t//\t3. normal map\n\t\t//\t4. bump map\n\n\t\tvar uvScaleMap;\n\n\t\tif ( originalMaterial.map ) {\n\n\t\t\tuvScaleMap = originalMaterial.map;\n\n\t\t} else if ( originalMaterial.specularMap ) {\n\n\t\t\tuvScaleMap = originalMaterial.specularMap;\n\n\t\t} else if ( originalMaterial.normalMap ) {\n\n\t\t\tuvScaleMap = originalMaterial.normalMap;\n\n\t\t} else if ( originalMaterial.bumpMap ) {\n\n\t\t\tuvScaleMap = originalMaterial.bumpMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tvar offset = uvScaleMap.offset;\n\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t}\n\n\t\tdeferredMaterials.colorMaterial = material;\n\n\t\t// normal + depth material\n\t\t// -----------------\n\t\t//\tvertex normals\n\t\t//\tmorph normals\n\t\t//\tbump map\n\t\t//\tbump scale\n\t\t// clip depth\n\n\t\tif ( originalMaterial.morphTargets || originalMaterial.skinning || originalMaterial.bumpMap ) {\n\n\t\t\tvar uniforms = THREE.UniformsUtils.clone( normalDepthShader.uniforms );\n\t\t\tvar defines = { \"USE_BUMPMAP\": !!originalMaterial.bumpMap };\n\n\t\t\tvar normalDepthMaterial = new THREE.ShaderMaterial( {\n\n\t\t\t\tuniforms: uniforms,\n\t\t\t\tvertexShader: normalDepthShader.vertexShader,\n\t\t\t\tfragmentShader: normalDepthShader.fragmentShader,\n\t\t\t\tshading:\t\toriginalMaterial.shading,\n\t\t\t\tdefines:\t\tdefines,\n\t\t\t\tblending:\t\tTHREE.NoBlending\n\n\t\t\t} );\n\n\t\t\tnormalDepthMaterial.morphTargets = originalMaterial.morphTargets;\n\t\t\tnormalDepthMaterial.morphNormals = originalMaterial.morphNormals;\n\t\t\tnormalDepthMaterial.skinning = originalMaterial.skinning;\n\n\t\t\tif ( originalMaterial.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = originalMaterial.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = originalMaterial.bumpScale;\n\n\t\t\t\tvar offset = originalMaterial.bumpMap.offset;\n\t\t\t\tvar repeat = originalMaterial.bumpMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar normalDepthMaterial = defaultNormalDepthMaterial.clone();\n\n\t\t}\n\n\t\tnormalDepthMaterial.wireframe = originalMaterial.wireframe;\n\t\tnormalDepthMaterial.vertexColors = originalMaterial.vertexColors;\n\n\t\tdeferredMaterials.normalDepthMaterial = normalDepthMaterial;\n\n\t\t//\n\n\t\tdeferredMaterials.transparent = originalMaterial.transparent;\n\n\t\treturn deferredMaterials;\n\n\t};\n\n\tvar updatePointLightProxy = function ( lightProxy ) {\n\n\t\tvar light = lightProxy.userData.originalLight;\n\t\tvar uniforms = lightProxy.material.uniforms;\n\n\t\t// skip infinite pointlights\n\t\t// right now you can't switch between infinite and finite pointlights\n\t\t// it's just too messy as they use different proxies\n\n\t\tvar distance = light.distance;\n\n\t\tif ( distance > 0 ) {\n\n\t\t\tlightProxy.scale.set( 1, 1, 1 ).multiplyScalar( distance );\n\t\t\tuniforms[ \"lightRadius\" ].value = distance;\n\n\t\t\tpositionVS.setFromMatrixPosition( light.matrixWorld );\n\t\t\tpositionVS.applyMatrix4( currentCamera.matrixWorldInverse );\n\n\t\t\tuniforms[ \"lightPositionVS\" ].value.copy( positionVS );\n\n\t\t\tlightProxy.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tuniforms[ \"lightRadius\" ].value = Infinity;\n\n\t\t}\n\n\t\t// linear space colors\n\n\t\tvar intensity = light.intensity * light.intensity;\n\n\t\tuniforms[ \"lightIntensity\" ].value = intensity;\n\t\tuniforms[ \"lightColor\" ].value.copyGammaToLinear( light.color );\n\n\t};\n\n\tvar createDeferredPointLight = function ( light ) {\n\n\t\t// setup light material\n\n\t\tvar materialLight = new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: THREE.UniformsUtils.clone( pointLightShader.uniforms ),\n\t\t\tvertexShader: pointLightShader.vertexShader,\n\t\t\tfragmentShader: pointLightShader.fragmentShader,\n\n\t\t\tblending:\t\tTHREE.AdditiveBlending,\n\t\t\tdepthWrite:\t\tfalse,\n\t\t\ttransparent:\ttrue,\n\n\t\t\tside: THREE.BackSide\n\n\t\t} );\n\n\t\t// infinite pointlights use full-screen quad proxy\n\t\t// regular pointlights use sphere proxy\n\n\t\tvar geometry;\n\n\t\tif ( light.distance > 0 ) {\n\n\t\t\tgeometry = geometryLightSphere;\n\n\t\t} else {\n\n\t\t\tgeometry = geometryLightPlane;\n\n\t\t\tmaterialLight.depthTest = false;\n\t\t\tmaterialLight.side = THREE.FrontSide;\n\n\t\t}\n\n\t\tmaterialLight.uniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\tmaterialLight.uniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\tmaterialLight.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;\n\t\tmaterialLight.uniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;\n\n\t\t// create light proxy mesh\n\n\t\tvar meshLight = new THREE.Mesh( geometry, materialLight );\n\n\t\t// keep reference for color and intensity updates\n\n\t\tmeshLight.userData.originalLight = light;\n\n\t\t// keep reference for size reset\n\n\t\tresizableMaterials.push( { \"material\": materialLight } );\n\n\t\t// sync proxy uniforms to the original light\n\n\t\tupdatePointLightProxy( meshLight );\n\n\t\treturn meshLight;\n\n\t};\n\n\tvar updateSpotLightProxy = function ( lightProxy ) {\n\n\t\tvar light = lightProxy.userData.originalLight;\n\t\tvar uniforms = lightProxy.material.uniforms;\n\n\t\tvar viewMatrix = currentCamera.matrixWorldInverse;\n\t\tvar modelMatrix = light.matrixWorld;\n\n\t\tpositionVS.setFromMatrixPosition( modelMatrix );\n\t\tpositionVS.applyMatrix4( viewMatrix );\n\n\t\tdirectionVS.setFromMatrixPosition( modelMatrix );\n\t\ttempVS.setFromMatrixPosition( light.target.matrixWorld );\n\t\tdirectionVS.sub( tempVS );\n\t\tdirectionVS.normalize();\n\t\tdirectionVS.transformDirection( viewMatrix );\n\n\t\tuniforms[ \"lightPositionVS\" ].value.copy( positionVS );\n\t\tuniforms[ \"lightDirectionVS\" ].value.copy( directionVS );\n\n\t\tuniforms[ \"lightAngle\" ].value = light.angle;\n\t\tuniforms[ \"lightDistance\" ].value = light.distance;\n\n\t\t// linear space colors\n\n\t\tvar intensity = light.intensity * light.intensity;\n\n\t\tuniforms[ \"lightIntensity\" ].value = intensity;\n\t\tuniforms[ \"lightColor\" ].value.copyGammaToLinear( light.color );\n\n\t};\n\n\tvar createDeferredSpotLight = function ( light ) {\n\n\t\t// setup light material\n\n\t\tvar uniforms = THREE.UniformsUtils.clone( spotLightShader.uniforms );\n\n\t\tvar materialLight = new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: spotLightShader.vertexShader,\n\t\t\tfragmentShader: spotLightShader.fragmentShader,\n\n\t\t\tblending:\t\tTHREE.AdditiveBlending,\n\t\t\tdepthWrite:\t\tfalse,\n\t\t\tdepthTest:\t\tfalse,\n\t\t\ttransparent:\ttrue\n\n\t\t} );\n\n\t\tuniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\tuniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\tuniforms[ 'samplerColor' ].value = compColor.renderTarget2;\n\t\tuniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;\n\n\t\t// create light proxy mesh\n\n\t\tvar meshLight = new THREE.Mesh( geometryLightPlane, materialLight );\n\n\t\t// keep reference for color and intensity updates\n\n\t\tmeshLight.userData.originalLight = light;\n\n\t\t// keep reference for size reset\n\n\t\tresizableMaterials.push( { \"material\": materialLight } );\n\n\t\t// sync proxy uniforms to the original light\n\n\t\tupdateSpotLightProxy( meshLight );\n\n\t\treturn meshLight;\n\n\t};\n\n\tvar updateDirectionalLightProxy = function ( lightProxy ) {\n\n\t\tvar light = lightProxy.userData.originalLight;\n\t\tvar uniforms = lightProxy.material.uniforms;\n\n\t\tdirectionVS.setFromMatrixPosition( light.matrixWorld );\n\t\ttempVS.setFromMatrixPosition( light.target.matrixWorld );\n\t\tdirectionVS.sub( tempVS );\n\t\tdirectionVS.normalize();\n\t\tdirectionVS.transformDirection( currentCamera.matrixWorldInverse );\n\n\t\tuniforms[ \"lightDirectionVS\" ].value.copy( directionVS );\n\n\t\t// linear space colors\n\n\t\tvar intensity = light.intensity * light.intensity;\n\n\t\tuniforms[ \"lightIntensity\" ].value = intensity;\n\t\tuniforms[ \"lightColor\" ].value.copyGammaToLinear( light.color );\n\n\t};\n\n\tvar createDeferredDirectionalLight = function ( light ) {\n\n\t\t// setup light material\n\n\t\tvar uniforms = THREE.UniformsUtils.clone( directionalLightShader.uniforms );\n\n\t\tvar materialLight = new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: directionalLightShader.vertexShader,\n\t\t\tfragmentShader: directionalLightShader.fragmentShader,\n\n\t\t\tblending:\t\tTHREE.AdditiveBlending,\n\t\t\tdepthWrite:\t\tfalse,\n\t\t\tdepthTest:\t\tfalse,\n\t\t\ttransparent:\ttrue\n\n\t\t} );\n\n\t\tuniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\tuniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\tuniforms[ 'samplerColor' ].value = compColor.renderTarget2;\n\t\tuniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;\n\n\t\t// create light proxy mesh\n\n\t\tvar meshLight = new THREE.Mesh( geometryLightPlane, materialLight );\n\n\t\t// keep reference for color and intensity updates\n\n\t\tmeshLight.userData.originalLight = light;\n\n\t\t// keep reference for size reset\n\n\t\tresizableMaterials.push( { \"material\": materialLight } );\n\n\t\t// sync proxy uniforms to the original light\n\n\t\tupdateDirectionalLightProxy( meshLight );\n\n\t\treturn meshLight;\n\n\t};\n\n\tvar updateHemisphereLightProxy = function ( lightProxy ) {\n\n\t\tvar light = lightProxy.userData.originalLight;\n\t\tvar uniforms = lightProxy.material.uniforms;\n\n\t\tdirectionVS.setFromMatrixPosition( light.matrixWorld );\n\t\tdirectionVS.normalize();\n\t\tdirectionVS.transformDirection( currentCamera.matrixWorldInverse );\n\n\t\tuniforms[ \"lightDirectionVS\" ].value.copy( directionVS );\n\n\t\t// linear space colors\n\n\t\tvar intensity = light.intensity * light.intensity;\n\n\t\tuniforms[ \"lightIntensity\" ].value = intensity;\n\t\tuniforms[ \"lightColorSky\" ].value.copyGammaToLinear( light.color );\n\t\tuniforms[ \"lightColorGround\" ].value.copyGammaToLinear( light.groundColor );\n\n\t};\n\n\tvar createDeferredHemisphereLight = function ( light ) {\n\n\t\t// setup light material\n\n\t\tvar uniforms = THREE.UniformsUtils.clone( hemisphereLightShader.uniforms );\n\n\t\tvar materialLight = new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: hemisphereLightShader.vertexShader,\n\t\t\tfragmentShader: hemisphereLightShader.fragmentShader,\n\n\t\t\tblending:\t\tTHREE.AdditiveBlending,\n\t\t\tdepthWrite:\t\tfalse,\n\t\t\tdepthTest:\t\tfalse,\n\t\t\ttransparent:\ttrue\n\n\t\t} );\n\n\t\tuniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\tuniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\tuniforms[ 'samplerColor' ].value = compColor.renderTarget2;\n\t\tuniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;\n\n\t\t// create light proxy mesh\n\n\t\tvar meshLight = new THREE.Mesh( geometryLightPlane, materialLight );\n\n\t\t// keep reference for color and intensity updates\n\n\t\tmeshLight.userData.originalLight = light;\n\n\t\t// keep reference for size reset\n\n\t\tresizableMaterials.push( { \"material\": materialLight } );\n\n\t\t// sync proxy uniforms to the original light\n\n\t\tupdateHemisphereLightProxy( meshLight );\n\n\t\treturn meshLight;\n\n\t};\n\n\tvar updateAreaLightProxy = function ( lightProxy ) {\n\n\t\tvar light = lightProxy.userData.originalLight;\n\t\tvar uniforms = lightProxy.material.uniforms;\n\n\t\tvar modelMatrix = light.matrixWorld;\n\t\tvar viewMatrix = currentCamera.matrixWorldInverse;\n\n\t\tpositionVS.setFromMatrixPosition( modelMatrix );\n\t\tpositionVS.applyMatrix4( viewMatrix );\n\n\t\tuniforms[ \"lightPositionVS\" ].value.copy( positionVS );\n\n\t\trightVS.copy( light.right );\n\t\trightVS.transformDirection( modelMatrix );\n\t\trightVS.transformDirection( viewMatrix );\n\n\t\tnormalVS.copy( light.normal );\n\t\tnormalVS.transformDirection( modelMatrix );\n\t\tnormalVS.transformDirection( viewMatrix );\n\n\t\tupVS.crossVectors( rightVS, normalVS );\n\t\tupVS.normalize();\n\n\t\tuniforms[ \"lightRightVS\" ].value.copy( rightVS );\n\t\tuniforms[ \"lightNormalVS\" ].value.copy( normalVS );\n\t\tuniforms[ \"lightUpVS\" ].value.copy( upVS );\n\n\t\tuniforms[ \"lightWidth\" ].value = light.width;\n\t\tuniforms[ \"lightHeight\" ].value = light.height;\n\n\t\tuniforms[ \"constantAttenuation\" ].value = light.constantAttenuation;\n\t\tuniforms[ \"linearAttenuation\" ].value = light.linearAttenuation;\n\t\tuniforms[ \"quadraticAttenuation\" ].value = light.quadraticAttenuation;\n\n\t\t// linear space colors\n\n\t\tvar intensity = light.intensity * light.intensity;\n\n\t\tuniforms[ \"lightIntensity\" ].value = intensity;\n\t\tuniforms[ \"lightColor\" ].value.copyGammaToLinear( light.color );\n\n\t};\n\n\tvar createDeferredAreaLight = function ( light ) {\n\n\t\t// setup light material\n\n\t\tvar uniforms = THREE.UniformsUtils.clone( areaLightShader.uniforms );\n\n\t\tvar materialLight = new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: areaLightShader.vertexShader,\n\t\t\tfragmentShader: areaLightShader.fragmentShader,\n\n\t\t\tblending:\t\tTHREE.AdditiveBlending,\n\t\t\tdepthWrite:\t\tfalse,\n\t\t\tdepthTest:\t\tfalse,\n\t\t\ttransparent:\ttrue\n\n\t\t} );\n\n\t\tuniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\tuniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\tuniforms[ 'samplerColor' ].value = compColor.renderTarget2;\n\t\tuniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;\n\n\t\t// create light proxy mesh\n\n\t\tvar meshLight = new THREE.Mesh( geometryLightPlane, materialLight );\n\n\t\t// keep reference for color and intensity updates\n\n\t\tmeshLight.userData.originalLight = light;\n\n\t\t// keep reference for size reset\n\n\t\tresizableMaterials.push( { \"material\": materialLight } );\n\n\t\t// sync proxy uniforms to the original light\n\n\t\tupdateAreaLightProxy( meshLight );\n\n\t\treturn meshLight;\n\n\t};\n\n\tvar createDeferredEmissiveLight = function () {\n\n\t\t// setup light material\n\n\t\tvar materialLight = new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: THREE.UniformsUtils.clone( emissiveLightShader.uniforms ),\n\t\t\tvertexShader: emissiveLightShader.vertexShader,\n\t\t\tfragmentShader: emissiveLightShader.fragmentShader,\n\t\t\tdepthTest:\t\tfalse,\n\t\t\tdepthWrite:\t\tfalse,\n\t\t\tblending:\t\tTHREE.NoBlending\n\n\t\t} );\n\n\t\tmaterialLight.uniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\tmaterialLight.uniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\tmaterialLight.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;\n\n\t\t// create light proxy mesh\n\n\t\tvar meshLight = new THREE.Mesh( geometryLightPlane, materialLight );\n\n\t\t// keep reference for size reset\n\n\t\tresizableMaterials.push( { \"material\": materialLight } );\n\n\t\treturn meshLight;\n\n\t};\n\n\tvar initDeferredProperties = function ( object ) {\n\n\t\tif ( object.userData.deferredInitialized ) return;\n\n\t\tif ( object.material ) initDeferredMaterials( object );\n\n\t\tif ( object instanceof THREE.PointLight ) {\n\n\t\t\tvar proxy = createDeferredPointLight( object );\n\n\t\t\tif ( object.distance > 0 ) {\n\n\t\t\t\tlightSceneProxy.add( proxy );\n\n\t\t\t} else {\n\n\t\t\t\tlightSceneFullscreen.add( proxy );\n\n\t\t\t}\n\n\t\t} else if ( object instanceof THREE.SpotLight ) {\n\n\t\t\tvar proxy = createDeferredSpotLight( object );\n\t\t\tlightSceneFullscreen.add( proxy );\n\n\t\t} else if ( object instanceof THREE.DirectionalLight ) {\n\n\t\t\tvar proxy = createDeferredDirectionalLight( object );\n\t\t\tlightSceneFullscreen.add( proxy );\n\n\t\t} else if ( object instanceof THREE.HemisphereLight ) {\n\n\t\t\tvar proxy = createDeferredHemisphereLight( object );\n\t\t\tlightSceneFullscreen.add( proxy );\n\n\t\t} else if ( object instanceof THREE.AreaLight ) {\n\n\t\t\tvar proxy = createDeferredAreaLight( object );\n\t\t\tlightSceneFullscreen.add( proxy );\n\n\t\t}\n\n\t\tobject.userData.deferredInitialized = true;\n\n\t};\n\n\t//\n\n\tvar setMaterialColor = function ( object ) {\n\n\t\tif ( object.material ) {\n\n\t\t\tif ( object.userData.transparent ) {\n\n\t\t\t\tobject.material = invisibleMaterial;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = object.userData.colorMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tvar setMaterialNormalDepth = function ( object ) {\n\n\t\tif ( object.material ) {\n\n\t\t\tif ( object.userData.transparent ) {\n\n\t\t\t\tobject.material = invisibleMaterial;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = object.userData.normalDepthMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t// external API\n\n\tthis.setAntialias = function ( enabled ) {\n\n\t\tantialias = enabled;\n\n\t\tif ( antialias ) {\n\n\t\t\teffectFXAA.enabled = true;\n\t\t\tcompositePass.renderToScreen = false;\n\n\t\t} else {\n\n\t\t\teffectFXAA.enabled = false;\n\t\t\tcompositePass.renderToScreen = true;\n\t\t}\n\n\t};\n\n\tthis.getAntialias = function () {\n\n\t\treturn antialias;\n\n\t};\n\n\tthis.addEffect = function ( effect, normalDepthUniform, colorUniform ) {\n\n\t\tif ( effect.material && effect.uniforms ) {\n\n\t\t\tif ( normalDepthUniform ) effect.uniforms[ normalDepthUniform ].value = compNormalDepth.renderTarget2;\n\t\t\tif ( colorUniform ) \t effect.uniforms[ colorUniform ].value = compColor.renderTarget2;\n\n\t\t\tif ( normalDepthUniform || colorUniform ) {\n\n\t\t\t\tresizableMaterials.push( { \"material\": effect.material, \"normalDepth\": normalDepthUniform, \"color\": colorUniform } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tcompFinal.insertPass( effect, -1 );\n\n\t};\n\n\tthis.setScale = function ( scale ) {\n\n\t\tcurrentScale = scale;\n\n\t\tscaledWidth = Math.floor( currentScale * fullWidth );\n\t\tscaledHeight = Math.floor( currentScale * fullHeight );\n\n\t\tcompNormalDepth.setSize( scaledWidth, scaledHeight );\n\t\tcompColor.setSize( scaledWidth, scaledHeight );\n\t\tcompLight.setSize( scaledWidth, scaledHeight );\n\t\tcompFinal.setSize( scaledWidth, scaledHeight );\n\n\t\tcompColor.renderTarget2.shareDepthFrom = compNormalDepth.renderTarget2;\n\t\tcompLight.renderTarget2.shareDepthFrom = compNormalDepth.renderTarget2;\n\n\t\tfor ( var i = 0, il = resizableMaterials.length; i < il; i ++ ) {\n\n\t\t\tvar materialEntry = resizableMaterials[ i ];\n\n\t\t\tvar material = materialEntry.material;\n\t\t\tvar uniforms = material.uniforms;\n\n\t\t\tvar colorLabel = materialEntry.color !== undefined ? materialEntry.color : 'samplerColor';\n\t\t\tvar normalDepthLabel = materialEntry.normalDepth !== undefined ? materialEntry.normalDepth : 'samplerNormalDepth';\n\n\t\t\tif ( uniforms[ colorLabel ] ) uniforms[ colorLabel ].value = compColor.renderTarget2;\n\t\t\tif ( uniforms[ normalDepthLabel ] ) uniforms[ normalDepthLabel ].value = compNormalDepth.renderTarget2;\n\n\t\t\tif ( uniforms[ 'viewWidth' ] ) uniforms[ \"viewWidth\" ].value = scaledWidth;\n\t\t\tif ( uniforms[ 'viewHeight' ] ) uniforms[ \"viewHeight\" ].value = scaledHeight;\n\n\t\t}\n\n\t\tcompositePass.uniforms[ 'samplerLight' ].value = compLight.renderTarget2;\n\n\t\teffectFXAA.uniforms[ 'resolution' ].value.set( 1 / fullWidth, 1 / fullHeight );\n\n\t};\n\n\tthis.setSize = function ( width, height ) {\n\n\t\tfullWidth = width;\n\t\tfullHeight = height;\n\n\t\tthis.renderer.setSize( fullWidth, fullHeight );\n\n\t\tthis.setScale( currentScale );\n\n\t};\n\n\t//\n\n\tfunction updateLightProxy ( proxy ) {\n\n\t\tvar uniforms = proxy.material.uniforms;\n\n\t\tif ( uniforms[ \"matProjInverse\" ] ) uniforms[ \"matProjInverse\" ].value = projectionMatrixInverse;\n\t\tif ( uniforms[ \"matView\" ] ) uniforms[ \"matView\" ].value = currentCamera.matrixWorldInverse;\n\n\t\tvar originalLight = proxy.userData.originalLight;\n\n\t\tif ( originalLight ) {\n\n\t\t\tproxy.visible = originalLight.visible;\n\n\t\t\tif ( originalLight instanceof THREE.PointLight ) {\n\n\t\t\t\tupdatePointLightProxy( proxy );\n\n\t\t\t} else if ( originalLight instanceof THREE.SpotLight ) {\n\n\t\t\t\tupdateSpotLightProxy( proxy );\n\n\t\t\t} else if ( originalLight instanceof THREE.DirectionalLight ) {\n\n\t\t\t\tupdateDirectionalLightProxy( proxy );\n\n\t\t\t} else if ( originalLight instanceof THREE.HemisphereLight ) {\n\n\t\t\t\tupdateHemisphereLightProxy( proxy );\n\n\t\t\t} else if ( originalLight instanceof THREE.AreaLight ) {\n\n\t\t\t\tupdateAreaLightProxy( proxy );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\t// setup deferred properties\n\n\t\tif ( ! scene.userData.lightSceneProxy ) {\n\n\t\t\tscene.userData.lightSceneProxy = new THREE.Scene();\n\t\t\tscene.userData.lightSceneFullscreen = new THREE.Scene();\n\n\t\t\tvar meshLight = createDeferredEmissiveLight();\n\t\t\tscene.userData.lightSceneFullscreen.add( meshLight );\n\n\t\t}\n\n\t\tcurrentCamera = camera;\n\n\t\tlightSceneProxy = scene.userData.lightSceneProxy;\n\t\tlightSceneFullscreen = scene.userData.lightSceneFullscreen;\n\n\t\tpassColor.camera = currentCamera;\n\t\tpassNormalDepth.camera = currentCamera;\n\t\tpassLightProxy.camera = currentCamera;\n\t\tpassLightFullscreen.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n\t\tpassColor.scene = scene;\n\t\tpassNormalDepth.scene = scene;\n\t\tpassLightFullscreen.scene = lightSceneFullscreen;\n\t\tpassLightProxy.scene = lightSceneProxy;\n\n\t\tscene.traverse( initDeferredProperties );\n\n\t\t// update scene graph only once per frame\n\t\t// (both color and normalDepth passes use exactly the same scene state)\n\n\t\tscene.autoUpdate = false;\n\t\tscene.updateMatrixWorld();\n\n\t\t// 1) g-buffer normals + depth pass\n\n\t\tscene.traverse( setMaterialNormalDepth );\n\n\t\t// clear shared depth buffer\n\n\t\tthis.renderer.autoClearDepth = true;\n\t\tthis.renderer.autoClearStencil = true;\n\n\t\t// write 1 to shared stencil buffer\n\t\t// for non-background pixels\n\n\t\t//gl.enable( gl.STENCIL_TEST );\n\t\tgl.stencilOp( gl.REPLACE, gl.REPLACE, gl.REPLACE );\n\t\tgl.stencilFunc( gl.ALWAYS, 1, 0xffffffff );\n\t\tgl.clearStencil( 0 );\n\n\t\tcompNormalDepth.render();\n\n\t\t// just touch foreground pixels (stencil == 1)\n\t\t// both in color and light passes\n\n\t\tgl.stencilFunc( gl.EQUAL, 1, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\n\t\t// 2) g-buffer color pass\n\n\t\tscene.traverse( setMaterialColor );\n\n\t\t// must use clean slate depth buffer\n\t\t// otherwise there are z-fighting glitches\n\t\t// not enough precision between two geometry passes\n\t\t// just to use EQUAL depth test\n\n\t\tthis.renderer.autoClearDepth = true;\n\t\tthis.renderer.autoClearStencil = false;\n\n\t\tcompColor.render();\n\n\t\t// 3) light pass\n\n\t\t// do not clear depth buffer in this pass\n\t\t// depth from geometry pass is used for light culling\n\t\t// (write light proxy color pixel if behind scene pixel)\n\n\t\tthis.renderer.autoClearDepth = false;\n\n\t\tscene.autoUpdate = true;\n\n\t\tgl.depthFunc( gl.GEQUAL );\n\n\t\tprojectionMatrixInverse.getInverse( currentCamera.projectionMatrix );\n\n\t\tfor ( var i = 0, il = lightSceneProxy.children.length; i < il; i ++ ) {\n\n\t\t\tvar proxy = lightSceneProxy.children[ i ];\n\t\t\tupdateLightProxy( proxy );\n\n\t\t}\n\n\t\tfor ( var i = 0, il = lightSceneFullscreen.children.length; i < il; i ++ ) {\n\n\t\t\tvar proxy = lightSceneFullscreen.children[ i ];\n\t\t\tupdateLightProxy( proxy );\n\n\t\t}\n\n\t\tcompLight.render();\n\n\t\t// 4) composite pass\n\n\t\t// return back to usual depth and stencil handling state\n\n\t\tthis.renderer.autoClearDepth = true;\n\t\tthis.renderer.autoClearStencil = true;\n\t\tgl.depthFunc( gl.LEQUAL );\n\t\tgl.disable( gl.STENCIL_TEST );\n\n\t\tcompFinal.render( 0.1 );\n\n\t};\n\n\t//\n\n\tvar createRenderTargets = function ( ) {\n\n\t\tvar rtParamsFloatLinear = { minFilter: THREE.NearestFilter, magFilter: THREE.LinearFilter, stencilBuffer: true,\n\t\t\t\t\t\t\t\t\tformat: THREE.RGBAFormat, type: THREE.FloatType };\n\n\t\tvar rtParamsFloatNearest = { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, stencilBuffer: true,\n\t\t\t\t\t\t\t\t\t format: THREE.RGBAFormat, type: THREE.FloatType };\n\n\t\tvar rtParamsUByte = { minFilter: THREE.NearestFilter, magFilter: THREE.LinearFilter, stencilBuffer: false,\n\t\t\t\t\t\t\t format: THREE.RGBFormat, type: THREE.UnsignedByteType };\n\n\t\t// g-buffers\n\n\t\tvar rtColor = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatNearest );\n\t\tvar rtNormalDepth = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatNearest );\n\t\tvar rtLight = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatLinear );\n\t\tvar rtFinal = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsUByte );\n\n\t\trtColor.generateMipmaps = false;\n\t\trtNormalDepth.generateMipmaps = false;\n\t\trtLight.generateMipmaps = false;\n\t\trtFinal.generateMipmaps = false;\n\n\t\t// normal + depth composer\n\n\t\tpassNormalDepth = new THREE.RenderPass();\n\t\tpassNormalDepth.clear = true;\n\n\t\tcompNormalDepth = new THREE.EffectComposer( _this.renderer, rtNormalDepth );\n\t\tcompNormalDepth.addPass( passNormalDepth );\n\n\t\t// color composer\n\n\t\tpassColor = new THREE.RenderPass();\n\t\tpassColor.clear = true;\n\n\t\tcompColor = new THREE.EffectComposer( _this.renderer, rtColor );\n\t\tcompColor.addPass( passColor );\n\n\t\tcompColor.renderTarget2.shareDepthFrom = compNormalDepth.renderTarget2;\n\n\t\t// light composer\n\n\t\tpassLightFullscreen = new THREE.RenderPass();\n\t\tpassLightFullscreen.clear = true;\n\n\t\tpassLightProxy = new THREE.RenderPass();\n\t\tpassLightProxy.clear = false;\n\n\t\tcompLight = new THREE.EffectComposer( _this.renderer, rtLight );\n\t\tcompLight.addPass( passLightFullscreen );\n\t\tcompLight.addPass( passLightProxy );\n\n\t\tcompLight.renderTarget2.shareDepthFrom = compNormalDepth.renderTarget2;\n\n\t\t// final composer\n\n\t\tcompositePass = new THREE.ShaderPass( compositeShader );\n\t\tcompositePass.uniforms[ 'samplerLight' ].value = compLight.renderTarget2;\n\t\tcompositePass.uniforms[ 'brightness' ].value = brightness;\n\t\tcompositePass.material.blending = THREE.NoBlending;\n\t\tcompositePass.clear = true;\n\n\t\tvar defines;\n\n\t\tswitch ( tonemapping ) {\n\n\t\t\tcase THREE.SimpleOperator: defines = { \"TONEMAP_SIMPLE\": true }; break;\n\t\t\tcase THREE.LinearOperator: defines = { \"TONEMAP_LINEAR\": true }; break;\n\t\t\tcase THREE.ReinhardOperator: defines = { \"TONEMAP_REINHARD\": true }; break;\n\t\t\tcase THREE.FilmicOperator: defines = { \"TONEMAP_FILMIC\": true }; break;\n\t\t\tcase THREE.UnchartedOperator: defines = { \"TONEMAP_UNCHARTED\": true }; break;\n\n\t\t}\n\n\t\tcompositePass.material.defines = defines;\n\n\t\t// FXAA\n\n\t\teffectFXAA = new THREE.ShaderPass( THREE.FXAAShader );\n\t\teffectFXAA.uniforms[ 'resolution' ].value.set( 1 / fullWidth, 1 / fullHeight );\n\t\teffectFXAA.renderToScreen = true;\n\n\t\t//\n\n\t\tcompFinal = new THREE.EffectComposer( _this.renderer, rtFinal );\n\t\tcompFinal.addPass( compositePass );\n\t\tcompFinal.addPass( effectFXAA );\n\n\t\tif ( antialias ) {\n\n\t\t\teffectFXAA.enabled = true;\n\t\t\tcompositePass.renderToScreen = false;\n\n\t\t} else {\n\n\t\t\teffectFXAA.enabled = false;\n\t\t\tcompositePass.renderToScreen = true;\n\n\t\t}\n\n\t};\n\n\t// init\n\n\tcreateRenderTargets();\n\n};\n\n// tonemapping operator types\n\nTHREE.NoOperator = 0;\nTHREE.SimpleOperator = 1;\nTHREE.LinearOperator = 2;\nTHREE.ReinhardOperator = 3;\nTHREE.FilmicOperator = 4;\nTHREE.UnchartedOperator = 5;\n"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/CSS2DRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/CSS2DRenderer.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.CSS2DObject = function ( element ) {\n\n\tTHREE.Object3D.call( this );\n\n\tthis.element = element;\n\tthis.element.style.position = 'absolute';\n\n\tthis.addEventListener( 'removed', function ( event ) {\n\n\t\tif ( this.element.parentNode !== null ) {\n\n\t\t\tthis.element.parentNode.removeChild( this.element );\n\n\t\t}\n\n\t} );\n\n};\n\nTHREE.CSS2DObject.prototype = Object.create( THREE.Object3D.prototype );\n\n//\n\nTHREE.CSS2DRenderer = function () {\n\n\tconsole.log( 'THREE.CSS2DRenderer', THREE.REVISION );\n\n\tvar _width, _height;\n\tvar _widthHalf, _heightHalf;\n\n\tvar vector = new THREE.Vector3();\n\tvar viewMatrix = new THREE.Matrix4();\n\tvar viewProjectionMatrix = new THREE.Matrix4();\n\n\tvar domElement = document.createElement( 'div' );\n\tdomElement.style.overflow = 'hidden';\n\n\tthis.domElement = domElement;\n\n\tthis.setSize = function ( width, height ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_widthHalf = _width / 2;\n\t\t_heightHalf = _height / 2;\n\n\t\tdomElement.style.width = width + 'px';\n\t\tdomElement.style.height = height + 'px';\n\n\t};\n\n\tvar renderObject = function ( object, camera ) {\n\n\t\tif ( object instanceof THREE.CSS2DObject ) {\n\n\t\t\tvector.setFromMatrixPosition( object.matrixWorld );\n\t\t\tvector.applyProjection( viewProjectionMatrix );\n\n\t\t\tvar element = object.element;\n\t\t\tvar style = 'translate(-50%,-50%) translate(' + ( vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\telement.style.WebkitTransform = style;\n\t\t\telement.style.MozTransform = style;\n\t\t\telement.style.oTransform = style;\n\t\t\telement.style.transform = style;\n\n\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( object.children[ i ], camera );\n\n\t\t}\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\tviewMatrix.copy( camera.matrixWorldInverse.getInverse( camera.matrixWorld ) );\n\t\tviewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, viewMatrix );\n\n\t\trenderObject( scene, camera );\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Renderers/SVGRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Renderers/SVGRenderer.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.SVGRenderer = function () {\n\n\tconsole.log( 'THREE.SVGRenderer', THREE.REVISION );\n\n\tvar _this = this,\n\t_renderData, _elements, _lights,\n\t_projector = new THREE.Projector(),\n\t_svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),\n\t_svgWidth, _svgHeight, _svgWidthHalf, _svgHeightHalf,\n\n\t_v1, _v2, _v3, _v4,\n\n\t_clipBox = new THREE.Box2(),\n\t_elemBox = new THREE.Box2(),\n\n\t_color = new THREE.Color(),\n\t_diffuseColor = new THREE.Color(),\n\t_ambientLight = new THREE.Color(),\n\t_directionalLights = new THREE.Color(),\n\t_pointLights = new THREE.Color(),\n\t_clearColor = new THREE.Color(),\n\t_clearAlpha = 1,\n\n\t_w, // z-buffer to w-buffer\n\t_vector3 = new THREE.Vector3(), // Needed for PointLight\n\t_centroid = new THREE.Vector3(),\n\n\t_svgPathPool = [], _svgLinePool = [], _svgRectPool = [],\n\t_svgNode, _pathCount = 0, _lineCount = 0, _rectCount = 0,\n\t_quality = 1;\n\n\tthis.domElement = _svg;\n\n\tthis.autoClear = true;\n\tthis.sortObjects = true;\n\tthis.sortElements = true;\n\n\tthis.info = {\n\n\t\trender: {\n\n\t\t\tvertices: 0,\n\t\t\tfaces: 0\n\n\t\t}\n\n\t}\n\n\tthis.setQuality = function( quality ) {\n\n\t\tswitch(quality) {\n\n\t\t\tcase \"high\": _quality = 1; break;\n\t\t\tcase \"low\": _quality = 0; break;\n\n\t\t}\n\n\t};\n\n\t// WebGLRenderer compatibility\n\n\tthis.supportsVertexTextures = function () {};\n\tthis.setFaceCulling = function () {};\n\n\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t_clearColor.set( color );\n\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t};\n\n\tthis.setSize = function( width, height ) {\n\n\t\t_svgWidth = width; _svgHeight = height;\n\t\t_svgWidthHalf = _svgWidth / 2; _svgHeightHalf = _svgHeight / 2;\n\n\t\t_svg.setAttribute( 'viewBox', ( - _svgWidthHalf ) + ' ' + ( - _svgHeightHalf ) + ' ' + _svgWidth + ' ' + _svgHeight );\n\t\t_svg.setAttribute( 'width', _svgWidth );\n\t\t_svg.setAttribute( 'height', _svgHeight );\n\n\t\t_clipBox.min.set( - _svgWidthHalf, - _svgHeightHalf );\n\t\t_clipBox.max.set( _svgWidthHalf, _svgHeightHalf );\n\n\t};\n\n\tthis.clear = function () {\n\n\t\t_pathCount = 0;\n\t\t_lineCount = 0;\n\t\t_rectCount = 0;\n\n\t\twhile ( _svg.childNodes.length > 0 ) {\n\n\t\t\t_svg.removeChild( _svg.childNodes[ 0 ] );\n\n\t\t}\n\t\t\n\t\t_svg.style.backgroundColor = 'rgba(' + ( ( _clearColor.r * 255 ) | 0 ) + ',' + ( ( _clearColor.g * 255 ) | 0 ) + ',' + ( ( _clearColor.b * 255 ) | 0 ) + ',' + _clearAlpha + ')';\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera instanceof THREE.Camera === false ) {\n\n\t\t\tconsole.error( 'THREE.SVGRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.autoClear === true ) this.clear();\n\n\t\t_this.info.render.vertices = 0;\n\t\t_this.info.render.faces = 0;\n\n\t\t_renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements );\n\t\t_elements = _renderData.elements;\n\t\t_lights = _renderData.lights;\n\n\t\tcalculateLights( _lights );\n\n\t\tfor ( var e = 0, el = _elements.length; e < el; e ++ ) {\n\n\t\t\tvar element = _elements[ e ];\n\t\t\tvar material = element.material;\n\n\t\t\tif ( material === undefined || material.opacity === 0 ) continue;\n\n\t\t\t_elemBox.makeEmpty();\n\n\t\t\tif ( element instanceof THREE.RenderableSprite ) {\n\n\t\t\t\t_v1 = element;\n\t\t\t\t_v1.x *= _svgWidthHalf; _v1.y *= - _svgHeightHalf;\n\n\t\t\t\trenderSprite( _v1, element, material );\n\n\t\t\t} else if ( element instanceof THREE.RenderableLine ) {\n\n\t\t\t\t_v1 = element.v1; _v2 = element.v2;\n\n\t\t\t\t_v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;\n\t\t\t\t_v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;\n\n\t\t\t\t_elemBox.setFromPoints( [ _v1.positionScreen, _v2.positionScreen ] );\n\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === true ) {\n\n\t\t\t\t\trenderLine( _v1, _v2, element, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( element instanceof THREE.RenderableFace ) {\n\n\t\t\t\t_v1 = element.v1; _v2 = element.v2; _v3 = element.v3;\n\n\t\t\t\tif ( _v1.positionScreen.z < -1 || _v1.positionScreen.z > 1 ) continue;\n\t\t\t\tif ( _v2.positionScreen.z < -1 || _v2.positionScreen.z > 1 ) continue;\n\t\t\t\tif ( _v3.positionScreen.z < -1 || _v3.positionScreen.z > 1 ) continue;\n\n\t\t\t\t_v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;\n\t\t\t\t_v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;\n\t\t\t\t_v3.positionScreen.x *= _svgWidthHalf; _v3.positionScreen.y *= - _svgHeightHalf;\n\n\t\t\t\t_elemBox.setFromPoints( [\n\t\t\t\t\t_v1.positionScreen,\n\t\t\t\t\t_v2.positionScreen,\n\t\t\t\t\t_v3.positionScreen\n\t\t\t\t] );\n\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === true ) {\n\n\t\t\t\t\trenderFace3( _v1, _v2, _v3, element, material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tfunction calculateLights( lights ) {\n\n\t\t_ambientLight.setRGB( 0, 0, 0 );\n\t\t_directionalLights.setRGB( 0, 0, 0 );\n\t\t_pointLights.setRGB( 0, 0, 0 );\n\n\t\tfor ( var l = 0, ll = lights.length; l < ll; l++ ) {\n\n\t\t\tvar light = lights[ l ];\n\t\t\tvar lightColor = light.color;\n\n\t\t\tif ( light instanceof THREE.AmbientLight ) {\n\n\t\t\t\t_ambientLight.r += lightColor.r;\n\t\t\t\t_ambientLight.g += lightColor.g;\n\t\t\t\t_ambientLight.b += lightColor.b;\n\n\t\t\t} else if ( light instanceof THREE.DirectionalLight ) {\n\n\t\t\t\t_directionalLights.r += lightColor.r;\n\t\t\t\t_directionalLights.g += lightColor.g;\n\t\t\t\t_directionalLights.b += lightColor.b;\n\n\t\t\t} else if ( light instanceof THREE.PointLight ) {\n\n\t\t\t\t_pointLights.r += lightColor.r;\n\t\t\t\t_pointLights.g += lightColor.g;\n\t\t\t\t_pointLights.b += lightColor.b;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction calculateLight( lights, position, normal, color ) {\n\n\t\tfor ( var l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\tvar light = lights[ l ];\n\t\t\tvar lightColor = light.color;\n\n\t\t\tif ( light instanceof THREE.DirectionalLight ) {\n\n\t\t\t\tvar lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld ).normalize();\n\n\t\t\t\tvar amount = normal.dot( lightPosition );\n\n\t\t\t\tif ( amount <= 0 ) continue;\n\n\t\t\t\tamount *= light.intensity;\n\n\t\t\t\tcolor.r += lightColor.r * amount;\n\t\t\t\tcolor.g += lightColor.g * amount;\n\t\t\t\tcolor.b += lightColor.b * amount;\n\n\t\t\t} else if ( light instanceof THREE.PointLight ) {\n\n\t\t\t\tvar lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tvar amount = normal.dot( _vector3.subVectors( lightPosition, position ).normalize() );\n\n\t\t\t\tif ( amount <= 0 ) continue;\n\n\t\t\t\tamount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 );\n\n\t\t\t\tif ( amount == 0 ) continue;\n\n\t\t\t\tamount *= light.intensity;\n\n\t\t\t\tcolor.r += lightColor.r * amount;\n\t\t\t\tcolor.g += lightColor.g * amount;\n\t\t\t\tcolor.b += lightColor.b * amount;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderSprite( v1, element, material ) {\n\n\t\tvar scaleX = element.scale.x * _svgWidthHalf;\n\t\tvar scaleY = element.scale.y * _svgHeightHalf;\n\n\t\t_svgNode = getRectNode( _rectCount ++ );\n\n\t\t_svgNode.setAttribute( 'x', v1.x - ( scaleX * 0.5 ) );\n\t\t_svgNode.setAttribute( 'y', v1.y - ( scaleY * 0.5 ) );\n\t\t_svgNode.setAttribute( 'width', scaleX );\n\t\t_svgNode.setAttribute( 'height', scaleY );\n\n\t\tif ( material instanceof THREE.SpriteMaterial ) {\n\n\t\t\t_svgNode.setAttribute( 'style', 'fill: ' + material.color.getStyle() );\n\n\t\t}\n\n\t\t_svg.appendChild( _svgNode );\n\n\t}\n\n\tfunction renderLine( v1, v2, element, material ) {\n\n\t\t_svgNode = getLineNode( _lineCount ++ );\n\n\t\t_svgNode.setAttribute( 'x1', v1.positionScreen.x );\n\t\t_svgNode.setAttribute( 'y1', v1.positionScreen.y );\n\t\t_svgNode.setAttribute( 'x2', v2.positionScreen.x );\n\t\t_svgNode.setAttribute( 'y2', v2.positionScreen.y );\n\n\t\tif ( material instanceof THREE.LineBasicMaterial ) {\n\n\t\t\t_svgNode.setAttribute( 'style', 'fill: none; stroke: ' + material.color.getStyle() + '; stroke-width: ' + material.linewidth + '; stroke-opacity: ' + material.opacity + '; stroke-linecap: ' + material.linecap + '; stroke-linejoin: ' + material.linejoin );\n\n\t\t\t_svg.appendChild( _svgNode );\n\n\t\t}\n\n\t}\n\n\tfunction renderFace3( v1, v2, v3, element, material ) {\n\n\t\t_this.info.render.vertices += 3;\n\t\t_this.info.render.faces ++;\n\n\t\t_svgNode = getPathNode( _pathCount ++ );\n\t\t_svgNode.setAttribute( 'd', 'M ' + v1.positionScreen.x + ' ' + v1.positionScreen.y + ' L ' + v2.positionScreen.x + ' ' + v2.positionScreen.y + ' L ' + v3.positionScreen.x + ',' + v3.positionScreen.y + 'z' );\n\n\t\tif ( material instanceof THREE.MeshBasicMaterial ) {\n\n\t\t\t_color.copy( material.color );\n\n\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\n\n\t\t\t\t_color.multiply( element.color );\n\n\t\t\t}\n\n\t\t} else if ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {\n\n\t\t\t_diffuseColor.copy( material.color );\n\n\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\n\n\t\t\t\t_diffuseColor.multiply( element.color );\n\n\t\t\t}\n\n\t\t\t_color.copy( _ambientLight );\n\n\t\t\t_centroid.copy( v1.positionWorld ).add( v2.positionWorld ).add( v3.positionWorld ).divideScalar( 3 );\n\n\t\t\tcalculateLight( _lights, _centroid, element.normalModel, _color );\n\n\t\t\t_color.multiply( _diffuseColor ).add( material.emissive );\n\n\t\t} else if ( material instanceof THREE.MeshDepthMaterial ) {\n\n\t\t\t_w = 1 - ( material.__2near / (material.__farPlusNear - element.z * material.__farMinusNear) );\n\t\t\t_color.setRGB( _w, _w, _w );\n\n\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\n\n\t\t\tvar normal = element.normalModelView;\n\n\t\t\t_color.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\n\n\t\t}\n\n\t\tif ( material.wireframe ) {\n\n\t\t\t_svgNode.setAttribute( 'style', 'fill: none; stroke: ' + _color.getStyle() + '; stroke-width: ' + material.wireframeLinewidth + '; stroke-opacity: ' + material.opacity + '; stroke-linecap: ' + material.wireframeLinecap + '; stroke-linejoin: ' + material.wireframeLinejoin );\n\n\t\t} else {\n\n\t\t\t_svgNode.setAttribute( 'style', 'fill: ' + _color.getStyle() + '; fill-opacity: ' + material.opacity );\n\n\t\t}\n\n\t\t_svg.appendChild( _svgNode );\n\n\t}\n\n\tfunction getLineNode( id ) {\n\n\t\tif ( _svgLinePool[ id ] == null ) {\n\n\t\t\t_svgLinePool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'line' );\n\n\t\t\tif ( _quality == 0 ) {\n\n\t\t\t\t_svgLinePool[ id ].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed\n\n\t\t\t}\n\n\t\t\treturn _svgLinePool[ id ];\n\n\t\t}\n\n\t\treturn _svgLinePool[ id ];\n\n\t}\n\n\tfunction getPathNode( id ) {\n\n\t\tif ( _svgPathPool[ id ] == null ) {\n\n\t\t\t_svgPathPool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\n\n\t\t\tif ( _quality == 0 ) {\n\n\t\t\t\t_svgPathPool[ id ].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed\n\n\t\t\t}\n\n\t\t\treturn _svgPathPool[ id ];\n\n\t\t}\n\n\t\treturn _svgPathPool[ id ];\n\n\t}\n\n\tfunction getRectNode( id ) {\n\n\t\tif ( _svgRectPool[ id ] == null ) {\n\n\t\t\t_svgRectPool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'rect' );\n\n\t\t\tif ( _quality == 0 ) {\n\n\t\t\t\t_svgRectPool[ id ].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed\n\n\t\t\t}\n\n\t\t\treturn _svgRectPool[ id ];\n\n\t\t}\n\n\t\treturn _svgRectPool[ id ];\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/DeviceOrientationControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/DeviceOrientationControls.js",
"module-type": "library",
"text": "/**\n * @author richt / http://richt.me\n * @author WestLangley / http://github.com/WestLangley\n *\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nTHREE.DeviceOrientationControls = function ( object ) {\n\n\tvar scope = this;\n\n\tthis.object = object;\n\n\tthis.object.rotation.reorder( \"YXZ\" );\n\n\tthis.freeze = true;\n\n\tthis.deviceOrientation = {};\n\n\tthis.screenOrientation = 0;\n\n\tvar onDeviceOrientationChangeEvent = function ( event ) {\n\n\t\tscope.deviceOrientation = event;\n\n\t};\n\n\tvar onScreenOrientationChangeEvent = function () {\n\n\t\tscope.screenOrientation = window.orientation || 0;\n\n\t};\n\n\t// The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\n\n\tvar setObjectQuaternion = function () {\n\n\t\tvar zee = new THREE.Vector3( 0, 0, 1 );\n\n\t\tvar euler = new THREE.Euler();\n\n\t\tvar q0 = new THREE.Quaternion();\n\n\t\tvar q1 = new THREE.Quaternion( - Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ); // - PI/2 around the x-axis\n\n\t\treturn function ( quaternion, alpha, beta, gamma, orient ) {\n\n\t\t\teuler.set( beta, alpha, - gamma, 'YXZ' ); // 'ZXY' for the device, but 'YXZ' for us\n\n\t\t\tquaternion.setFromEuler( euler ); // orient the device\n\n\t\t\tquaternion.multiply( q1 ); // camera looks out the back of the device, not the top\n\n\t\t\tquaternion.multiply( q0.setFromAxisAngle( zee, - orient ) ); // adjust for screen orientation\n\n\t\t}\n\n\t}();\n\n\tthis.connect = function() {\n\n\t\tonScreenOrientationChangeEvent(); // run once on load\n\n\t\twindow.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\n\t\twindow.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\n\n\t\tscope.freeze = false;\n\n\t};\n\n\tthis.disconnect = function() {\n\n\t\tscope.freeze = true;\n\n\t\twindow.removeEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\n\t\twindow.removeEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\n\n\t};\n\n\tthis.update = function () {\n\n\t\tif ( scope.freeze ) return;\n\n\t\tvar alpha = scope.deviceOrientation.gamma ? THREE.Math.degToRad( scope.deviceOrientation.alpha ) : 0; // Z\n\t\tvar beta = scope.deviceOrientation.beta ? THREE.Math.degToRad( scope.deviceOrientation.beta ) : 0; // X'\n\t\tvar gamma = scope.deviceOrientation.gamma ? THREE.Math.degToRad( scope.deviceOrientation.gamma ) : 0; // Y''\n\t\tvar orient = scope.screenOrientation ? THREE.Math.degToRad( scope.screenOrientation ) : 0; // O\n\n\t\tsetObjectQuaternion( scope.object.quaternion, alpha, beta, gamma, orient );\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/EditorControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/EditorControls.js",
"module-type": "library",
"text": "/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nTHREE.EditorControls = function ( object, domElement ) {\n\n\tdomElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// API\n\n\tthis.enabled = true;\n\tthis.center = new THREE.Vector3();\n\n\t// internals\n\n\tvar scope = this;\n\tvar vector = new THREE.Vector3();\n\n\tvar STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2 };\n\tvar state = STATE.NONE;\n\n\tvar center = this.center;\n\tvar normalMatrix = new THREE.Matrix3();\n\tvar pointer = new THREE.Vector2();\n\tvar pointerOld = new THREE.Vector2();\n\n\t// events\n\n\tvar changeEvent = { type: 'change' };\n\n\tthis.focus = function ( target, frame ) {\n\n\t\tvar scale = new THREE.Vector3();\n\t\ttarget.matrixWorld.decompose( center, new THREE.Quaternion(), scale );\n\n\t\tif ( frame && target.geometry ) {\n\n\t\t\tscale = ( scale.x + scale.y + scale.z ) / 3;\n\t\t\tcenter.add(target.geometry.boundingSphere.center.clone().multiplyScalar( scale ));\n\t\t\tvar radius = target.geometry.boundingSphere.radius * ( scale );\n\t\t\tvar pos = object.position.clone().sub( center ).normalize().multiplyScalar( radius * 2 );\n\t\t\tobject.position.copy( center ).add( pos );\n\n\t\t}\n\n\t\tobject.lookAt( center );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\tthis.pan = function ( distance ) {\n\n\t\tnormalMatrix.getNormalMatrix( object.matrix );\n\n\t\tdistance.applyMatrix3( normalMatrix );\n\t\tdistance.multiplyScalar( vector.copy( center ).sub( object.position ).length() * 0.001 );\n\n\t\tobject.position.add( distance );\n\t\tcenter.add( distance );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\tthis.zoom = function ( distance ) {\n\n\t\tnormalMatrix.getNormalMatrix( object.matrix );\n\n\t\tdistance.applyMatrix3( normalMatrix );\n\t\tdistance.multiplyScalar( vector.copy( center ).sub( object.position ).length() * 0.001 );\n\n\t\tobject.position.add( distance );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\tthis.rotate = function ( delta ) {\n\n\t\tvector.copy( object.position ).sub( center );\n\n\t\tvar theta = Math.atan2( vector.x, vector.z );\n\t\tvar phi = Math.atan2( Math.sqrt( vector.x * vector.x + vector.z * vector.z ), vector.y );\n\n\t\ttheta += delta.x;\n\t\tphi += delta.y;\n\n\t\tvar EPS = 0.000001;\n\n\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\tvar radius = vector.length();\n\n\t\tvector.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\tvector.y = radius * Math.cos( phi );\n\t\tvector.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\tobject.position.copy( center ).add( vector );\n\n\t\tobject.lookAt( center );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\t// mouse\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === 0 ) {\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === 1 ) {\n\n\t\t\tstate = STATE.ZOOM;\n\n\t\t} else if ( event.button === 2 ) {\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tpointerOld.set( event.clientX, event.clientY );\n\n\t\tdomElement.addEventListener( 'mousemove', onMouseMove, false );\n\t\tdomElement.addEventListener( 'mouseup', onMouseUp, false );\n\t\tdomElement.addEventListener( 'mouseout', onMouseUp, false );\n\t\tdomElement.addEventListener( 'dblclick', onMouseUp, false );\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tpointer.set( event.clientX, event.clientY );\n\n\t\tvar movementX = pointer.x - pointerOld.x;\n\t\tvar movementY = pointer.y - pointerOld.y;\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tscope.rotate( new THREE.Vector3( - movementX * 0.005, - movementY * 0.005, 0 ) );\n\n\t\t} else if ( state === STATE.ZOOM ) {\n\n\t\t\tscope.zoom( new THREE.Vector3( 0, 0, movementY ) );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tscope.pan( new THREE.Vector3( - movementX, movementY, 0 ) );\n\n\t\t}\n\n\t\tpointerOld.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tdomElement.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdomElement.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdomElement.removeEventListener( 'mouseout', onMouseUp, false );\n\t\tdomElement.removeEventListener( 'dblclick', onMouseUp, false );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\t// if ( scope.enabled === false ) return;\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta ) { // WebKit / Opera / Explorer 9\n\n\t\t\tdelta = - event.wheelDelta;\n\n\t\t} else if ( event.detail ) { // Firefox\n\n\t\t\tdelta = event.detail * 10;\n\n\t\t}\n\n\t\tscope.zoom( new THREE.Vector3( 0, 0, delta ) );\n\n\t}\n\n\tdomElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\tdomElement.addEventListener( 'mousedown', onMouseDown, false );\n\tdomElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tdomElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox\n\n\t// touch\n\n\tvar touch = new THREE.Vector3();\n\n\tvar touches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\n\tvar prevTouches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\n\n\tvar prevDistance = null;\n\n\tfunction touchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 1 ].pageX, event.touches[ 1 ].pageY, 0 );\n\t\t\t\tprevDistance = touches[ 0 ].distanceTo( touches[ 1 ] );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tprevTouches[ 0 ].copy( touches[ 0 ] );\n\t\tprevTouches[ 1 ].copy( touches[ 1 ] );\n\n\t}\n\n\n\tfunction touchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar getClosest = function( touch, touches ) {\n\n\t\t\tvar closest = touches[ 0 ];\n\n\t\t\tfor ( var i in touches ) {\n\t\t\t\tif ( closest.distanceTo(touch) > touches[ i ].distanceTo(touch) ) closest = touches[ i ];\n\t\t\t}\n\n\t\t\treturn closest;\n\n\t\t}\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\tscope.rotate( touches[ 0 ].sub( getClosest( touches[ 0 ] ,prevTouches ) ).multiplyScalar( - 0.005 ) );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 1 ].pageX, event.touches[ 1 ].pageY, 0 );\n\t\t\t\tdistance = touches[ 0 ].distanceTo( touches[ 1 ] );\n\t\t\t\tscope.zoom( new THREE.Vector3( 0, 0, prevDistance - distance ) );\n\t\t\t\tprevDistance = distance;\n\n\n\t\t\t\tvar offset0 = touches[ 0 ].clone().sub( getClosest( touches[ 0 ] ,prevTouches ) );\n\t\t\t\tvar offset1 = touches[ 1 ].clone().sub( getClosest( touches[ 1 ] ,prevTouches ) );\n\t\t\t\toffset0.x = -offset0.x;\n\t\t\t\toffset1.x = -offset1.x;\n\n\t\t\t\tscope.pan( offset0.add( offset1 ).multiplyScalar( 0.5 ) );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tprevTouches[ 0 ].copy( touches[ 0 ] );\n\t\tprevTouches[ 1 ].copy( touches[ 1 ] );\n\n\t}\n\n\tdomElement.addEventListener( 'touchstart', touchStart, false );\n\tdomElement.addEventListener( 'touchmove', touchMove, false );\n\n};\n\nTHREE.EditorControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/FirstPersonControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/FirstPersonControls.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author paulirish / http://paulirish.com/\n */\n\nTHREE.FirstPersonControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\tthis.target = new THREE.Vector3( 0, 0, 0 );\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\tthis.movementSpeed = 1.0;\n\tthis.lookSpeed = 0.005;\n\n\tthis.lookVertical = true;\n\tthis.autoForward = false;\n\t// this.invertVertical = false;\n\n\tthis.activeLook = true;\n\n\tthis.heightSpeed = false;\n\tthis.heightCoef = 1.0;\n\tthis.heightMin = 0.0;\n\tthis.heightMax = 1.0;\n\n\tthis.constrainVertical = false;\n\tthis.verticalMin = 0;\n\tthis.verticalMax = Math.PI;\n\n\tthis.autoSpeedFactor = 0.0;\n\n\tthis.mouseX = 0;\n\tthis.mouseY = 0;\n\n\tthis.lat = 0;\n\tthis.lon = 0;\n\tthis.phi = 0;\n\tthis.theta = 0;\n\n\tthis.moveForward = false;\n\tthis.moveBackward = false;\n\tthis.moveLeft = false;\n\tthis.moveRight = false;\n\tthis.freeze = false;\n\n\tthis.mouseDragOn = false;\n\n\tthis.viewHalfX = 0;\n\tthis.viewHalfY = 0;\n\n\tif ( this.domElement !== document ) {\n\n\t\tthis.domElement.setAttribute( 'tabindex', -1 );\n\n\t}\n\n\t//\n\n\tthis.handleResize = function () {\n\n\t\tif ( this.domElement === document ) {\n\n\t\t\tthis.viewHalfX = window.innerWidth / 2;\n\t\t\tthis.viewHalfY = window.innerHeight / 2;\n\n\t\t} else {\n\n\t\t\tthis.viewHalfX = this.domElement.offsetWidth / 2;\n\t\t\tthis.viewHalfY = this.domElement.offsetHeight / 2;\n\n\t\t}\n\n\t};\n\n\tthis.onMouseDown = function ( event ) {\n\n\t\tif ( this.domElement !== document ) {\n\n\t\t\tthis.domElement.focus();\n\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( this.activeLook ) {\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0: this.moveForward = true; break;\n\t\t\t\tcase 2: this.moveBackward = true; break;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.mouseDragOn = true;\n\n\t};\n\n\tthis.onMouseUp = function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( this.activeLook ) {\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0: this.moveForward = false; break;\n\t\t\t\tcase 2: this.moveBackward = false; break;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.mouseDragOn = false;\n\n\t};\n\n\tthis.onMouseMove = function ( event ) {\n\n\t\tif ( this.domElement === document ) {\n\n\t\t\tthis.mouseX = event.pageX - this.viewHalfX;\n\t\t\tthis.mouseY = event.pageY - this.viewHalfY;\n\n\t\t} else {\n\n\t\t\tthis.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX;\n\t\t\tthis.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY;\n\n\t\t}\n\n\t};\n\n\tthis.onKeyDown = function ( event ) {\n\n\t\t//event.preventDefault();\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase 38: /*up*/\n\t\t\tcase 87: /*W*/ this.moveForward = true; break;\n\n\t\t\tcase 37: /*left*/\n\t\t\tcase 65: /*A*/ this.moveLeft = true; break;\n\n\t\t\tcase 40: /*down*/\n\t\t\tcase 83: /*S*/ this.moveBackward = true; break;\n\n\t\t\tcase 39: /*right*/\n\t\t\tcase 68: /*D*/ this.moveRight = true; break;\n\n\t\t\tcase 82: /*R*/ this.moveUp = true; break;\n\t\t\tcase 70: /*F*/ this.moveDown = true; break;\n\n\t\t\tcase 81: /*Q*/ this.freeze = !this.freeze; break;\n\n\t\t}\n\n\t};\n\n\tthis.onKeyUp = function ( event ) {\n\n\t\tswitch( event.keyCode ) {\n\n\t\t\tcase 38: /*up*/\n\t\t\tcase 87: /*W*/ this.moveForward = false; break;\n\n\t\t\tcase 37: /*left*/\n\t\t\tcase 65: /*A*/ this.moveLeft = false; break;\n\n\t\t\tcase 40: /*down*/\n\t\t\tcase 83: /*S*/ this.moveBackward = false; break;\n\n\t\t\tcase 39: /*right*/\n\t\t\tcase 68: /*D*/ this.moveRight = false; break;\n\n\t\t\tcase 82: /*R*/ this.moveUp = false; break;\n\t\t\tcase 70: /*F*/ this.moveDown = false; break;\n\n\t\t}\n\n\t};\n\n\tthis.update = function( delta ) {\n\n\t\tif ( this.freeze ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.heightSpeed ) {\n\n\t\t\tvar y = THREE.Math.clamp( this.object.position.y, this.heightMin, this.heightMax );\n\t\t\tvar heightDelta = y - this.heightMin;\n\n\t\t\tthis.autoSpeedFactor = delta * ( heightDelta * this.heightCoef );\n\n\t\t} else {\n\n\t\t\tthis.autoSpeedFactor = 0.0;\n\n\t\t}\n\n\t\tvar actualMoveSpeed = delta * this.movementSpeed;\n\n\t\tif ( this.moveForward || ( this.autoForward && !this.moveBackward ) ) this.object.translateZ( - ( actualMoveSpeed + this.autoSpeedFactor ) );\n\t\tif ( this.moveBackward ) this.object.translateZ( actualMoveSpeed );\n\n\t\tif ( this.moveLeft ) this.object.translateX( - actualMoveSpeed );\n\t\tif ( this.moveRight ) this.object.translateX( actualMoveSpeed );\n\n\t\tif ( this.moveUp ) this.object.translateY( actualMoveSpeed );\n\t\tif ( this.moveDown ) this.object.translateY( - actualMoveSpeed );\n\n\t\tvar actualLookSpeed = delta * this.lookSpeed;\n\n\t\tif ( !this.activeLook ) {\n\n\t\t\tactualLookSpeed = 0;\n\n\t\t}\n\n\t\tvar verticalLookRatio = 1;\n\n\t\tif ( this.constrainVertical ) {\n\n\t\t\tverticalLookRatio = Math.PI / ( this.verticalMax - this.verticalMin );\n\n\t\t}\n\n\t\tthis.lon += this.mouseX * actualLookSpeed;\n\t\tif( this.lookVertical ) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio;\n\n\t\tthis.lat = Math.max( - 85, Math.min( 85, this.lat ) );\n\t\tthis.phi = THREE.Math.degToRad( 90 - this.lat );\n\n\t\tthis.theta = THREE.Math.degToRad( this.lon );\n\n\t\tif ( this.constrainVertical ) {\n\n\t\t\tthis.phi = THREE.Math.mapLinear( this.phi, 0, Math.PI, this.verticalMin, this.verticalMax );\n\n\t\t}\n\n\t\tvar targetPosition = this.target,\n\t\t\tposition = this.object.position;\n\n\t\ttargetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta );\n\t\ttargetPosition.y = position.y + 100 * Math.cos( this.phi );\n\t\ttargetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta );\n\n\t\tthis.object.lookAt( targetPosition );\n\n\t};\n\n\n\tthis.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\n\tthis.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false );\n\tthis.domElement.addEventListener( 'mousedown', bind( this, this.onMouseDown ), false );\n\tthis.domElement.addEventListener( 'mouseup', bind( this, this.onMouseUp ), false );\n\t\n\twindow.addEventListener( 'keydown', bind( this, this.onKeyDown ), false );\n\twindow.addEventListener( 'keyup', bind( this, this.onKeyUp ), false );\n\n\tfunction bind( scope, fn ) {\n\n\t\treturn function () {\n\n\t\t\tfn.apply( scope, arguments );\n\n\t\t};\n\n\t};\n\n\tthis.handleResize();\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/FlyControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/FlyControls.js",
"module-type": "library",
"text": "/**\n * @author James Baicoianu / http://www.baicoianu.com/\n */\n\nTHREE.FlyControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\tif ( domElement ) this.domElement.setAttribute( 'tabindex', -1 );\n\n\t// API\n\n\tthis.movementSpeed = 1.0;\n\tthis.rollSpeed = 0.005;\n\n\tthis.dragToLook = false;\n\tthis.autoForward = false;\n\n\t// disable default target object behavior\n\n\t// internals\n\n\tthis.tmpQuaternion = new THREE.Quaternion();\n\n\tthis.mouseStatus = 0;\n\n\tthis.moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0, pitchUp: 0, pitchDown: 0, yawLeft: 0, yawRight: 0, rollLeft: 0, rollRight: 0 };\n\tthis.moveVector = new THREE.Vector3( 0, 0, 0 );\n\tthis.rotationVector = new THREE.Vector3( 0, 0, 0 );\n\n\tthis.handleEvent = function ( event ) {\n\n\t\tif ( typeof this[ event.type ] == 'function' ) {\n\n\t\t\tthis[ event.type ]( event );\n\n\t\t}\n\n\t};\n\n\tthis.keydown = function( event ) {\n\n\t\tif ( event.altKey ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//event.preventDefault();\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase 16: /* shift */ this.movementSpeedMultiplier = .1; break;\n\n\t\t\tcase 87: /*W*/ this.moveState.forward = 1; break;\n\t\t\tcase 83: /*S*/ this.moveState.back = 1; break;\n\n\t\t\tcase 65: /*A*/ this.moveState.left = 1; break;\n\t\t\tcase 68: /*D*/ this.moveState.right = 1; break;\n\n\t\t\tcase 82: /*R*/ this.moveState.up = 1; break;\n\t\t\tcase 70: /*F*/ this.moveState.down = 1; break;\n\n\t\t\tcase 38: /*up*/ this.moveState.pitchUp = 1; break;\n\t\t\tcase 40: /*down*/ this.moveState.pitchDown = 1; break;\n\n\t\t\tcase 37: /*left*/ this.moveState.yawLeft = 1; break;\n\t\t\tcase 39: /*right*/ this.moveState.yawRight = 1; break;\n\n\t\t\tcase 81: /*Q*/ this.moveState.rollLeft = 1; break;\n\t\t\tcase 69: /*E*/ this.moveState.rollRight = 1; break;\n\n\t\t}\n\n\t\tthis.updateMovementVector();\n\t\tthis.updateRotationVector();\n\n\t};\n\n\tthis.keyup = function( event ) {\n\n\t\tswitch( event.keyCode ) {\n\n\t\t\tcase 16: /* shift */ this.movementSpeedMultiplier = 1; break;\n\n\t\t\tcase 87: /*W*/ this.moveState.forward = 0; break;\n\t\t\tcase 83: /*S*/ this.moveState.back = 0; break;\n\n\t\t\tcase 65: /*A*/ this.moveState.left = 0; break;\n\t\t\tcase 68: /*D*/ this.moveState.right = 0; break;\n\n\t\t\tcase 82: /*R*/ this.moveState.up = 0; break;\n\t\t\tcase 70: /*F*/ this.moveState.down = 0; break;\n\n\t\t\tcase 38: /*up*/ this.moveState.pitchUp = 0; break;\n\t\t\tcase 40: /*down*/ this.moveState.pitchDown = 0; break;\n\n\t\t\tcase 37: /*left*/ this.moveState.yawLeft = 0; break;\n\t\t\tcase 39: /*right*/ this.moveState.yawRight = 0; break;\n\n\t\t\tcase 81: /*Q*/ this.moveState.rollLeft = 0; break;\n\t\t\tcase 69: /*E*/ this.moveState.rollRight = 0; break;\n\n\t\t}\n\n\t\tthis.updateMovementVector();\n\t\tthis.updateRotationVector();\n\n\t};\n\n\tthis.mousedown = function( event ) {\n\n\t\tif ( this.domElement !== document ) {\n\n\t\t\tthis.domElement.focus();\n\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( this.dragToLook ) {\n\n\t\t\tthis.mouseStatus ++;\n\n\t\t} else {\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0: this.moveState.forward = 1; break;\n\t\t\t\tcase 2: this.moveState.back = 1; break;\n\n\t\t\t}\n\n\t\t\tthis.updateMovementVector();\n\n\t\t}\n\n\t};\n\n\tthis.mousemove = function( event ) {\n\n\t\tif ( !this.dragToLook || this.mouseStatus > 0 ) {\n\n\t\t\tvar container = this.getContainerDimensions();\n\t\t\tvar halfWidth = container.size[ 0 ] / 2;\n\t\t\tvar halfHeight = container.size[ 1 ] / 2;\n\n\t\t\tthis.moveState.yawLeft = - ( ( event.pageX - container.offset[ 0 ] ) - halfWidth ) / halfWidth;\n\t\t\tthis.moveState.pitchDown = ( ( event.pageY - container.offset[ 1 ] ) - halfHeight ) / halfHeight;\n\n\t\t\tthis.updateRotationVector();\n\n\t\t}\n\n\t};\n\n\tthis.mouseup = function( event ) {\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( this.dragToLook ) {\n\n\t\t\tthis.mouseStatus --;\n\n\t\t\tthis.moveState.yawLeft = this.moveState.pitchDown = 0;\n\n\t\t} else {\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0: this.moveState.forward = 0; break;\n\t\t\t\tcase 2: this.moveState.back = 0; break;\n\n\t\t\t}\n\n\t\t\tthis.updateMovementVector();\n\n\t\t}\n\n\t\tthis.updateRotationVector();\n\n\t};\n\n\tthis.update = function( delta ) {\n\n\t\tvar moveMult = delta * this.movementSpeed;\n\t\tvar rotMult = delta * this.rollSpeed;\n\n\t\tthis.object.translateX( this.moveVector.x * moveMult );\n\t\tthis.object.translateY( this.moveVector.y * moveMult );\n\t\tthis.object.translateZ( this.moveVector.z * moveMult );\n\n\t\tthis.tmpQuaternion.set( this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1 ).normalize();\n\t\tthis.object.quaternion.multiply( this.tmpQuaternion );\n\n\t\t// expose the rotation vector for convenience\n\t\tthis.object.rotation.setFromQuaternion( this.object.quaternion, this.object.rotation.order );\n\n\n\t};\n\n\tthis.updateMovementVector = function() {\n\n\t\tvar forward = ( this.moveState.forward || ( this.autoForward && !this.moveState.back ) ) ? 1 : 0;\n\n\t\tthis.moveVector.x = ( -this.moveState.left + this.moveState.right );\n\t\tthis.moveVector.y = ( -this.moveState.down + this.moveState.up );\n\t\tthis.moveVector.z = ( -forward + this.moveState.back );\n\n\t\t//console.log( 'move:', [ this.moveVector.x, this.moveVector.y, this.moveVector.z ] );\n\n\t};\n\n\tthis.updateRotationVector = function() {\n\n\t\tthis.rotationVector.x = ( -this.moveState.pitchDown + this.moveState.pitchUp );\n\t\tthis.rotationVector.y = ( -this.moveState.yawRight + this.moveState.yawLeft );\n\t\tthis.rotationVector.z = ( -this.moveState.rollRight + this.moveState.rollLeft );\n\n\t\t//console.log( 'rotate:', [ this.rotationVector.x, this.rotationVector.y, this.rotationVector.z ] );\n\n\t};\n\n\tthis.getContainerDimensions = function() {\n\n\t\tif ( this.domElement != document ) {\n\n\t\t\treturn {\n\t\t\t\tsize\t: [ this.domElement.offsetWidth, this.domElement.offsetHeight ],\n\t\t\t\toffset\t: [ this.domElement.offsetLeft, this.domElement.offsetTop ]\n\t\t\t};\n\n\t\t} else {\n\n\t\t\treturn {\n\t\t\t\tsize\t: [ window.innerWidth, window.innerHeight ],\n\t\t\t\toffset\t: [ 0, 0 ]\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\tfunction bind( scope, fn ) {\n\n\t\treturn function () {\n\n\t\t\tfn.apply( scope, arguments );\n\n\t\t};\n\n\t};\n\n\tthis.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\n\tthis.domElement.addEventListener( 'mousemove', bind( this, this.mousemove ), false );\n\tthis.domElement.addEventListener( 'mousedown', bind( this, this.mousedown ), false );\n\tthis.domElement.addEventListener( 'mouseup', bind( this, this.mouseup ), false );\n\n\twindow.addEventListener( 'keydown', bind( this, this.keydown ), false );\n\twindow.addEventListener( 'keyup', bind( this, this.keyup ), false );\n\n\tthis.updateMovementVector();\n\tthis.updateRotationVector();\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/OculusControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/OculusControls.js",
"module-type": "library",
"text": "/**\n * @author possan / http://possan.se/\n *\n * Oculus headtracking control\n * - use together with the oculus-rest project to get headtracking\n * coordinates from the rift: http://github.com/possan/oculus-rest\n */\n\nTHREE.OculusControls = function ( object ) {\n\n\tthis.object = object;\n\tthis.target = new THREE.Vector3( 0, 0, 0 );\n\n\tthis.headquat = new THREE.Quaternion();\n\tthis.freeze = false;\n\n\tthis.loadAjaxJSON = function ( url, callback ) {\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.onreadystatechange = function () {\n\t\t\tif ( xhr.readyState === xhr.DONE ) {\n\t\t\t\tif ( xhr.status === 200 || xhr.status === 0 ) {\n\t\t\t\t\tif ( xhr.responseText ) {\n\t\t\t\t\t\tvar json = JSON.parse( xhr.responseText );\n\t\t\t\t\t\tcallback( json );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.open( \"GET\", url, true );\n\t\txhr.withCredentials = false;\n\t\txhr.send( null );\n\t};\n\n\tthis.gotCoordinates = function( r ) {\n\t\tthis.headquat.set(r.quat.x, r.quat.y, r.quat.z, r.quat.w);\n\t\tthis.queuePoll();\n\t}\n\n\tthis.pollOnce = function() {\n\t\tthis.loadAjaxJSON('http://localhost:50000', bind(this, this.gotCoordinates));\n\t}\n\n\tthis.queuePoll = function() {\n\t\tsetTimeout(bind(this, this.pollOnce), 10);\n\t}\n\n\tthis.update = function( delta ) {\n\t\tif ( this.freeze ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.object.quaternion.multiply(this.headquat);\n\t};\n\n\tfunction bind( scope, fn ) {\n\t\treturn function () {\n\t\t\tfn.apply( scope, arguments );\n\t\t};\n\t};\n\n\tthis.connect = function() {\n\t\tthis.queuePoll();\n\t};\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/OrbitControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/OrbitControls.js",
"module-type": "library",
"text": "/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n/*global THREE, console */\n\n// This set of controls performs orbiting, dollying (zooming), and panning. It maintains\n// the \"up\" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is\n// supported.\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n//\n// This is a drop-in replacement for (most) TrackballControls used in examples.\n// That is, include this js file and wherever you see:\n// \tcontrols = new THREE.TrackballControls( camera );\n// controls.target.z = 150;\n// Simple substitute \"OrbitControls\" and the control should work as-is.\n\nTHREE.OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// API\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the control orbits around\n\t// and where it pans with respect to.\n\tthis.target = new THREE.Vector3();\n\n\t// center is old, deprecated; use \"target\" instead\n\tthis.center = this.target;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for\n\t// backwards compatibility\n\tthis.noZoom = false;\n\tthis.zoomSpeed = 1.0;\n\n\t// Limits to how far you can dolly in and out\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// Set to true to disable this control\n\tthis.noRotate = false;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to true to disable this control\n\tthis.noPan = false;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// Set to true to disable use of the keys\n\tthis.noKeys = false;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t////////////\n\t// internals\n\n\tvar scope = this;\n\n\tvar EPS = 0.000001;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\tvar panOffset = new THREE.Vector3();\n\n\tvar offset = new THREE.Vector3();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tvar phiDelta = 0;\n\tvar thetaDelta = 0;\n\tvar scale = 1;\n\tvar pan = new THREE.Vector3();\n\n\tvar lastPosition = new THREE.Vector3();\n\tvar lastQuaternion = new THREE.Quaternion();\n\n\tvar STATE = { NONE : -1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\t// for reset\n\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\n\t// so camera.up is the orbit axis\n\n\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\tvar quatInverse = quat.clone().inverse();\n\n\t// events\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start'};\n\tvar endEvent = { type: 'end'};\n\n\tthis.rotateLeft = function ( angle ) {\n\n\t\tif ( angle === undefined ) {\n\n\t\t\tangle = getAutoRotationAngle();\n\n\t\t}\n\n\t\tthetaDelta -= angle;\n\n\t};\n\n\tthis.rotateUp = function ( angle ) {\n\n\t\tif ( angle === undefined ) {\n\n\t\t\tangle = getAutoRotationAngle();\n\n\t\t}\n\n\t\tphiDelta -= angle;\n\n\t};\n\n\t// pass in distance in world space to move left\n\tthis.panLeft = function ( distance ) {\n\n\t\tvar te = this.object.matrix.elements;\n\n\t\t// get X column of matrix\n\t\tpanOffset.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n\t\tpanOffset.multiplyScalar( - distance );\n\t\t\n\t\tpan.add( panOffset );\n\n\t};\n\n\t// pass in distance in world space to move up\n\tthis.panUp = function ( distance ) {\n\n\t\tvar te = this.object.matrix.elements;\n\n\t\t// get Y column of matrix\n\t\tpanOffset.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n\t\tpanOffset.multiplyScalar( distance );\n\t\t\n\t\tpan.add( panOffset );\n\n\t};\n\t\n\t// pass in x,y of change desired in pixel space,\n\t// right and down are positive\n\tthis.pan = function ( deltaX, deltaY ) {\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\tif ( scope.object.fov !== undefined ) {\n\n\t\t\t// perspective\n\t\t\tvar position = scope.object.position;\n\t\t\tvar offset = position.clone().sub( scope.target );\n\t\t\tvar targetDistance = offset.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\tscope.panLeft( 2 * deltaX * targetDistance / element.clientHeight );\n\t\t\tscope.panUp( 2 * deltaY * targetDistance / element.clientHeight );\n\n\t\t} else if ( scope.object.top !== undefined ) {\n\n\t\t\t// orthographic\n\t\t\tscope.panLeft( deltaX * (scope.object.right - scope.object.left) / element.clientWidth );\n\t\t\tscope.panUp( deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic or perspective\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\n\t\t}\n\n\t};\n\n\tthis.dollyIn = function ( dollyScale ) {\n\n\t\tif ( dollyScale === undefined ) {\n\n\t\t\tdollyScale = getZoomScale();\n\n\t\t}\n\n\t\tscale /= dollyScale;\n\n\t};\n\n\tthis.dollyOut = function ( dollyScale ) {\n\n\t\tif ( dollyScale === undefined ) {\n\n\t\t\tdollyScale = getZoomScale();\n\n\t\t}\n\n\t\tscale *= dollyScale;\n\n\t};\n\n\tthis.update = function () {\n\n\t\tvar position = this.object.position;\n\n\t\toffset.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"y-axis-is-up\" space\n\t\toffset.applyQuaternion( quat );\n\n\t\t// angle from z-axis around y-axis\n\n\t\tvar theta = Math.atan2( offset.x, offset.z );\n\n\t\t// angle from y-axis\n\n\t\tvar phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\n\t\tif ( this.autoRotate ) {\n\n\t\t\tthis.rotateLeft( getAutoRotationAngle() );\n\n\t\t}\n\n\t\ttheta += thetaDelta;\n\t\tphi += phiDelta;\n\n\t\t// restrict phi to be between desired limits\n\t\tphi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) );\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\tvar radius = offset.length() * scale;\n\n\t\t// restrict radius to be between desired limits\n\t\tradius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) );\n\t\t\n\t\t// move target to panned location\n\t\tthis.target.add( pan );\n\n\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\toffset.y = radius * Math.cos( phi );\n\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\toffset.applyQuaternion( quatInverse );\n\n\t\tposition.copy( this.target ).add( offset );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tthetaDelta = 0;\n\t\tphiDelta = 0;\n\t\tscale = 1;\n\t\tpan.set( 0, 0, 0 );\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( lastPosition.distanceToSquared( this.object.position ) > EPS\n\t\t || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS ) {\n\n\t\t\tthis.dispatchEvent( changeEvent );\n\n\t\t\tlastPosition.copy( this.object.position );\n\t\t\tlastQuaternion.copy (this.object.quaternion );\n\n\t\t}\n\n\t};\n\n\n\tthis.reset = function () {\n\n\t\tstate = STATE.NONE;\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\n\t\tthis.update();\n\n\t};\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === 0 ) {\n\t\t\tif ( scope.noRotate === true ) return;\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t} else if ( event.button === 1 ) {\n\t\t\tif ( scope.noZoom === true ) return;\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t} else if ( event.button === 2 ) {\n\t\t\tif ( scope.noPan === true ) return;\n\n\t\t\tstate = STATE.PAN;\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\tscope.dispatchEvent( startEvent );\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.noRotate === true ) return;\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\tscope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\tscope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.noZoom === true ) return;\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tscope.dollyIn();\n\n\t\t\t} else {\n\n\t\t\t\tscope.dollyOut();\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.noPan === true ) return;\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\t\t\t\n\t\t\tscope.pan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction onMouseUp( /* event */ ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tscope.dispatchEvent( endEvent );\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.noZoom === true ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) { // WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) { // Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tscope.dollyOut();\n\n\t\t} else {\n\n\t\t\tscope.dollyIn();\n\n\t\t}\n\n\t\tscope.update();\n\t\tscope.dispatchEvent( startEvent );\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.noKeys === true || scope.noPan === true ) return;\n\t\t\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tscope.pan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tscope.pan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tscope.pan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tscope.pan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction touchstart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.noRotate === true ) return;\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.noZoom === true ) return;\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\t\t\t\tdollyStart.set( 0, distance );\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.noPan === true ) return;\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tscope.dispatchEvent( startEvent );\n\n\t}\n\n\tfunction touchmove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.noRotate === true ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return;\n\n\t\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\t\tscope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\t\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\t\tscope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.noZoom === true ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return;\n\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\t\tdollyEnd.set( 0, distance );\n\t\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\t\tscope.dollyOut();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tscope.dollyIn();\n\n\t\t\t\t}\n\n\t\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.noPan === true ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return;\n\n\t\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tpanDelta.subVectors( panEnd, panStart );\n\t\t\t\t\n\t\t\t\tscope.pan( panDelta.x, panDelta.y );\n\n\t\t\t\tpanStart.copy( panEnd );\n\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction touchend( /* event */ ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tscope.dispatchEvent( endEvent );\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tthis.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\tthis.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tthis.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tthis.domElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox\n\n\tthis.domElement.addEventListener( 'touchstart', touchstart, false );\n\tthis.domElement.addEventListener( 'touchend', touchend, false );\n\tthis.domElement.addEventListener( 'touchmove', touchmove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\tthis.update();\n\n};\n\nTHREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/OrbitZControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/OrbitZControls.js",
"module-type": "library",
"text": "/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n *\n * cook for adaptation to Z up (initially Y up).\n */\n/*global THREE, console */\n\n// This set of controls performs orbiting, dollying (zooming), and panning. It maintains\n// the \"up\" direction as +Z. Touch on tablet and phones is supported (but not tested, sorry).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nTHREE.OrbitZControls = function ( object, domElement ) {\n var func = \"THREE.OrbitZControls\";\n flagLog = false;\n logPoint = function(p) {return \"\"+p.x+\", \"+p.y+\", \"+p.z;};\n\n\tthis.object = object;\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n if (flagLog) console.log(func+\": object.position = \"+logPoint(this.object.position));\n if (flagLog) console.log(func+\": object.up = \"+logPoint(this.object.up));\n\n\t// API\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the control orbits around\n\t// and where it pans with respect to.\n\tthis.target = new THREE.Vector3();\n\n\t// center is old, deprecated; use \"target\" instead\n\tthis.center = this.target;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for\n\t// backwards compatibility\n\tthis.noZoom = false;\n\tthis.zoomSpeed = 1.0;\n\n\t// Limits to how far you can dolly in and out\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// Set to true to disable this control\n\tthis.noRotate = false;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to true to disable this control\n\tthis.noPan = false;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// Set to true to disable use of the keys\n\tthis.noKeys = false;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t////////////\n\t// internals\n\n\tvar scope = this;\n\n\tvar EPS = 0.000001;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\tvar panOffset = new THREE.Vector3();\n\n\tvar offset = new THREE.Vector3();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tvar phiDelta = 0;\n\tvar thetaDelta = 0;\n\tvar scale = 1;\n\tvar pan = new THREE.Vector3();\n\n\tvar lastPosition = new THREE.Vector3();\n\tvar lastQuaternion = new THREE.Quaternion();\n\n\tvar STATE = { NONE : -1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\t// for reset\n\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\n\t// so camera.up is the orbit axis\n\n\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 0, 1 ) );\n\tvar quatInverse = quat.clone().inverse();\n\n\t// events\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start'};\n\tvar endEvent = { type: 'end'};\n\n\tthis.rotateLeft = function ( angle ) {\n\n\t\tif ( angle === undefined ) {\n\n\t\t\tangle = getAutoRotationAngle();\n\n\t\t}\n\n\t\tthetaDelta -= angle;\n\n\t};\n\n\tthis.rotateUp = function ( angle ) {\n\n\t\tif ( angle === undefined ) {\n\n\t\t\tangle = getAutoRotationAngle();\n\n\t\t}\n\n\t\tphiDelta -= angle;\n\n\t};\n\n\t// pass in distance in world space to move left\n\tthis.panLeft = function ( distance ) {\n\n\t\tvar te = this.object.matrix.elements;\n\n\t\t// get X column of matrix\n\t\tpanOffset.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n\t\tpanOffset.multiplyScalar( - distance );\n\t\t\n\t\tpan.add( panOffset );\n\n\t};\n\n\t// pass in distance in world space to move up\n\tthis.panUp = function ( distance ) {\n\n\t\tvar te = this.object.matrix.elements;\n\n\t\t// get Z column of matrix\n\t\tpanOffset.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n\t\tpanOffset.multiplyScalar( distance );\n\t\t\n\t\tpan.add( panOffset );\n\n\t};\n\t\n\t// pass in x,y of change desired in pixel space,\n\t// right and down are positive\n\tthis.pan = function ( deltaX, deltaY ) {\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\tif ( scope.object.fov !== undefined ) {\n\n\t\t\t// perspective\n\t\t\tvar position = scope.object.position;\n\t\t\tvar offset = position.clone().sub( scope.target );\n\t\t\tvar targetDistance = offset.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\tscope.panLeft( 2 * deltaX * targetDistance / element.clientHeight );\n\t\t\tscope.panUp( 2 * deltaY * targetDistance / element.clientHeight );\n\n\t\t} else if ( scope.object.top !== undefined ) {\n\n\t\t\t// orthographic\n\t\t\tscope.panLeft( deltaX * (scope.object.right - scope.object.left) / element.clientWidth );\n\t\t\tscope.panUp( deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic or perspective\n\t\t\tconsole.warn( 'WARNING: OrbitZControls.js encountered an unknown camera type - pan disabled.' );\n\n\t\t}\n\n\t};\n\n\tthis.dollyIn = function ( dollyScale ) {\n\n\t\tif ( dollyScale === undefined ) {\n\n\t\t\tdollyScale = getZoomScale();\n\n\t\t}\n\n\t\tscale /= dollyScale;\n\n\t};\n\n\tthis.dollyOut = function ( dollyScale ) {\n\n\t\tif ( dollyScale === undefined ) {\n\n\t\t\tdollyScale = getZoomScale();\n\n\t\t}\n\n\t\tscale *= dollyScale;\n\n\t};\n\n\tthis.update = function () {\n var func = \"THREE.OrbitZControls.update\";\n\n if (flagLog) console.log(func+\": ====================\");\n if (flagLog) console.log(func+\": this.target = \"+logPoint(this.target));\n\n\t\tvar position = this.object.position;\n\n\t\toffset.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"z-axis-is-up\" space\n\t\toffset.applyQuaternion( quat );\n\n if (flagLog) console.log(func+\": offset = \"+logPoint(offset));\n\n\t\t// angle from x-axis around z-axis\n\n\t\tvar theta = Math.atan2( offset.y, offset.x );\n\n\t\t// angle from z-axis\n\n\t\tvar phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.y * offset.y ), offset.z );\n\n if (flagLog) console.log(func+\": theta = \"+(theta * 180 / Math.PI)+\" degrés, phi = \"+(phi * 180 / Math.PI)+\" degrés\");\n\n\t\tif ( this.autoRotate ) {\n\n\t\t\tthis.rotateLeft( getAutoRotationAngle() );\n\n\t\t}\n\n\t\ttheta += thetaDelta;\n\t\tphi += phiDelta;\n\n\t\t// restrict phi to be between desired limits\n\t\tphi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) );\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\tvar radius = offset.length() * scale;\n\n\t\t// restrict radius to be between desired limits\n\t\tradius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) );\n\t\t\n\t\t// move target to panned location\n\t\tthis.target.add( pan );\n\n\t\toffset.x = radius * Math.sin( phi ) * Math.cos( theta );\n\t\toffset.z = radius * Math.cos( phi );\n\t\toffset.y = radius * Math.sin( phi ) * Math.sin( theta );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\toffset.applyQuaternion( quatInverse );\n\n\t\tposition.copy( this.target ).add( offset );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tthetaDelta = 0;\n\t\tphiDelta = 0;\n\t\tscale = 1;\n\t\tpan.set( 0, 0, 0 );\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( lastPosition.distanceToSquared( this.object.position ) > EPS\n\t\t || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS ) {\n\n\t\t\tthis.dispatchEvent( changeEvent );\n\n\t\t\tlastPosition.copy( this.object.position );\n\t\t\tlastQuaternion.copy (this.object.quaternion );\n\n\t\t}\n\n\t};\n\n\n\tthis.reset = function () {\n\n\t\tstate = STATE.NONE;\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\n\t\tthis.update();\n\n\t};\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === 0 ) {\n\t\t\tif ( scope.noRotate === true ) return;\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t} else if ( event.button === 1 ) {\n\t\t\tif ( scope.noZoom === true ) return;\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t} else if ( event.button === 2 ) {\n\t\t\tif ( scope.noPan === true ) return;\n\n\t\t\tstate = STATE.PAN;\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\tscope.dispatchEvent( startEvent );\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.noRotate === true ) return;\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\tscope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\tscope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.noZoom === true ) return;\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tscope.dollyIn();\n\n\t\t\t} else {\n\n\t\t\t\tscope.dollyOut();\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.noPan === true ) return;\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\t\t\t\n\t\t\tscope.pan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction onMouseUp( /* event */ ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tscope.dispatchEvent( endEvent );\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.noZoom === true ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) { // WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) { // Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tscope.dollyOut();\n\n\t\t} else {\n\n\t\t\tscope.dollyIn();\n\n\t\t}\n\n\t\tscope.update();\n\t\tscope.dispatchEvent( startEvent );\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.noKeys === true || scope.noPan === true ) return;\n\t\t\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tscope.pan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tscope.pan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tscope.pan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tscope.pan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction touchstart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.noRotate === true ) return;\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.noZoom === true ) return;\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\t\t\t\tdollyStart.set( 0, distance );\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.noPan === true ) return;\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tscope.dispatchEvent( startEvent );\n\n\t}\n\n\tfunction touchmove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.noRotate === true ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return;\n\n\t\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\t\tscope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\t\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\t\tscope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.noZoom === true ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return;\n\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\t\tdollyEnd.set( 0, distance );\n\t\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\t\tscope.dollyOut();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tscope.dollyIn();\n\n\t\t\t\t}\n\n\t\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.noPan === true ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return;\n\n\t\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tpanDelta.subVectors( panEnd, panStart );\n\t\t\t\t\n\t\t\t\tscope.pan( panDelta.x, panDelta.y );\n\n\t\t\t\tpanStart.copy( panEnd );\n\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction touchend( /* event */ ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tscope.dispatchEvent( endEvent );\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tthis.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\tthis.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tthis.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tthis.domElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox\n\n\tthis.domElement.addEventListener( 'touchstart', touchstart, false );\n\tthis.domElement.addEventListener( 'touchend', touchend, false );\n\tthis.domElement.addEventListener( 'touchmove', touchmove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\tthis.update();\n\n};\n\nTHREE.OrbitZControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/OrthographicTrackballControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/OrthographicTrackballControls.js",
"module-type": "library",
"text": "/**\n * @author Eberhard Graether / http://egraether.com/\n * @author Patrick Fuller / http://patrick-fuller.com\n */\n\nTHREE.OrthographicTrackballControls = function ( object, domElement ) {\n\n\tvar _this = this;\n\tvar STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM: 4, TOUCH_PAN: 5 };\n\n\tthis.object = object;\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// API\n\n\tthis.enabled = true;\n\n\tthis.screen = { width: 0, height: 0, offsetLeft: 0, offsetTop: 0 };\n\tthis.radius = ( this.screen.width + this.screen.height ) / 4;\n\n\tthis.rotateSpeed = 1.0;\n\tthis.zoomSpeed = 1.2;\n\tthis.panSpeed = 0.3;\n\n\tthis.noRotate = false;\n\tthis.noZoom = false;\n\tthis.noPan = false;\n\n\tthis.staticMoving = false;\n\tthis.dynamicDampingFactor = 0.2;\n\n\tthis.keys = [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ];\n\n\t// internals\n\n\tthis.target = new THREE.Vector3();\n\n\tvar lastPosition = new THREE.Vector3();\n\n\tvar _state = STATE.NONE,\n\t_prevState = STATE.NONE,\n\n\t_eye = new THREE.Vector3(),\n\n\t_rotateStart = new THREE.Vector3(),\n\t_rotateEnd = new THREE.Vector3(),\n\n\t_zoomStart = new THREE.Vector2(),\n\t_zoomEnd = new THREE.Vector2(),\n\t_zoomFactor = 1,\n\n\t_touchZoomDistanceStart = 0,\n\t_touchZoomDistanceEnd = 0,\n\n\t_panStart = new THREE.Vector2(),\n\t_panEnd = new THREE.Vector2();\n\n\t// for reset\n\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.up0 = this.object.up.clone();\n\n\tthis.left0 = this.object.left;\n\tthis.right0 = this.object.right;\n\tthis.top0 = this.object.top;\n\tthis.bottom0 = this.object.bottom;\n\tthis.center0 = new THREE.Vector2((this.left0 + this.right0) / 2.0, (this.top0 + this.bottom0) / 2.0);\n\n\t// events\n\n\tvar changeEvent = { type: 'change' };\n\n\n\t// methods\n\n\tthis.handleResize = function () {\n\n\t\tthis.screen.width = window.innerWidth;\n\t\tthis.screen.height = window.innerHeight;\n\n\t\tthis.screen.offsetLeft = 0;\n\t\tthis.screen.offsetTop = 0;\n\n\t\tthis.radius = ( this.screen.width + this.screen.height ) / 4;\n\n\t};\n\n\tthis.handleEvent = function ( event ) {\n\n\t\tif ( typeof this[ event.type ] == 'function' ) {\n\n\t\t\tthis[ event.type ]( event );\n\n\t\t}\n\n\t};\n\n\tthis.getMouseOnScreen = function ( clientX, clientY ) {\n\n\t\treturn new THREE.Vector2(\n\t\t\t( clientX - _this.screen.offsetLeft ) / _this.radius * 0.5,\n\t\t\t( clientY - _this.screen.offsetTop ) / _this.radius * 0.5\n\t\t);\n\n\t};\n\n\tthis.getMouseProjectionOnBall = function ( clientX, clientY ) {\n\n\t\tvar mouseOnBall = new THREE.Vector3(\n\t\t\t( clientX - _this.screen.width * 0.5 - _this.screen.offsetLeft ) / _this.radius,\n\t\t\t( _this.screen.height * 0.5 + _this.screen.offsetTop - clientY ) / _this.radius,\n\t\t\t0.0\n\t\t);\n\n\t\tvar length = mouseOnBall.length();\n\n\t\tif ( length > 1.0 ) {\n\n\t\t\tmouseOnBall.normalize();\n\n\t\t} else {\n\n\t\t\tmouseOnBall.z = Math.sqrt( 1.0 - length * length );\n\n\t\t}\n\n\t\t_eye.copy( _this.object.position ).sub( _this.target );\n\n\t\tvar projection = _this.object.up.clone().setLength( mouseOnBall.y );\n\t\tprojection.add( _this.object.up.clone().cross( _eye ).setLength( mouseOnBall.x ) );\n\t\tprojection.add( _eye.setLength( mouseOnBall.z ) );\n\n\t\treturn projection;\n\n\t};\n\n\tthis.rotateCamera = function () {\n\n\t\tvar angle = Math.acos( _rotateStart.dot( _rotateEnd ) / _rotateStart.length() / _rotateEnd.length() );\n\n\t\tif ( angle ) {\n\n\t\t\tvar axis = ( new THREE.Vector3() ).crossVectors( _rotateStart, _rotateEnd ).normalize(),\n\t\t\t\tquaternion = new THREE.Quaternion();\n\n\t\t\tangle *= _this.rotateSpeed;\n\n\t\t\tquaternion.setFromAxisAngle( axis, -angle );\n\n\t\t\t_eye.applyQuaternion( quaternion );\n\t\t\t_this.object.up.applyQuaternion( quaternion );\n\n\t\t\t_rotateEnd.applyQuaternion( quaternion );\n\n\t\t\tif ( _this.staticMoving ) {\n\n\t\t\t\t_rotateStart.copy( _rotateEnd );\n\n\t\t\t} else {\n\n\t\t\t\tquaternion.setFromAxisAngle( axis, angle * ( _this.dynamicDampingFactor - 1.0 ) );\n\t\t\t\t_rotateStart.applyQuaternion( quaternion );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.zoomCamera = function () {\n\n\t\tif ( _state === STATE.TOUCH_ZOOM ) {\n\n\t\t\tvar factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;\n\t\t\t_touchZoomDistanceStart = _touchZoomDistanceEnd;\n\t\t\t_zoomFactor *= factor;\n\n\t\t\t_this.object.left = _zoomFactor * _this.left0 + ( 1 - _zoomFactor ) * _this.center0.x;\n\t\t\t_this.object.right = _zoomFactor * _this.right0 + ( 1 - _zoomFactor ) * _this.center0.x;\n\t\t\t_this.object.top = _zoomFactor * _this.top0 + ( 1 - _zoomFactor ) * _this.center0.y;\n\t\t\t_this.object.bottom = _zoomFactor * _this.bottom0 + ( 1 - _zoomFactor ) * _this.center0.y;\n\n\t\t} else {\n\n\t\t\tvar factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed;\n\n\t\t\tif ( factor !== 1.0 && factor > 0.0 ) {\n\t\t\t\t_zoomFactor *= factor;\n\n\t\t\t\t_this.object.left = _zoomFactor * _this.left0 + ( 1 - _zoomFactor ) * _this.center0.x;\n\t\t\t\t_this.object.right = _zoomFactor * _this.right0 + ( 1 - _zoomFactor ) * _this.center0.x;\n\t\t\t\t_this.object.top = _zoomFactor * _this.top0 + ( 1 - _zoomFactor ) * _this.center0.y;\n\t\t\t\t_this.object.bottom = _zoomFactor * _this.bottom0 + ( 1 - _zoomFactor ) * _this.center0.y;\n\n\t\t\t\tif ( _this.staticMoving ) {\n\n\t\t\t\t\t_zoomStart.copy( _zoomEnd );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.panCamera = function () {\n\n\t\tvar mouseChange = _panEnd.clone().sub( _panStart );\n\n\t\tif ( mouseChange.lengthSq() ) {\n\n\t\t\tmouseChange.multiplyScalar( _eye.length() * _this.panSpeed );\n\n\t\t\tvar pan = _eye.clone().cross( _this.object.up ).setLength( mouseChange.x );\n\t\t\tpan.add( _this.object.up.clone().setLength( mouseChange.y ) );\n\n\t\t\t_this.object.position.add( pan );\n\t\t\t_this.target.add( pan );\n\n\t\t\tif ( _this.staticMoving ) {\n\n\t\t\t\t_panStart = _panEnd;\n\n\t\t\t} else {\n\n\t\t\t\t_panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.update = function () {\n\n\t\t_eye.subVectors( _this.object.position, _this.target );\n\n\t\tif ( !_this.noRotate ) {\n\n\t\t\t_this.rotateCamera();\n\n\t\t}\n\n\t\tif ( !_this.noZoom ) {\n\n\t\t\t_this.zoomCamera();\n\t\t\t_this.object.updateProjectionMatrix();\n\n\t\t}\n\n\t\tif ( !_this.noPan ) {\n\n\t\t\t_this.panCamera();\n\n\t\t}\n\n\t\t_this.object.position.addVectors( _this.target, _eye );\n\n\t\t_this.object.lookAt( _this.target );\n\n\t\tif ( lastPosition.distanceToSquared( _this.object.position ) > 0 ) {\n\n\t\t\t_this.dispatchEvent( changeEvent );\n\n\t\t\tlastPosition.copy( _this.object.position );\n\n\t\t}\n\n\t};\n\n\tthis.reset = function () {\n\n\t\t_state = STATE.NONE;\n\t\t_prevState = STATE.NONE;\n\n\t\t_this.target.copy( _this.target0 );\n\t\t_this.object.position.copy( _this.position0 );\n\t\t_this.object.up.copy( _this.up0 );\n\n\t\t_eye.subVectors( _this.object.position, _this.target );\n\n\t\t_this.object.left = _this.left0;\n\t\t_this.object.right = _this.right0;\n\t\t_this.object.top = _this.top0;\n\t\t_this.object.bottom = _this.bottom0;\n\n\t\t_this.object.lookAt( _this.target );\n\n\t\t_this.dispatchEvent( changeEvent );\n\n\t\tlastPosition.copy( _this.object.position );\n\n\t};\n\n\t// listeners\n\n\tfunction keydown( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\twindow.removeEventListener( 'keydown', keydown );\n\n\t\t_prevState = _state;\n\n\t\tif ( _state !== STATE.NONE ) {\n\n\t\t\treturn;\n\n\t\t} else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && !_this.noRotate ) {\n\n\t\t\t_state = STATE.ROTATE;\n\n\t\t} else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && !_this.noZoom ) {\n\n\t\t\t_state = STATE.ZOOM;\n\n\t\t} else if ( event.keyCode === _this.keys[ STATE.PAN ] && !_this.noPan ) {\n\n\t\t\t_state = STATE.PAN;\n\n\t\t}\n\n\t}\n\n\tfunction keyup( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\t_state = _prevState;\n\n\t\twindow.addEventListener( 'keydown', keydown, false );\n\n\t}\n\n\tfunction mousedown( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( _state === STATE.NONE ) {\n\n\t\t\t_state = event.button;\n\n\t\t}\n\n\t\tif ( _state === STATE.ROTATE && !_this.noRotate ) {\n\n\t\t\t_rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY );\n\n\t\t} else if ( _state === STATE.ZOOM && !_this.noZoom ) {\n\n\t\t\t_zoomStart = _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY );\n\n\t\t} else if ( _state === STATE.PAN && !_this.noPan ) {\n\n\t\t\t_panStart = _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tdocument.addEventListener( 'mousemove', mousemove, false );\n\t\tdocument.addEventListener( 'mouseup', mouseup, false );\n\n\t}\n\n\tfunction mousemove( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( _state === STATE.ROTATE && !_this.noRotate ) {\n\n\t\t\t_rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY );\n\n\t\t} else if ( _state === STATE.ZOOM && !_this.noZoom ) {\n\n\t\t\t_zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY );\n\n\t\t} else if ( _state === STATE.PAN && !_this.noPan ) {\n\n\t\t\t_panEnd = _this.getMouseOnScreen( event.clientX, event.clientY );\n\n\t\t}\n\n\t}\n\n\tfunction mouseup( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\t_state = STATE.NONE;\n\n\t\tdocument.removeEventListener( 'mousemove', mousemove );\n\t\tdocument.removeEventListener( 'mouseup', mouseup );\n\n\t}\n\n\tfunction mousewheel( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta ) { // WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta / 40;\n\n\t\t} else if ( event.detail ) { // Firefox\n\n\t\t\tdelta = - event.detail / 3;\n\n\t\t}\n\n\t\t_zoomStart.y += delta * 0.01;\n\n\t}\n\n\tfunction touchstart( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\t_state = STATE.TOUCH_ROTATE;\n\t\t\t\t_rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\t_state = STATE.TOUCH_ZOOM;\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t_touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t_state = STATE.TOUCH_PAN;\n\t\t\t\t_panStart = _panEnd = _this.getMouseOnScreen( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t_state = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction touchmove( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\t_rotateEnd = _this.getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t_touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy )\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t_panEnd = _this.getMouseOnScreen( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t_state = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction touchend( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\t_rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\t_touchZoomDistanceStart = _touchZoomDistanceEnd = 0;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t_panStart = _panEnd = _this.getMouseOnScreen( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t_state = STATE.NONE;\n\n\t}\n\n\tthis.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\n\tthis.domElement.addEventListener( 'mousedown', mousedown, false );\n\n\tthis.domElement.addEventListener( 'mousewheel', mousewheel, false );\n\tthis.domElement.addEventListener( 'DOMMouseScroll', mousewheel, false ); // firefox\n\n\tthis.domElement.addEventListener( 'touchstart', touchstart, false );\n\tthis.domElement.addEventListener( 'touchend', touchend, false );\n\tthis.domElement.addEventListener( 'touchmove', touchmove, false );\n\n\twindow.addEventListener( 'keydown', keydown, false );\n\twindow.addEventListener( 'keyup', keyup, false );\n\n\tthis.handleResize();\n\n};\n\nTHREE.OrthographicTrackballControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/PointerLockControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/PointerLockControls.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.PointerLockControls = function ( camera ) {\n\n\tvar scope = this;\n\n\tcamera.rotation.set( 0, 0, 0 );\n\n\tvar pitchObject = new THREE.Object3D();\n\tpitchObject.add( camera );\n\n\tvar yawObject = new THREE.Object3D();\n\tyawObject.position.y = 10;\n\tyawObject.add( pitchObject );\n\n\tvar moveForward = false;\n\tvar moveBackward = false;\n\tvar moveLeft = false;\n\tvar moveRight = false;\n\n\tvar isOnObject = false;\n\tvar canJump = false;\n\n\tvar prevTime = performance.now();\n\n\tvar velocity = new THREE.Vector3();\n\n\tvar PI_2 = Math.PI / 2;\n\n\tvar onMouseMove = function ( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tvar movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;\n\t\tvar movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;\n\n\t\tyawObject.rotation.y -= movementX * 0.002;\n\t\tpitchObject.rotation.x -= movementY * 0.002;\n\n\t\tpitchObject.rotation.x = Math.max( - PI_2, Math.min( PI_2, pitchObject.rotation.x ) );\n\n\t};\n\n\tvar onKeyDown = function ( event ) {\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase 38: // up\n\t\t\tcase 87: // w\n\t\t\t\tmoveForward = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 37: // left\n\t\t\tcase 65: // a\n\t\t\t\tmoveLeft = true; break;\n\n\t\t\tcase 40: // down\n\t\t\tcase 83: // s\n\t\t\t\tmoveBackward = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 39: // right\n\t\t\tcase 68: // d\n\t\t\t\tmoveRight = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 32: // space\n\t\t\t\tif ( canJump === true ) velocity.y += 350;\n\t\t\t\tcanJump = false;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tvar onKeyUp = function ( event ) {\n\n\t\tswitch( event.keyCode ) {\n\n\t\t\tcase 38: // up\n\t\t\tcase 87: // w\n\t\t\t\tmoveForward = false;\n\t\t\t\tbreak;\n\n\t\t\tcase 37: // left\n\t\t\tcase 65: // a\n\t\t\t\tmoveLeft = false;\n\t\t\t\tbreak;\n\n\t\t\tcase 40: // down\n\t\t\tcase 83: // s\n\t\t\t\tmoveBackward = false;\n\t\t\t\tbreak;\n\n\t\t\tcase 39: // right\n\t\t\tcase 68: // d\n\t\t\t\tmoveRight = false;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\tdocument.addEventListener( 'keydown', onKeyDown, false );\n\tdocument.addEventListener( 'keyup', onKeyUp, false );\n\n\tthis.enabled = false;\n\n\tthis.getObject = function () {\n\n\t\treturn yawObject;\n\n\t};\n\n\tthis.isOnObject = function ( boolean ) {\n\n\t\tisOnObject = boolean;\n\t\tcanJump = boolean;\n\n\t};\n\n\tthis.getDirection = function() {\n\n\t\t// assumes the camera itself is not rotated\n\n\t\tvar direction = new THREE.Vector3( 0, 0, -1 );\n\t\tvar rotation = new THREE.Euler( 0, 0, 0, \"YXZ\" );\n\n\t\treturn function( v ) {\n\n\t\t\trotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );\n\n\t\t\tv.copy( direction ).applyEuler( rotation );\n\n\t\t\treturn v;\n\n\t\t}\n\n\t}();\n\n\tthis.update = function () {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tvar time = performance.now();\n\t\tvar delta = ( time - prevTime ) / 1000;\n\n\t\tvelocity.x -= velocity.x * 10.0 * delta;\n\t\tvelocity.z -= velocity.z * 10.0 * delta;\n\n\t\tvelocity.y -= 9.8 * 100.0 * delta; // 100.0 = mass\n\n\t\tif ( moveForward ) velocity.z -= 400.0 * delta;\n\t\tif ( moveBackward ) velocity.z += 400.0 * delta;\n\n\t\tif ( moveLeft ) velocity.x -= 400.0 * delta;\n\t\tif ( moveRight ) velocity.x += 400.0 * delta;\n\n\t\tif ( isOnObject === true ) {\n\n\t\t\tvelocity.y = Math.max( 0, velocity.y );\n\n\t\t}\n\n\t\tyawObject.translateX( velocity.x * delta );\n\t\tyawObject.translateY( velocity.y * delta ); \n\t\tyawObject.translateZ( velocity.z * delta );\n\n\t\tif ( yawObject.position.y < 10 ) {\n\n\t\t\tvelocity.y = 0;\n\t\t\tyawObject.position.y = 10;\n\n\t\t\tcanJump = true;\n\n\t\t}\n\n\t\tprevTime = time;\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/TrackballControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/TrackballControls.js",
"module-type": "library",
"text": "/**\n * @author Eberhard Graether / http://egraether.com/\n * @author Mark Lundin \t/ http://mark-lundin.com\n */\n\nTHREE.TrackballControls = function ( object, domElement ) {\n\n\tvar _this = this;\n\tvar STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };\n\n\tthis.object = object;\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// API\n\n\tthis.enabled = true;\n\n\tthis.screen = { left: 0, top: 0, width: 0, height: 0 };\n\n\tthis.rotateSpeed = 1.0;\n\tthis.zoomSpeed = 1.2;\n\tthis.panSpeed = 0.3;\n\n\tthis.noRotate = false;\n\tthis.noZoom = false;\n\tthis.noPan = false;\n\tthis.noRoll = false;\n\n\tthis.staticMoving = false;\n\tthis.dynamicDampingFactor = 0.2;\n\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\tthis.keys = [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ];\n\n\t// internals\n\n\tthis.target = new THREE.Vector3();\n\n\tvar EPS = 0.000001;\n\n\tvar lastPosition = new THREE.Vector3();\n\n\tvar _state = STATE.NONE,\n\t_prevState = STATE.NONE,\n\n\t_eye = new THREE.Vector3(),\n\n\t_rotateStart = new THREE.Vector3(),\n\t_rotateEnd = new THREE.Vector3(),\n\n\t_zoomStart = new THREE.Vector2(),\n\t_zoomEnd = new THREE.Vector2(),\n\n\t_touchZoomDistanceStart = 0,\n\t_touchZoomDistanceEnd = 0,\n\n\t_panStart = new THREE.Vector2(),\n\t_panEnd = new THREE.Vector2();\n\n\t// for reset\n\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.up0 = this.object.up.clone();\n\n\t// events\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start'};\n\tvar endEvent = { type: 'end'};\n\n\n\t// methods\n\n\tthis.handleResize = function () {\n\n\t\tif ( this.domElement === document ) {\n\n\t\t\tthis.screen.left = 0;\n\t\t\tthis.screen.top = 0;\n\t\t\tthis.screen.width = window.innerWidth;\n\t\t\tthis.screen.height = window.innerHeight;\n\n\t\t} else {\n\n\t\t\tvar box = this.domElement.getBoundingClientRect();\n\t\t\t// adjustments come from similar code in the jquery offset() function\n\t\t\tvar d = this.domElement.ownerDocument.documentElement;\n\t\t\tthis.screen.left = box.left + window.pageXOffset - d.clientLeft;\n\t\t\tthis.screen.top = box.top + window.pageYOffset - d.clientTop;\n\t\t\tthis.screen.width = box.width;\n\t\t\tthis.screen.height = box.height;\n\n\t\t}\n\n\t};\n\n\tthis.handleEvent = function ( event ) {\n\n\t\tif ( typeof this[ event.type ] == 'function' ) {\n\n\t\t\tthis[ event.type ]( event );\n\n\t\t}\n\n\t};\n\n\tvar getMouseOnScreen = ( function () {\n\n\t\tvar vector = new THREE.Vector2();\n\n\t\treturn function ( pageX, pageY ) {\n\n\t\t\tvector.set(\n\t\t\t\t( pageX - _this.screen.left ) / _this.screen.width,\n\t\t\t\t( pageY - _this.screen.top ) / _this.screen.height\n\t\t\t);\n\n\t\t\treturn vector;\n\n\t\t};\n\n\t}() );\n\n\tvar getMouseProjectionOnBall = ( function () {\n\n\t\tvar vector = new THREE.Vector3();\n\t\tvar objectUp = new THREE.Vector3();\n\t\tvar mouseOnBall = new THREE.Vector3();\n\n\t\treturn function ( pageX, pageY ) {\n\n\t\t\tmouseOnBall.set(\n\t\t\t\t( pageX - _this.screen.width * 0.5 - _this.screen.left ) / (_this.screen.width*.5),\n\t\t\t\t( _this.screen.height * 0.5 + _this.screen.top - pageY ) / (_this.screen.height*.5),\n\t\t\t\t0.0\n\t\t\t);\n\n\t\t\tvar length = mouseOnBall.length();\n\n\t\t\tif ( _this.noRoll ) {\n\n\t\t\t\tif ( length < Math.SQRT1_2 ) {\n\n\t\t\t\t\tmouseOnBall.z = Math.sqrt( 1.0 - length*length );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmouseOnBall.z = .5 / length;\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t} else if ( length > 1.0 ) {\n\n\t\t\t\tmouseOnBall.normalize();\n\n\t\t\t} else {\n\n\t\t\t\tmouseOnBall.z = Math.sqrt( 1.0 - length * length );\n\n\t\t\t}\n\n\t\t\t_eye.copy( _this.object.position ).sub( _this.target );\n\n\t\t\tvector.copy( _this.object.up ).setLength( mouseOnBall.y )\n\t\t\tvector.add( objectUp.copy( _this.object.up ).cross( _eye ).setLength( mouseOnBall.x ) );\n\t\t\tvector.add( _eye.setLength( mouseOnBall.z ) );\n\n\t\t\treturn vector;\n\n\t\t};\n\n\t}() );\n\n\tthis.rotateCamera = (function(){\n\n\t\tvar axis = new THREE.Vector3(),\n\t\t\tquaternion = new THREE.Quaternion();\n\n\n\t\treturn function () {\n\n\t\t\tvar angle = Math.acos( _rotateStart.dot( _rotateEnd ) / _rotateStart.length() / _rotateEnd.length() );\n\n\t\t\tif ( angle ) {\n\n\t\t\t\taxis.crossVectors( _rotateStart, _rotateEnd ).normalize();\n\n\t\t\t\tangle *= _this.rotateSpeed;\n\n\t\t\t\tquaternion.setFromAxisAngle( axis, -angle );\n\n\t\t\t\t_eye.applyQuaternion( quaternion );\n\t\t\t\t_this.object.up.applyQuaternion( quaternion );\n\n\t\t\t\t_rotateEnd.applyQuaternion( quaternion );\n\n\t\t\t\tif ( _this.staticMoving ) {\n\n\t\t\t\t\t_rotateStart.copy( _rotateEnd );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tquaternion.setFromAxisAngle( axis, angle * ( _this.dynamicDampingFactor - 1.0 ) );\n\t\t\t\t\t_rotateStart.applyQuaternion( quaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}());\n\n\tthis.zoomCamera = function () {\n\n\t\tif ( _state === STATE.TOUCH_ZOOM_PAN ) {\n\n\t\t\tvar factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;\n\t\t\t_touchZoomDistanceStart = _touchZoomDistanceEnd;\n\t\t\t_eye.multiplyScalar( factor );\n\n\t\t} else {\n\n\t\t\tvar factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed;\n\n\t\t\tif ( factor !== 1.0 && factor > 0.0 ) {\n\n\t\t\t\t_eye.multiplyScalar( factor );\n\n\t\t\t\tif ( _this.staticMoving ) {\n\n\t\t\t\t\t_zoomStart.copy( _zoomEnd );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.panCamera = (function(){\n\n\t\tvar mouseChange = new THREE.Vector2(),\n\t\t\tobjectUp = new THREE.Vector3(),\n\t\t\tpan = new THREE.Vector3();\n\n\t\treturn function () {\n\n\t\t\tmouseChange.copy( _panEnd ).sub( _panStart );\n\n\t\t\tif ( mouseChange.lengthSq() ) {\n\n\t\t\t\tmouseChange.multiplyScalar( _eye.length() * _this.panSpeed );\n\n\t\t\t\tpan.copy( _eye ).cross( _this.object.up ).setLength( mouseChange.x );\n\t\t\t\tpan.add( objectUp.copy( _this.object.up ).setLength( mouseChange.y ) );\n\n\t\t\t\t_this.object.position.add( pan );\n\t\t\t\t_this.target.add( pan );\n\n\t\t\t\tif ( _this.staticMoving ) {\n\n\t\t\t\t\t_panStart.copy( _panEnd );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}());\n\n\tthis.checkDistances = function () {\n\n\t\tif ( !_this.noZoom || !_this.noPan ) {\n\n\t\t\tif ( _eye.lengthSq() > _this.maxDistance * _this.maxDistance ) {\n\n\t\t\t\t_this.object.position.addVectors( _this.target, _eye.setLength( _this.maxDistance ) );\n\n\t\t\t}\n\n\t\t\tif ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) {\n\n\t\t\t\t_this.object.position.addVectors( _this.target, _eye.setLength( _this.minDistance ) );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.update = function () {\n\n\t\t_eye.subVectors( _this.object.position, _this.target );\n\n\t\tif ( !_this.noRotate ) {\n\n\t\t\t_this.rotateCamera();\n\n\t\t}\n\n\t\tif ( !_this.noZoom ) {\n\n\t\t\t_this.zoomCamera();\n\n\t\t}\n\n\t\tif ( !_this.noPan ) {\n\n\t\t\t_this.panCamera();\n\n\t\t}\n\n\t\t_this.object.position.addVectors( _this.target, _eye );\n\n\t\t_this.checkDistances();\n\n\t\t_this.object.lookAt( _this.target );\n\n\t\tif ( lastPosition.distanceToSquared( _this.object.position ) > EPS ) {\n\n\t\t\t_this.dispatchEvent( changeEvent );\n\n\t\t\tlastPosition.copy( _this.object.position );\n\n\t\t}\n\n\t};\n\n\tthis.reset = function () {\n\n\t\t_state = STATE.NONE;\n\t\t_prevState = STATE.NONE;\n\n\t\t_this.target.copy( _this.target0 );\n\t\t_this.object.position.copy( _this.position0 );\n\t\t_this.object.up.copy( _this.up0 );\n\n\t\t_eye.subVectors( _this.object.position, _this.target );\n\n\t\t_this.object.lookAt( _this.target );\n\n\t\t_this.dispatchEvent( changeEvent );\n\n\t\tlastPosition.copy( _this.object.position );\n\n\t};\n\n\t// listeners\n\n\tfunction keydown( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\twindow.removeEventListener( 'keydown', keydown );\n\n\t\t_prevState = _state;\n\n\t\tif ( _state !== STATE.NONE ) {\n\n\t\t\treturn;\n\n\t\t} else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && !_this.noRotate ) {\n\n\t\t\t_state = STATE.ROTATE;\n\n\t\t} else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && !_this.noZoom ) {\n\n\t\t\t_state = STATE.ZOOM;\n\n\t\t} else if ( event.keyCode === _this.keys[ STATE.PAN ] && !_this.noPan ) {\n\n\t\t\t_state = STATE.PAN;\n\n\t\t}\n\n\t}\n\n\tfunction keyup( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\t_state = _prevState;\n\n\t\twindow.addEventListener( 'keydown', keydown, false );\n\n\t}\n\n\tfunction mousedown( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( _state === STATE.NONE ) {\n\n\t\t\t_state = event.button;\n\n\t\t}\n\n\t\tif ( _state === STATE.ROTATE && !_this.noRotate ) {\n\n\t\t\t_rotateStart.copy( getMouseProjectionOnBall( event.pageX, event.pageY ) );\n\t\t\t_rotateEnd.copy( _rotateStart );\n\n\t\t} else if ( _state === STATE.ZOOM && !_this.noZoom ) {\n\n\t\t\t_zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );\n\t\t\t_zoomEnd.copy(_zoomStart);\n\n\t\t} else if ( _state === STATE.PAN && !_this.noPan ) {\n\n\t\t\t_panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );\n\t\t\t_panEnd.copy(_panStart)\n\n\t\t}\n\n\t\tdocument.addEventListener( 'mousemove', mousemove, false );\n\t\tdocument.addEventListener( 'mouseup', mouseup, false );\n\n\t\t_this.dispatchEvent( startEvent );\n\n\t}\n\n\tfunction mousemove( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif ( _state === STATE.ROTATE && !_this.noRotate ) {\n\n\t\t\t_rotateEnd.copy( getMouseProjectionOnBall( event.pageX, event.pageY ) );\n\n\t\t} else if ( _state === STATE.ZOOM && !_this.noZoom ) {\n\n\t\t\t_zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );\n\n\t\t} else if ( _state === STATE.PAN && !_this.noPan ) {\n\n\t\t\t_panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );\n\n\t\t}\n\n\t}\n\n\tfunction mouseup( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\t_state = STATE.NONE;\n\n\t\tdocument.removeEventListener( 'mousemove', mousemove );\n\t\tdocument.removeEventListener( 'mouseup', mouseup );\n\t\t_this.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction mousewheel( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta ) { // WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta / 40;\n\n\t\t} else if ( event.detail ) { // Firefox\n\n\t\t\tdelta = - event.detail / 3;\n\n\t\t}\n\n\t\t_zoomStart.y += delta * 0.01;\n\t\t_this.dispatchEvent( startEvent );\n\t\t_this.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction touchstart( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\t_state = STATE.TOUCH_ROTATE;\n\t\t\t\t_rotateStart.copy( getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );\n\t\t\t\t_rotateEnd.copy( _rotateStart );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\t_state = STATE.TOUCH_ZOOM_PAN;\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t_touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\t\tvar x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;\n\t\t\t\tvar y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;\n\t\t\t\t_panStart.copy( getMouseOnScreen( x, y ) );\n\t\t\t\t_panEnd.copy( _panStart );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t_state = STATE.NONE;\n\n\t\t}\n\t\t_this.dispatchEvent( startEvent );\n\n\n\t}\n\n\tfunction touchmove( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\t_rotateEnd.copy( getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t_touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\t\tvar x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;\n\t\t\t\tvar y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;\n\t\t\t\t_panEnd.copy( getMouseOnScreen( x, y ) );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t_state = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction touchend( event ) {\n\n\t\tif ( _this.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\t_rotateEnd.copy( getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );\n\t\t\t\t_rotateStart.copy( _rotateEnd );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\t_touchZoomDistanceStart = _touchZoomDistanceEnd = 0;\n\n\t\t\t\tvar x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;\n\t\t\t\tvar y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;\n\t\t\t\t_panEnd.copy( getMouseOnScreen( x, y ) );\n\t\t\t\t_panStart.copy( _panEnd );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t_state = STATE.NONE;\n\t\t_this.dispatchEvent( endEvent );\n\n\t}\n\n\tthis.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );\n\n\tthis.domElement.addEventListener( 'mousedown', mousedown, false );\n\n\tthis.domElement.addEventListener( 'mousewheel', mousewheel, false );\n\tthis.domElement.addEventListener( 'DOMMouseScroll', mousewheel, false ); // firefox\n\n\tthis.domElement.addEventListener( 'touchstart', touchstart, false );\n\tthis.domElement.addEventListener( 'touchend', touchend, false );\n\tthis.domElement.addEventListener( 'touchmove', touchmove, false );\n\n\twindow.addEventListener( 'keydown', keydown, false );\n\twindow.addEventListener( 'keyup', keyup, false );\n\n\tthis.handleResize();\n\n\t// force an update at start\n\tthis.update();\n\n};\n\nTHREE.TrackballControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Controls/TransformControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/TransformControls.js",
"module-type": "library",
"text": "/**\n * @author arodic / https://github.com/arodic\n */\n /*jshint sub:true*/\n\n(function () {\n\n\t'use strict';\n\n\tvar GizmoMaterial = function ( parameters ) {\n\n\t\tTHREE.MeshBasicMaterial.call( this );\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = false;\n\t\tthis.side = THREE.FrontSide;\n\t\tthis.transparent = true;\n\n\t\tthis.setValues( parameters );\n\n\t\tthis.oldColor = this.color.clone();\n\t\tthis.oldOpacity = this.opacity;\n\n\t\tthis.highlight = function( highlighted ) {\n\n\t\t\tif ( highlighted ) {\n\n\t\t\t\tthis.color.setRGB( 1, 1, 0 );\n\t\t\t\tthis.opacity = 1;\n\n\t\t\t} else {\n\n\t\t\t\t\tthis.color.copy( this.oldColor );\n\t\t\t\t\tthis.opacity = this.oldOpacity;\n\n\t\t\t}\n\n\t\t};\n\n\t};\n\n\tGizmoMaterial.prototype = Object.create( THREE.MeshBasicMaterial.prototype );\n\n\tvar GizmoLineMaterial = function ( parameters ) {\n\n\t\tTHREE.LineBasicMaterial.call( this );\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = false;\n\t\tthis.transparent = true;\n\t\tthis.linewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t\tthis.oldColor = this.color.clone();\n\t\tthis.oldOpacity = this.opacity;\n\n\t\tthis.highlight = function( highlighted ) {\n\n\t\t\tif ( highlighted ) {\n\n\t\t\t\tthis.color.setRGB( 1, 1, 0 );\n\t\t\t\tthis.opacity = 1;\n\n\t\t\t} else {\n\n\t\t\t\t\tthis.color.copy( this.oldColor );\n\t\t\t\t\tthis.opacity = this.oldOpacity;\n\n\t\t\t}\n\n\t\t};\n\n\t};\n\n\tGizmoLineMaterial.prototype = Object.create( THREE.LineBasicMaterial.prototype );\n\n\tTHREE.TransformGizmo = function () {\n\n\t\tvar scope = this;\n\t\tvar showPickers = false; //debug\n\t\tvar showActivePlane = false; //debug\n\n\t\tthis.init = function () {\n\n\t\t\tTHREE.Object3D.call( this );\n\n\t\t\tthis.handles = new THREE.Object3D();\n\t\t\tthis.pickers = new THREE.Object3D();\n\t\t\tthis.planes = new THREE.Object3D();\n\n\t\t\tthis.add(this.handles);\n\t\t\tthis.add(this.pickers);\n\t\t\tthis.add(this.planes);\n\n\t\t\t//// PLANES\n\n\t\t\tvar planeGeometry = new THREE.PlaneGeometry( 50, 50, 2, 2 );\n\t\t\tvar planeMaterial = new THREE.MeshBasicMaterial( { wireframe: true } );\n\t\t\tplaneMaterial.side = THREE.DoubleSide;\n\n\t\t\tvar planes = {\n\t\t\t\t\"XY\": new THREE.Mesh( planeGeometry, planeMaterial ),\n\t\t\t\t\"YZ\": new THREE.Mesh( planeGeometry, planeMaterial ),\n\t\t\t\t\"XZ\": new THREE.Mesh( planeGeometry, planeMaterial ),\n\t\t\t\t\"XYZE\": new THREE.Mesh( planeGeometry, planeMaterial )\n\t\t\t};\n\n\t\t\tthis.activePlane = planes[\"XYZE\"];\n\n\t\t\tplanes[\"YZ\"].rotation.set( 0, Math.PI/2, 0 );\n\t\t\tplanes[\"XZ\"].rotation.set( -Math.PI/2, 0, 0 );\n\n\t\t\tfor (var i in planes) {\n\t\t\t\tplanes[i].name = i;\n\t\t\t\tthis.planes.add(planes[i]);\n\t\t\t\tthis.planes[i] = planes[i];\n\t\t\t\tplanes[i].visible = false;\n\t\t\t}\n\n\t\t\t//// HANDLES AND PICKERS\n\n\t\t\tvar setupGizmos = function( gizmoMap, parent ) {\n\n\t\t\t\tfor ( var name in gizmoMap ) {\n\n\t\t\t\t\tfor ( i = gizmoMap[name].length; i--;) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar object = gizmoMap[name][i][0];\n\t\t\t\t\t\tvar position = gizmoMap[name][i][1];\n\t\t\t\t\t\tvar rotation = gizmoMap[name][i][2];\n\n\t\t\t\t\t\tobject.name = name;\n\n\t\t\t\t\t\tif ( position ) object.position.set( position[0], position[1], position[2] );\n\t\t\t\t\t\tif ( rotation ) object.rotation.set( rotation[0], rotation[1], rotation[2] );\n\t\t\t\t\t\t\n\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tsetupGizmos(this.handleGizmos, this.handles);\n\t\t\tsetupGizmos(this.pickerGizmos, this.pickers);\n\n\t\t\t// reset Transformations\n\n\t\t\tthis.traverse(function ( child ) {\n\t\t\t\tif (child instanceof THREE.Mesh) {\n\t\t\t\t\tchild.updateMatrix();\n\n\t\t\t\t\tvar tempGeometry = new THREE.Geometry();\n\t\t\t\t\ttempGeometry.merge( child.geometry, child.matrix );\n\n\t\t\t\t\tchild.geometry = tempGeometry;\n\t\t\t\t\tchild.position.set( 0, 0, 0 );\n\t\t\t\t\tchild.rotation.set( 0, 0, 0 );\n\t\t\t\t\tchild.scale.set( 1, 1, 1 );\n\t\t\t\t}\n\t\t\t});\n\n\t\t};\n\n\t\tthis.hide = function () {\n\t\t\tthis.traverse(function( child ) {\n\t\t\t\tchild.visible = false;\n\t\t\t});\n\t\t};\n\n\t\tthis.show = function () {\n\t\t\tthis.traverse(function( child ) {\n\t\t\t\tchild.visible = true;\n\t\t\t\tif (child.parent == scope.pickers ) child.visible = showPickers;\n\t\t\t\tif (child.parent == scope.planes ) child.visible = false;\n\t\t\t});\n\t\t\tthis.activePlane.visible = showActivePlane;\n\t\t};\n\n\t\tthis.highlight = function ( axis ) {\n\t\t\tthis.traverse(function( child ) {\n\t\t\t\tif ( child.material && child.material.highlight ){\n\t\t\t\t\tif ( child.name == axis ) {\n\t\t\t\t\t\tchild.material.highlight( true );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchild.material.highlight( false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t};\n\n\tTHREE.TransformGizmo.prototype = Object.create( THREE.Object3D.prototype );\n\n\tTHREE.TransformGizmo.prototype.update = function ( rotation, eye ) {\n\n\t\tvar vec1 = new THREE.Vector3( 0, 0, 0 );\n\t\tvar vec2 = new THREE.Vector3( 0, 1, 0 );\n\t\tvar lookAtMatrix = new THREE.Matrix4();\n\n\t\tthis.traverse(function(child) {\n\t\t\tif ( child.name.search(\"E\") != -1 ) {\n\t\t\t\tchild.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( eye, vec1, vec2 ) );\n\t\t\t} else if ( child.name.search(\"X\") != -1 || child.name.search(\"Y\") != -1 || child.name.search(\"Z\") != -1 ) {\n\t\t\t\tchild.quaternion.setFromEuler( rotation );\n\t\t\t}\n\t\t});\n\n\t};\n\n\tTHREE.TransformGizmoTranslate = function () {\n\n\t\tTHREE.TransformGizmo.call( this );\n\n\t\tvar arrowGeometry = new THREE.Geometry();\n\t\tvar mesh = new THREE.Mesh( new THREE.CylinderGeometry( 0, 0.05, 0.2, 12, 1, false ) );\n\t\tmesh.position.y = 0.5;\n\t\tmesh.updateMatrix();\n\n\t\tarrowGeometry.merge( mesh.geometry, mesh.matrix );\n\t\t\n\t\tvar lineXGeometry = new THREE.Geometry();\n\t\tlineXGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 1, 0, 0 ) );\n\n\t\tvar lineYGeometry = new THREE.Geometry();\n\t\tlineYGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 1, 0 ) );\n\n\t\tvar lineZGeometry = new THREE.Geometry();\n\t\tlineZGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 0, 1 ) );\n\n\t\tthis.handleGizmos = {\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, -Math.PI/2 ] ],\n\t\t\t\t[ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ],\n\t\t\t\t[\tnew THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI/2, 0, 0 ] ],\n\t\t\t\t[ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.1, 0 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ 0, 0, 0 ] ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xffff00, opacity: 0.25 } ) ), [ 0.15, 0.15, 0 ] ]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0x00ffff, opacity: 0.25 } ) ), [ 0, 0.15, 0.15 ], [ 0, Math.PI/2, 0 ] ]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xff00ff, opacity: 0.25 } ) ), [ 0.15, 0, 0.15 ], [ -Math.PI/2, 0, 0 ] ]\n\t\t\t]\n\t\t};\n\n\t\tthis.pickerGizmos = {\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), new GizmoMaterial( { color: 0xff0000, opacity: 0.25 } ) ), [ 0.6, 0, 0 ], [ 0, 0, -Math.PI/2 ] ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), new GizmoMaterial( { color: 0x00ff00, opacity: 0.25 } ) ), [ 0, 0.6, 0 ] ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), new GizmoMaterial( { color: 0x0000ff, opacity: 0.25 } ) ), [ 0, 0, 0.6 ], [ Math.PI/2, 0, 0 ] ]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.2, 0 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ) ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneGeometry( 0.4, 0.4 ), new GizmoMaterial( { color: 0xffff00, opacity: 0.25 } ) ), [ 0.2, 0.2, 0 ] ]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneGeometry( 0.4, 0.4 ), new GizmoMaterial( { color: 0x00ffff, opacity: 0.25 } ) ), [ 0, 0.2, 0.2 ], [ 0, Math.PI/2, 0 ] ]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneGeometry( 0.4, 0.4 ), new GizmoMaterial( { color: 0xff00ff, opacity: 0.25 } ) ), [ 0.2, 0, 0.2 ], [ -Math.PI/2, 0, 0 ] ]\n\t\t\t]\n\t\t};\n\n\t\tthis.setActivePlane = function ( axis, eye ) {\n\n\t\t\tvar tempMatrix = new THREE.Matrix4();\n\t\t\teye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ \"XY\" ].matrixWorld ) ) );\n\n\t\t\tif ( axis == \"X\" ) {\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\t\t\t\tif ( Math.abs(eye.y) > Math.abs(eye.z) ) this.activePlane = this.planes[ \"XZ\" ];\n\t\t\t}\n\n\t\t\tif ( axis == \"Y\" ){\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\t\t\t\tif ( Math.abs(eye.x) > Math.abs(eye.z) ) this.activePlane = this.planes[ \"YZ\" ];\n\t\t\t}\n\n\t\t\tif ( axis == \"Z\" ){\n\t\t\t\tthis.activePlane = this.planes[ \"XZ\" ];\n\t\t\t\tif ( Math.abs(eye.x) > Math.abs(eye.y) ) this.activePlane = this.planes[ \"YZ\" ];\n\t\t\t}\n\n\t\t\tif ( axis == \"XYZ\" ) this.activePlane = this.planes[ \"XYZE\" ];\n\n\t\t\tif ( axis == \"XY\" ) this.activePlane = this.planes[ \"XY\" ];\n\n\t\t\tif ( axis == \"YZ\" ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\tif ( axis == \"XZ\" ) this.activePlane = this.planes[ \"XZ\" ];\n\n\t\t\tthis.hide();\n\t\t\tthis.show();\n\n\t\t};\n\n\t\tthis.init();\n\n\t};\n\n\tTHREE.TransformGizmoTranslate.prototype = Object.create( THREE.TransformGizmo.prototype );\n\n\tTHREE.TransformGizmoRotate = function () {\n\n\t\tTHREE.TransformGizmo.call( this );\n\n\t\tvar CircleGeometry = function ( radius, facing, arc ) {\n\n\t\t\t\tvar geometry = new THREE.Geometry();\n\t\t\t\tarc = arc ? arc : 1;\n\t\t\t\tfor ( var i = 0; i <= 64 * arc; ++i ) {\n\t\t\t\t\tif ( facing == 'x' ) geometry.vertices.push( new THREE.Vector3( 0, Math.cos( i / 32 * Math.PI ), Math.sin( i / 32 * Math.PI ) ).multiplyScalar(radius) );\n\t\t\t\t\tif ( facing == 'y' ) geometry.vertices.push( new THREE.Vector3( Math.cos( i / 32 * Math.PI ), 0, Math.sin( i / 32 * Math.PI ) ).multiplyScalar(radius) );\n\t\t\t\t\tif ( facing == 'z' ) geometry.vertices.push( new THREE.Vector3( Math.sin( i / 32 * Math.PI ), Math.cos( i / 32 * Math.PI ), 0 ).multiplyScalar(radius) );\n\t\t\t\t}\n\n\t\t\t\treturn geometry;\n\t\t};\n\n\t\tthis.handleGizmos = {\n\t\t\tX: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry(1,'x',0.5), new GizmoLineMaterial( { color: 0xff0000 } ) ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry(1,'y',0.5), new GizmoLineMaterial( { color: 0x00ff00 } ) ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry(1,'z',0.5), new GizmoLineMaterial( { color: 0x0000ff } ) ) ]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry(1.25,'z',1), new GizmoLineMaterial( { color: 0xcccc00 } ) ) ]\n\t\t\t],\n\t\t\tXYZE: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry(1,'z',1), new GizmoLineMaterial( { color: 0x787878 } ) ) ]\n\t\t\t]\n\t\t};\n\n\t\tthis.pickerGizmos = {\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), new GizmoMaterial( { color: 0xff0000, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ 0, -Math.PI/2, -Math.PI/2 ] ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), new GizmoMaterial( { color: 0x00ff00, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ Math.PI/2, 0, 0 ] ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), new GizmoMaterial( { color: 0x0000ff, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ 0, 0, -Math.PI/2 ] ]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1.25, 0.12, 2, 24 ), new GizmoMaterial( { color: 0xffff00, opacity: 0.25 } ) ) ]\n\t\t\t],\n\t\t\tXYZE: [\n\t\t\t\t[ new THREE.Mesh( new THREE.Geometry() ) ]// TODO\n\t\t\t]\n\t\t};\n\n\t\tthis.setActivePlane = function ( axis ) {\n\n\t\t\tif ( axis == \"E\" ) this.activePlane = this.planes[ \"XYZE\" ];\n\n\t\t\tif ( axis == \"X\" ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\tif ( axis == \"Y\" ) this.activePlane = this.planes[ \"XZ\" ];\n\n\t\t\tif ( axis == \"Z\" ) this.activePlane = this.planes[ \"XY\" ];\n\n\t\t\tthis.hide();\n\t\t\tthis.show();\n\n\t\t};\n\n\t\tthis.update = function ( rotation, eye2 ) {\n\n\t\t\tTHREE.TransformGizmo.prototype.update.apply( this, arguments );\n\n\t\t\tvar group = {\n\t\t\t\thandles: this[\"handles\"],\n\t\t\t\tpickers: this[\"pickers\"],\n\t\t\t};\n\n\t\t\tvar tempMatrix = new THREE.Matrix4();\n\t\t\tvar worldRotation = new THREE.Euler( 0, 0, 1 );\n\t\t\tvar tempQuaternion = new THREE.Quaternion();\n\t\t\tvar unitX = new THREE.Vector3( 1, 0, 0 );\n\t\t\tvar unitY = new THREE.Vector3( 0, 1, 0 );\n\t\t\tvar unitZ = new THREE.Vector3( 0, 0, 1 );\n\t\t\tvar quaternionX = new THREE.Quaternion();\n\t\t\tvar quaternionY = new THREE.Quaternion();\n\t\t\tvar quaternionZ = new THREE.Quaternion();\n\t\t\tvar eye = eye2.clone();\n\n\t\t\tworldRotation.copy( this.planes[\"XY\"].rotation );\n\t\t\ttempQuaternion.setFromEuler( worldRotation );\n\n\t\t\ttempMatrix.makeRotationFromQuaternion( tempQuaternion ).getInverse( tempMatrix );\n\t\t\teye.applyMatrix4( tempMatrix );\n\n\t\t\tthis.traverse(function(child) {\n\n\t\t\t\ttempQuaternion.setFromEuler( worldRotation );\n\n\t\t\t\tif ( child.name == \"X\" ) {\n\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, Math.atan2( -eye.y, eye.z ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX );\n\t\t\t\t\tchild.quaternion.copy( tempQuaternion );\n\t\t\t\t}\n\n\t\t\t\tif ( child.name == \"Y\" ) {\n\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, Math.atan2( eye.x, eye.z ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY );\n\t\t\t\t\tchild.quaternion.copy( tempQuaternion );\n\t\t\t\t}\n\n\t\t\t\tif ( child.name == \"Z\" ) {\n\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, Math.atan2( eye.y, eye.x ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ );\n\t\t\t\t\tchild.quaternion.copy( tempQuaternion );\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t};\n\n\t\tthis.init();\n\n\t};\n\n\tTHREE.TransformGizmoRotate.prototype = Object.create( THREE.TransformGizmo.prototype );\n\n\tTHREE.TransformGizmoScale = function () {\n\n\t\tTHREE.TransformGizmo.call( this );\n\n\t\tvar arrowGeometry = new THREE.Geometry();\n\t\tvar mesh = new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ) );\n\t\tmesh.position.y = 0.5;\n\t\tmesh.updateMatrix();\n\n\t\tarrowGeometry.merge( mesh.geometry, mesh.matrix );\n\n\t\tvar lineXGeometry = new THREE.Geometry();\n\t\tlineXGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 1, 0, 0 ) );\n\n\t\tvar lineYGeometry = new THREE.Geometry();\n\t\tlineYGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 1, 0 ) );\n\n\t\tvar lineZGeometry = new THREE.Geometry();\n\t\tlineZGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 0, 1 ) );\n\n\t\tthis.handleGizmos = {\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, -Math.PI/2 ] ],\n\t\t\t\t[ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ],\n\t\t\t\t[ new THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI/2, 0, 0 ] ],\n\t\t\t\t[ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ) ]\n\t\t\t]\n\t\t};\n\n\t\tthis.pickerGizmos = {\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), new GizmoMaterial( { color: 0xff0000, opacity: 0.25 } ) ), [ 0.6, 0, 0 ], [ 0, 0, -Math.PI/2 ] ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), new GizmoMaterial( { color: 0x00ff00, opacity: 0.25 } ) ), [ 0, 0.6, 0 ] ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), new GizmoMaterial( { color: 0x0000ff, opacity: 0.25 } ) ), [ 0, 0, 0.6 ], [ Math.PI/2, 0, 0 ] ]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.BoxGeometry( 0.4, 0.4, 0.4 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ) ]\n\t\t\t]\n\t\t};\n\n\t\tthis.setActivePlane = function ( axis, eye ) {\n\n\t\t\tvar tempMatrix = new THREE.Matrix4();\n\t\t\teye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ \"XY\" ].matrixWorld ) ) );\n\n\t\t\tif ( axis == \"X\" ) {\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\t\t\t\tif ( Math.abs(eye.y) > Math.abs(eye.z) ) this.activePlane = this.planes[ \"XZ\" ];\n\t\t\t}\n\n\t\t\tif ( axis == \"Y\" ){\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\t\t\t\tif ( Math.abs(eye.x) > Math.abs(eye.z) ) this.activePlane = this.planes[ \"YZ\" ];\n\t\t\t}\n\n\t\t\tif ( axis == \"Z\" ){\n\t\t\t\tthis.activePlane = this.planes[ \"XZ\" ];\n\t\t\t\tif ( Math.abs(eye.x) > Math.abs(eye.y) ) this.activePlane = this.planes[ \"YZ\" ];\n\t\t\t}\n\n\t\t\tif ( axis == \"XYZ\" ) this.activePlane = this.planes[ \"XYZE\" ];\n\n\t\t\tthis.hide();\n\t\t\tthis.show();\n\n\t\t};\n\n\t\tthis.init();\n\n\t};\n\n\tTHREE.TransformGizmoScale.prototype = Object.create( THREE.TransformGizmo.prototype );\n\n\tTHREE.TransformControls = function ( camera, domElement ) {\n\n\t\t// TODO: Make non-uniform scale and rotate play nice in hierarchies\n\t\t// TODO: ADD RXYZ contol\n\n\t\tTHREE.Object3D.call( this );\n\n\t\tdomElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\tthis.gizmo = {};\n\t\tthis.gizmo[\"translate\"] = new THREE.TransformGizmoTranslate();\n\t\tthis.gizmo[\"rotate\"] = new THREE.TransformGizmoRotate();\n\t\tthis.gizmo[\"scale\"] = new THREE.TransformGizmoScale();\n\n\t\tthis.add(this.gizmo[\"translate\"]);\n\t\tthis.add(this.gizmo[\"rotate\"]);\n\t\tthis.add(this.gizmo[\"scale\"]);\n\n\t\tthis.gizmo[\"translate\"].hide();\n\t\tthis.gizmo[\"rotate\"].hide();\n\t\tthis.gizmo[\"scale\"].hide();\n\n\t\tthis.object = undefined;\n\t\tthis.snap = null;\n\t\tthis.space = \"world\";\n\t\tthis.size = 1;\n\t\tthis.axis = null;\n\n\t\tvar scope = this;\n\t\t\n\t\tvar _dragging = false;\n\t\tvar _mode = \"translate\";\n\t\tvar _plane = \"XY\";\n\n\t\tvar changeEvent = { type: \"change\" };\n\n\t\tvar ray = new THREE.Raycaster();\n\t\tvar projector = new THREE.Projector();\n\t\tvar pointerVector = new THREE.Vector3();\n\n\t\tvar point = new THREE.Vector3();\n\t\tvar offset = new THREE.Vector3();\n\n\t\tvar rotation = new THREE.Vector3();\n\t\tvar offsetRotation = new THREE.Vector3();\n\t\tvar scale = 1;\n\n\t\tvar lookAtMatrix = new THREE.Matrix4();\n\t\tvar eye = new THREE.Vector3();\n\n\t\tvar tempMatrix = new THREE.Matrix4();\n\t\tvar tempVector = new THREE.Vector3();\n\t\tvar tempQuaternion = new THREE.Quaternion();\n\t\tvar unitX = new THREE.Vector3( 1, 0, 0 );\n\t\tvar unitY = new THREE.Vector3( 0, 1, 0 );\n\t\tvar unitZ = new THREE.Vector3( 0, 0, 1 );\n\n\t\tvar quaternionXYZ = new THREE.Quaternion();\n\t\tvar quaternionX = new THREE.Quaternion();\n\t\tvar quaternionY = new THREE.Quaternion();\n\t\tvar quaternionZ = new THREE.Quaternion();\n\t\tvar quaternionE = new THREE.Quaternion();\n\n\t\tvar oldPosition = new THREE.Vector3();\n\t\tvar oldScale = new THREE.Vector3();\n\t\tvar oldRotationMatrix = new THREE.Matrix4();\n\n\t\tvar parentRotationMatrix = new THREE.Matrix4();\n\t\tvar parentScale = new THREE.Vector3();\n\n\t\tvar worldPosition = new THREE.Vector3();\n\t\tvar worldRotation = new THREE.Euler();\n\t\tvar worldRotationMatrix = new THREE.Matrix4();\n\t\tvar camPosition = new THREE.Vector3();\n\t\tvar camRotation = new THREE.Euler();\n\n\t\tdomElement.addEventListener( \"mousedown\", onPointerDown, false );\n\t\tdomElement.addEventListener( \"touchstart\", onPointerDown, false );\n\n\t\tdomElement.addEventListener( \"mousemove\", onPointerHover, false );\n\t\tdomElement.addEventListener( \"touchmove\", onPointerHover, false );\n\n\t\tdomElement.addEventListener( \"mousemove\", onPointerMove, false );\n\t\tdomElement.addEventListener( \"touchmove\", onPointerMove, false );\n\n\t\tdomElement.addEventListener( \"mouseup\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"mouseout\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchend\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchcancel\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchleave\", onPointerUp, false );\n\n\t\tthis.attach = function ( object ) {\n\n\t\t\tscope.object = object;\n\n\t\t\tthis.gizmo[\"translate\"].hide();\n\t\t\tthis.gizmo[\"rotate\"].hide();\n\t\t\tthis.gizmo[\"scale\"].hide();\n\t\t\tthis.gizmo[_mode].show();\n\n\t\t\tscope.update();\n\n\t\t};\n\n\t\tthis.detach = function ( object ) {\n\n\t\t\tscope.object = undefined;\n\t\t\tthis.axis = undefined;\n\n\t\t\tthis.gizmo[\"translate\"].hide();\n\t\t\tthis.gizmo[\"rotate\"].hide();\n\t\t\tthis.gizmo[\"scale\"].hide();\n\n\t\t};\n\n\t\tthis.setMode = function ( mode ) {\n\n\t\t\t_mode = mode ? mode : _mode;\n\n\t\t\tif ( _mode == \"scale\" ) scope.space = \"local\";\n\n\t\t\tthis.gizmo[\"translate\"].hide();\n\t\t\tthis.gizmo[\"rotate\"].hide();\n\t\t\tthis.gizmo[\"scale\"].hide();\t\n\t\t\tthis.gizmo[_mode].show();\n\n\t\t\tthis.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t};\n\n\t\tthis.setSnap = function ( snap ) {\n\n\t\t\tscope.snap = snap;\n\n\t\t};\n\n\t\tthis.setSize = function ( size ) {\n\n\t\t\tscope.size = size;\n\t\t\tthis.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\t\t\t\n\t\t};\n\n\t\tthis.setSpace = function ( space ) {\n\n\t\t\tscope.space = space;\n\t\t\tthis.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t};\n\n\t\tthis.update = function () {\n\n\t\t\tif ( scope.object === undefined ) return;\n\n\t\t\tscope.object.updateMatrixWorld();\n\t\t\tworldPosition.setFromMatrixPosition( scope.object.matrixWorld );\n\t\t\tworldRotation.setFromRotationMatrix( tempMatrix.extractRotation( scope.object.matrixWorld ) );\n\n\t\t\tcamera.updateMatrixWorld();\n\t\t\tcamPosition.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tcamRotation.setFromRotationMatrix( tempMatrix.extractRotation( camera.matrixWorld ) );\n\n\t\t\tscale = worldPosition.distanceTo( camPosition ) / 6 * scope.size;\n\t\t\tthis.position.copy( worldPosition );\n\t\t\tthis.scale.set( scale, scale, scale );\n\n\t\t\teye.copy( camPosition ).sub( worldPosition ).normalize();\n\n\t\t\tif ( scope.space == \"local\" )\n\t\t\t\tthis.gizmo[_mode].update( worldRotation, eye );\n\n\t\t\telse if ( scope.space == \"world\" )\n\t\t\t\tthis.gizmo[_mode].update( new THREE.Euler(), eye );\n\n\t\t\tthis.gizmo[_mode].highlight( scope.axis );\n\n\t\t};\n\n\t\tfunction onPointerHover( event ) {\n\n\t\t\tif ( scope.object === undefined || _dragging === true ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tvar pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;\n\n\t\t\tvar intersect = intersectObjects( pointer, scope.gizmo[_mode].pickers.children );\n\n\t\t\tif ( intersect ) {\n\n\t\t\t\tscope.axis = intersect.object.name;\n\t\t\t\tscope.update();\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t} else if ( scope.axis !== null ) {\n\n\t\t\t\tscope.axis = null;\n\t\t\t\tscope.update();\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onPointerDown( event ) {\n\n\t\t\tif ( scope.object === undefined || _dragging === true ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;\n\n\t\t\tif ( pointer.button === 0 || pointer.button === undefined ) {\n\n\t\t\t\tvar intersect = intersectObjects( pointer, scope.gizmo[_mode].pickers.children );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tscope.axis = intersect.object.name;\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\teye.copy( camPosition ).sub( worldPosition ).normalize();\n\n\t\t\t\t\tscope.gizmo[_mode].setActivePlane( scope.axis, eye );\n\n\t\t\t\t\tvar planeIntersect = intersectObjects( pointer, [scope.gizmo[_mode].activePlane] );\n\n\t\t\t\t\toldPosition.copy( scope.object.position );\n\t\t\t\t\toldScale.copy( scope.object.scale );\n\n\t\t\t\t\toldRotationMatrix.extractRotation( scope.object.matrix );\n\t\t\t\t\tworldRotationMatrix.extractRotation( scope.object.matrixWorld );\n\n\t\t\t\t\tparentRotationMatrix.extractRotation( scope.object.parent.matrixWorld );\n\t\t\t\t\tparentScale.setFromMatrixScale( tempMatrix.getInverse( scope.object.parent.matrixWorld ) );\n\n\t\t\t\t\toffset.copy( planeIntersect.point );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_dragging = true;\n\n\t\t}\n\n\t\tfunction onPointerMove( event ) {\n\n\t\t\tif ( scope.object === undefined || scope.axis === null || _dragging === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar pointer = event.changedTouches? event.changedTouches[0] : event;\n\n\t\t\tvar planeIntersect = intersectObjects( pointer, [scope.gizmo[_mode].activePlane] );\n\n\t\t\tpoint.copy( planeIntersect.point );\n\n\t\t\tif ( _mode == \"translate\" ) {\n\n\t\t\t\tpoint.sub( offset );\n\t\t\t\tpoint.multiply(parentScale);\n\n\t\t\t\tif ( scope.space == \"local\" ) {\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\tif ( scope.axis.search(\"X\") == -1 ) point.x = 0;\n\t\t\t\t\tif ( scope.axis.search(\"Y\") == -1 ) point.y = 0;\n\t\t\t\t\tif ( scope.axis.search(\"Z\") == -1 ) point.z = 0;\n\n\t\t\t\t\tpoint.applyMatrix4( oldRotationMatrix );\n\n\t\t\t\t\tscope.object.position.copy( oldPosition );\n\t\t\t\t\tscope.object.position.add( point );\n\n\t\t\t\t} \n\n\t\t\t\tif ( scope.space == \"world\" || scope.axis.search(\"XYZ\") != -1 ) {\n\n\t\t\t\t\tif ( scope.axis.search(\"X\") == -1 ) point.x = 0;\n\t\t\t\t\tif ( scope.axis.search(\"Y\") == -1 ) point.y = 0;\n\t\t\t\t\tif ( scope.axis.search(\"Z\") == -1 ) point.z = 0;\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( parentRotationMatrix ) );\n\n\t\t\t\t\tscope.object.position.copy( oldPosition );\n\t\t\t\t\tscope.object.position.add( point );\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( scope.snap !== null ) {\n\t\t\t\t\n\t\t\t\t\tif ( scope.axis.search(\"X\") != -1 ) scope.object.position.x = Math.round( scope.object.position.x / scope.snap ) * scope.snap;\n\t\t\t\t\tif ( scope.axis.search(\"Y\") != -1 ) scope.object.position.y = Math.round( scope.object.position.y / scope.snap ) * scope.snap;\n\t\t\t\t\tif ( scope.axis.search(\"Z\") != -1 ) scope.object.position.z = Math.round( scope.object.position.z / scope.snap ) * scope.snap;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t} else if ( _mode == \"scale\" ) {\n\n\t\t\t\tpoint.sub( offset );\n\t\t\t\tpoint.multiply(parentScale);\n\n\t\t\t\tif ( scope.space == \"local\" ) {\n\n\t\t\t\t\tif ( scope.axis == \"XYZ\") {\n\n\t\t\t\t\t\tscale = 1 + ( ( point.y ) / 50 );\n\n\t\t\t\t\t\tscope.object.scale.x = oldScale.x * scale;\n\t\t\t\t\t\tscope.object.scale.y = oldScale.y * scale;\n\t\t\t\t\t\tscope.object.scale.z = oldScale.z * scale;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\t\tif ( scope.axis == \"X\" ) scope.object.scale.x = oldScale.x * ( 1 + point.x / 50 );\n\t\t\t\t\t\tif ( scope.axis == \"Y\" ) scope.object.scale.y = oldScale.y * ( 1 + point.y / 50 );\n\t\t\t\t\t\tif ( scope.axis == \"Z\" ) scope.object.scale.z = oldScale.z * ( 1 + point.z / 50 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( _mode == \"rotate\" ) {\n\n\t\t\t\tpoint.sub( worldPosition );\n\t\t\t\tpoint.multiply(parentScale);\n\t\t\t\ttempVector.copy(offset).sub( worldPosition );\n\t\t\t\ttempVector.multiply(parentScale);\n\n\t\t\t\tif ( scope.axis == \"E\" ) {\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) );\n\t\t\t\t\ttempVector.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) );\n\n\t\t\t\t\trotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) );\n\t\t\t\t\toffsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) );\n\n\t\t\t\t\ttempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) );\n\n\t\t\t\t\tquaternionE.setFromAxisAngle( eye, rotation.z - offsetRotation.z );\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( worldRotationMatrix );\n\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionE );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ );\n\n\t\t\t\t\tscope.object.quaternion.copy( tempQuaternion );\n\n\t\t\t\t} else if ( scope.axis == \"XYZE\" ) {\n\n\t\t\t\t\tquaternionE.setFromEuler( point.clone().cross(tempVector).normalize() ); // rotation axis\n\n\t\t\t\t\ttempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) );\n\t\t\t\t\tquaternionX.setFromAxisAngle( quaternionE, - point.clone().angleTo(tempVector) );\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( worldRotationMatrix );\n\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ );\n\n\t\t\t\t\tscope.object.quaternion.copy( tempQuaternion );\n\n\t\t\t\t} else if ( scope.space == \"local\" ) {\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\ttempVector.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\trotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) );\n\t\t\t\t\toffsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) );\n\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( oldRotationMatrix );\n\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x );\n\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y );\n\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z );\n\n\t\t\t\t\tif ( scope.axis == \"X\" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionX );\n\t\t\t\t\tif ( scope.axis == \"Y\" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionY );\n\t\t\t\t\tif ( scope.axis == \"Z\" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionZ );\n\n\t\t\t\t\tscope.object.quaternion.copy( quaternionXYZ );\n\n\t\t\t\t} else if ( scope.space == \"world\" ) {\n\n\t\t\t\t\trotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) );\n\t\t\t\t\toffsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) );\n\n\t\t\t\t\ttempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) );\n\n\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x );\n\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y );\n\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z );\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( worldRotationMatrix );\n\n\t\t\t\t\tif ( scope.axis == \"X\" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX );\n\t\t\t\t\tif ( scope.axis == \"Y\" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY );\n\t\t\t\t\tif ( scope.axis == \"Z\" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ );\n\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ );\n\n\t\t\t\t\tscope.object.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t}\n\n\t\tfunction onPointerUp( event ) {\n\n\t\t\t_dragging = false;\n\t\t\tonPointerHover( event );\n\n\t\t}\n\n\t\tfunction intersectObjects( pointer, objects ) {\n\n\t\t\tvar rect = domElement.getBoundingClientRect();\n\t\t\tvar x = (pointer.clientX - rect.left) / rect.width;\n\t\t\tvar y = (pointer.clientY - rect.top) / rect.height;\n\t\t\tpointerVector.set( ( x ) * 2 - 1, - ( y ) * 2 + 1, 0.5 );\n\n\t\t\tprojector.unprojectVector( pointerVector, camera );\n\t\t\tray.set( camPosition, pointerVector.sub( camPosition ).normalize() );\n\n\t\t\tvar intersections = ray.intersectObjects( objects, true );\n\t\t\treturn intersections[0] ? intersections[0] : false;\n\n\t\t}\n\n\t};\n\n\tTHREE.TransformControls.prototype = Object.create( THREE.Object3D.prototype );\n\n}());"
},
"$:/plugins/rboue/Three.js/Lib/Controls/VRControls.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Controls/VRControls.js",
"module-type": "library",
"text": "/**\n * @author dmarcos / https://github.com/dmarcos\n */\n\nTHREE.VRControls = function ( camera, done ) {\n\n\tthis._camera = camera;\n\n\tthis._init = function () {\n\t\tvar self = this;\n\t\tif ( !navigator.mozGetVRDevices && !navigator.getVRDevices ) {\n\t\t\tif ( done ) {\n\t\t\t\tdone(\"Your browser is not VR Ready\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif ( navigator.getVRDevices ) {\n\t\t\tnavigator.getVRDevices().then( gotVRDevices );\n\t\t} else {\n\t\t\tnavigator.mozGetVRDevices( gotVRDevices );\n\t\t}\n\t\tfunction gotVRDevices( devices ) {\n\t\t\tvar vrInput;\n\t\t\tvar error;\n\t\t\tfor ( var i = 0; i < devices.length; ++i ) {\n\t\t\t\tif ( devices[i] instanceof PositionSensorVRDevice ) {\n\t\t\t\t\tvrInput = devices[i]\n\t\t\t\t\tself._vrInput = vrInput;\n\t\t\t\t\tbreak; // We keep the first we encounter\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( done ) {\n\t\t\t\tif ( !vrInput ) {\n\t\t\t\t error = 'HMD not available';\n\t\t\t\t}\n\t\t\t\tdone( error );\n\t\t\t}\n\t\t}\n\t};\n\n\tthis._init();\n\n\tthis.update = function() {\n\t\tvar camera = this._camera;\n\t\tvar quat;\n\t\tvar vrState = this.getVRState();\n\t\tif ( !vrState ) {\n\t\t\treturn;\n\t\t}\n\t\t// Applies head rotation from sensors data.\n\t\tif ( camera ) {\n\t\t\tcamera.quaternion.fromArray( vrState.hmd.rotation );\n\t\t}\n\t};\n\n\tthis.getVRState = function() {\n\t\tvar vrInput = this._vrInput;\n\t\tvar orientation;\n\t\tvar vrState;\n\t\tif ( !vrInput ) {\n\t\t\treturn null;\n\t\t}\n\t\torientation\t= vrInput.getState().orientation;\n\t\tvrState = {\n\t\t\thmd : {\n\t\t\t\trotation : [\n\t\t\t\t\torientation.x,\n\t\t\t\t\torientation.y,\n\t\t\t\t\torientation.z,\n\t\t\t\t\torientation.w\n\t\t\t\t]\n\t\t\t}\n\t\t};\n\t\treturn vrState;\n\t};\n\n};"
},
"$:/plugins/rboue/Three.js/config.json": {
"title": "$:/plugins/rboue/Three.js/config.json",
"type": "application/json",
"text": "{\n\"\":\"Actually nothing.\",\n\n\"\":\"\"\n}"
},
"$:/plugins/rboue/Three.js/icon": {
"created": "20150122113649353",
"modified": "20150122113650949",
"title": "$:/plugins/rboue/Three.js/icon",
"type": "image/png",
"text": "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\n"
},
"$:/plugins/rboue/Three.js/license": {
"title": "$:/plugins/rboue/Three.js/license",
"text": "!Plugin license\nCopyright (C) 2015 René Boué (rboue) <rboue01 (at) gmail (dot) com><br>\nAll rights reserved.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n\n!Three.js r69 license\nThe Three.js r69 LICENSE file is as follows :\n\n```\nThe MIT License\n\nCopyright © 2010-2014 three.js authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n```"
},
"$:/plugins/rboue/Three.js/readme": {
"title": "$:/plugins/rboue/Three.js/readme",
"text": "Three.js r69 for ~TiddlyWiki."
},
"$:/plugins/rboue/Three.js/tiddlywiki.js": {
"text": "/*\\\ntitle: $:/plugins/rboue/Three.js/tiddlywiki.js\ntype: application/javascript\nmodule-type: library\n\n Adaptation of Three.js to TiddlyWiki.\n\n\\*/\n(function() {\n\n var TiddlyWiki = function(widget, tiddlerTitle, widgetConfiguration) {\n this.widget = widget; // widget\n this.tiddlerTitle = tiddlerTitle; // title of the main code tiddler\n this.widgetConfiguration = widgetConfiguration; // widget's configuration object\n };\n\n // Static members\n\n // Initialized at TiddlyWiki session opening\n TiddlyWiki.sessionConfiguration = null; // Session configuration\n\n // Static initialisations\n TiddlyWiki.init = function(sessionConfiguration) {\n TiddlyWiki.sessionConfiguration = sessionConfiguration;\n };\n\n // Get CSS raw source of a tiddler image\n TiddlyWiki.getRawTiddlerImage = function(tiddlerName) {\n if (!$tw || !$tw.wiki) return false;\n // Check if it is an image tiddler\n if (!$tw.wiki.isImageTiddler(tiddlerName)) return false;\n var tiddler = $tw.wiki.getTiddler(tiddlerName);\n if ((typeof(tiddler) == \"undefined\") || !tiddler) return false;\n var text = tiddler.fields.text;\n if (!text) return false;\n var type = tiddler.fields.type;\n // Render the appropriate element for the image type\n var src = \"\";\n switch(type) {\n case \"image/svg+xml\":\n src = \"data:image/svg+xml,\" + encodeURIComponent(text);\n break;\n default:\n src = \"data:\" + type + \";base64,\" + text;\n break;\n }\n\n return src;\n }; \n\n // Loading of TiddlyWiki specific URL\n // Parameters :\n // <url> : URL with specific syntax : \"tw:<tiddler title>\"\n // <type> : \"image\" for image tiddler, \"ArrayBuffer\" for tiddler with base64 content.\n // Returns the tiddler data (text or binary) or null.\n // The type of data (text or binary) is deduced from the tiddler's type.\n // Type image/xx means tiddler image.\n // Type application/octet-stream means binary data coded with base64. In that case an ArrayBuffer\n // is returned.\n // Other types means plain text.\n TiddlyWiki.load = function(url) {\n var func = \"TiddlyWiki.load\";\n if (!url || !url.match(/^tw:/)) return null;\n hack.log(\"url: \"+url, hack.loader, func);\n var tiddlerTitle = tiddlyWiki.resolvePath(url.replace(\"tw:\", \"\"), true);\n var tiddler = $tw.wiki.getTiddler(tiddlerTitle);\n if ((typeof(tiddler) == \"undefined\") || !tiddler) {\n throw new Error(\"TiddlyWiki.load: \\\"\" + url + \"\\\" : unknown tiddler.\");\n }\n if (tiddler.fields.type.match(/^image\\//))\n return TiddlyWiki.getRawTiddlerImage(tiddlerTitle);\n else {\n if (!tiddler.fields.text) {\n console.error(\"TiddlyWiki.load: \\\"\" + url + \"\\\" seems to be unreachable or the tiddler is empty.\");\n return null;\n }\n if (tiddler.fields.type == \"application/octet-stream\")\n return StringView.makeFromBase64(tiddler.fields.text).buffer;\n else\n return tiddler.fields.text;\n }\n };\n\n // Export current view to an image tiddler\n // Parameters :\n // <domElement> : DOM element, <canvas> or <svg>.\n // <url> : URL with specific syntax : \"tw:<tiddler title>\".\n // <type> : type of image tiddler : \"image/png\" (default) or \"image/jpeg\".\n // <flagOverwrite> : if true, overwrites existing tiddler without asking.\n // Saves view data as a tiddler image with required type.\n TiddlyWiki.exportToTiddler = function(domElement, url, type, flagOverwrite) {\n var func = \"TiddlyWiki.exportToTiddler\";\n if (!url || !url.match(/^tw:/)) {\n console.error(func+\": bad URL format, not a tiddler.\");\n return;\n }\n hack.log(\"url: \"+url, hack.render, func);\n var tag = domElement.tagName.toUpperCase();\n if (!type) {\n if (tag == \"SVG\")\n type = \"image/svg+xml\";\n else\n type = \"image/png\";\n }\n if ((((type == \"image/png\") || (type == \"image/jpeg\")) && (tag != \"CANVAS\")) ||\n ((type == \"image/svg+xml\") && (tag != \"SVG\"))) {\n console.error(func+\": bad tiddler type : \"+type)\n return;\n }\n var tiddlerTitle = tiddlyWiki.resolvePath(url.replace(\"tw:\", \"\"), true);\n if (!flagOverwrite) {\n var tiddler = $tw.wiki.getTiddler(tiddlerTitle);\n if ((typeof(tiddler) != \"undefined\") && tiddler) {\n if (!confirm(\"View image saving : tiddler <\"+tiddlerTitle+\"> exists, would you like to overwrite it ?\")) return;\n }\n }\n var data = null;\n if (tag == \"SVG\") {\n data = domElement.outerHTML;\n type = \"\"; // bad TiddlyWiki behavior (with 5.1.5) !?\n } else\n data = domElement.toDataURL(type).replace(/^data:.*?;base64,/, \"\");\n //console.log(func+\": data = \"+data);\n\n // Create the image tiddler\n $tw.wiki.addTiddler(new $tw.Tiddler({title: tiddlerTitle, type: type, text: data}));\n };\n\n // Create a Worker to execute inline code\n TiddlyWiki.createWorker = function (func) {\n var blobURL = URL.createObjectURL(new Blob(\n [\"(\", func.toString(), \")()\"],\n {type: \"application/javascript\"}\n ));\n var worker = new Worker(blobURL);\n URL.revokeObjectURL(blobURL);\n\n return worker;\n };\n\n\n // Instance members\n\n TiddlyWiki.prototype = {\n\n // Resolve file path.\n //\n // Following behaviour apply only if widget's configuration's object property \"filesystem\"\n // is defined. If not, file is assumed to be a tiddler's title.\n //\n // File path resolution is as close as possible to Unix (for executables, libraries,\n // manuals, ...).\n // We make assumption that tiddler title follows classical Unix Path pattern\n // like : /dir1/dir2/ ... /dir/file. If not the case, file should be\n // in the \"current\" directory, or completely out of path convention.\n // The curent directory (if any) is the \"directory\" of the current sheet tiddler.\n // Example :\n // File to resolve = myTiddler\n // Tiddler title of the current sheet = MyProject/MySubProject/calc1\n // Current directory = MyProject/MySubProject\n // Sheet file in filesystem mode = calc1\n // File path = MyProject/MySubProject/myTiddler\n //\n // Unlike Unix, there is no notion of root directory or \"/\". TiddlyWiki has no\n // real filesystem so we can't rely on a root node. Relative versus absolute\n // path is deduced from the following. If the first caracter of a file\n // path is \"/\" and there is no more \"/\" after that, then the current directory is \"\".\n // Remark that the behavior is identical to Unix. A file path beginning with a \"/\"\n // will be directly converted in a tiddler title.\n // By default (and unlike Unix), malformed path like multiple \"/\" instead of one\n // are not accepted. For example \"//\" is not reduced to \"/\" and treated like a\n // path separator. It is the responsibility of the user to be clear about the significance of\n // it's file reference, path-like name or tiddler title. For same reason,\n // blank characters, eventually around \"/\", are treated like ordinary characters\n // and not deleted in the final tiddler title.\n // With optionnal <flagNormalize> parameter set, malformed path are normalized like\n // Unix does, but blank characters are still not deleted.\n //\n // If not found in the current directory, a file is searched under a collection\n // of path directories, pre-defined in the PATH variable. Those directories are\n // absolute (i.e. not relative to current directory).\n // Syntax of the PATH variable :\n // <path1>';'<path2>';' ... ';'<pathN>\n // The PATH is searched first in a variable defined with a <$set> widget (not actually\n // implemented, maybe in the future if someone asks :), then in the \"path\" parameter\n // of the <$edit-socialcalc> widget, then in the widget's configuration object, under\n // filesystem.PATH property. The widget's configuration object is searched first in\n // $:/config/Three.js tiddler of \"application/json\" type, then in\n // $:/plugins/Three.js/config-defaults.json tiddler.\n // Please note that final PATH value is never a combination of different sources. The first\n // source that defines a valid PATH (either <$set> variable, \"path\" parameter of\n // <$edit-socialcalc> widget or widget's configuration object) gives the proper PATH value\n // and stops all subsequent PATH search.\n //\n // Search algorithm :\n // <file> : input file path.\n // <tiddlerTitle> : output.\n // <currentTiddlerTitle> : tiddler title of the current sheet.\n // PATH <- value of a \"path\" variable defined with <$set> widget, or \"path\" field\n // of <currentTiddlerTitle>.\n // currentDir <- path of <currentTiddlerTitle> (anything before the last '/', or \"\").\n // if <file> begins with \"./\" or \"../\" then\n // # Relative path\n // <finalPath> <- ... (search à la Unix)\n // if tiddler <finalPath> found then return <finalPath>\n // else\n // # Under <currentDir> or under a PATH directory, or absolute\n // if tiddler <currentDir>/<file> found then return <currentDir>/<file>\n // if <PATH> exists then\n // for all <dir> in <PATH>\n // if tiddler <dir>/<file> found then return <dir>/<file>\n // end for\n // end if\n // if tiddler <file> found then return file\n // end if\n //\n resolvePath: function(file, flagNormalize) {\n var fonc = \"TiddlyWiki.resolvePath\";\n\n hack.log(\"============= file = \"+file, hack.filesystem, fonc);\n\n if (!file) return null;\n var tiddlerTitle = \"\";\n var tiddler = false;\n if (!this.widgetConfiguration || !this.widgetConfiguration.filesystem) {\n hack.log(\"no filesystem in widget's configuration !\", hack.filesystem, fonc);\n return(file);\n }\n\n // Initialisation\n var currentTiddlerTitle = this.tiddlerTitle\n var currentDir = \"\";\n tiddler = $tw.wiki.getTiddler(currentTiddlerTitle);\n if ((typeof(tiddler) == \"undefined\") || !tiddler) return null;\n \n // In case current tiddler is edited, we refer to the \"file\", not the draft tiddler\n if (tiddler.isDraft()) currentTiddlerTitle = tiddler.fields[\"draft.of\"];\n hack.log(\"currentTiddlerTitle = \"+currentTiddlerTitle, hack.filesystem, fonc);\n \n // Get PATH\n var tabPath = null;\n if (this.widgetConfiguration.filesystem.PATH && this.widgetConfiguration.filesystem.PATH != \"\")\n tabPath = this.widgetConfiguration.filesystem.PATH.split(/[\\s]*;[\\s]*/);\n hack.log(\"tabPath = \"+(tabPath ? tabPath.join(\" | \"): tabPath), hack.filesystem, fonc);\n\n currentDir = currentTiddlerTitle.replace(/[\\/][^\\/]*$/, \"\").replace(/[\\/][.][\\/]/, \"/\");;\n hack.log(\"currentDir = \"+currentDir, hack.filesystem, fonc);\n\n // File normalization\n if (flagNormalize) {\n file = file.replace(/[\\/][\\/]+/g, \"/\").replace(/\\/\\.\\//g, \"/\");\n hack.log(\"file normalized = \"+file, hack.filesystem, fonc);\n }\n\n if (file.match(/^\\.\\/|^\\.\\.\\/|\\/\\.\\.\\//)) {\n // Relative path or with relative sub-expressions\n \n hack.log(\"relative path\", hack.filesystem, fonc);\n tabCurrentDir = currentDir.split(\"/\");\n hack.log(\"tabCurrentDir = \"+tabCurrentDir.join(\" | \"), hack.filesystem, fonc);\n tabPageName = file.split(\"/\");\n var tabTiddlerTitle = [];\n for (var i = 0; i < tabCurrentDir.length; i++)\n tabTiddlerTitle.push(tabCurrentDir[i]);\n hack.log(\"tabTiddlerTitle = \"+tabTiddlerTitle.join(\" | \"), hack.filesystem, fonc);\n var indexInCurrentDir = tabCurrentDir.length - 1;\n hack.log(\"indexInCurrentDir = \"+indexInCurrentDir, hack.filesystem, fonc);\n var flagAbsolute = false;\n for (var i = 0; i < tabPageName.length; i++) {\n hack.log(\"boucle: tabPageName[\"+i+\"] = \"+tabPageName[i], hack.filesystem, fonc);\n hack.log(\" indexInCurrentDir = \"+indexInCurrentDir, hack.filesystem, fonc);\n hack.log(\" tabTiddlerTitle = \"+tabTiddlerTitle.join(\" | \"), hack.filesystem, fonc);\n if (tabPageName[i] == \".\") continue;\n if (tabPageName[i] == \"..\") {\n indexInCurrentDir--;\n if (tabTiddlerTitle.length == 0) {\n // Malformed path -> it seems to be an absolute non-path tiddler title\n hack.log(\" malformed path case 1\", hack.filesystem, fonc);\n flagAbsolute = true;\n break;\n }\n tabTiddlerTitle.pop();\n continue;\n }\n indexInCurrentDir++; // alas ! maybe we will return above currentDir\n hack.log(\" tabCurrentDir[indexInCurrentDir] = \"+tabCurrentDir[indexInCurrentDir], hack.filesystem, fonc);\n if (indexInCurrentDir < tabCurrentDir.length - 1) {\n // We wander above currentDir\n if ((indexInCurrentDir < 0) || (tabPageName[i] != tabCurrentDir[indexInCurrentDir])) {\n // Malformed path -> it seems to be an absolute non-path tiddler title\n hack.log(\" malformed path case 2\", hack.filesystem, fonc);\n flagAbsolute = true;\n break;\n }\n }\n tabTiddlerTitle.push(tabPageName[i])\n }\n\n if (!flagAbsolute) {\n tiddlerTitle = tabTiddlerTitle.join(\"/\");\n } else {\n tiddlerTitle = file;\n }\n\n } else {\n // Not relative path\n hack.log(\"absolute path (under curent dir, PATH dirs or really absolute)\", hack.filesystem, fonc);\n var flagFind = false;\n \n // Search under currentDir\n tiddlerTitle = currentDir + \"/\" + file;\n var tiddler1 = $tw.wiki.getTiddler(tiddlerTitle);\n if ((typeof(tiddler1) != \"undefined\") && tiddler1)\n flagFind = true;\n \n if (!flagFind && tabPath) {\n // Search under PATH directories\n for (var i = 0; i < tabPath.length; i++) {\n tiddlerTitle = tabPath[i] + \"/\" + file;\n var tiddler2 = $tw.wiki.getTiddler(tiddlerTitle);\n if ((typeof(tiddler2) != \"undefined\") && tiddler2) {\n flagFind = true;\n break;\n }\n }\n }\n \n // Maybe a tiddler already\n if (!flagFind)\n tiddlerTitle = file;\n }\n\n hack.log(\"============= tiddler = \"+tiddlerTitle, hack.filesystem, fonc);\n return tiddlerTitle;\n }\n };\n\n exports.TiddlyWiki = TiddlyWiki;\n\n})();",
"title": "$:/plugins/rboue/Three.js/tiddlywiki.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/rboue/Three.js/view3js.js": {
"text": "/*\\\ntitle: $:/plugins/rboue/Three.js/view3js.js\ntype: application/javascript\nmodule-type: widget\n\nThe view3js widget displays a 3D view defined in a local tiddler.\n\n```\n<$view3js tiddler=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\"/>\n```\n\nThe widget generates an HTML5 WebGL node with a 3D view produced by main javascript code tiddler.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\nThe path attribute contains a collection of pseudo-path directory to search files to be loaded.\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CONST_NODE_ID_PREFIX = \"ThreejsWidget\"; // prefix of root node's id attribute\nvar CONST_MIN_HEIGHT = 300; // root node minimal height\nvar CONST_PLUGIN_PATH = \"$:/plugins/rboue/Three.js\";\nvar CONST_CONFIG_TIDDLER = \"$:/config/rboue/Three.js\";\nvar CONST_CONFIG_DEFAULT_TIDDLER = CONST_PLUGIN_PATH+\"/config.json\";\n\n// Get session configuration.\nvar sessionConfig = null;\nvar configTiddler = $tw.wiki.getTiddler(CONST_CONFIG_TIDDLER);\nif ((typeof(configTiddler) != \"undefined\") && configTiddler) {\n sessionConfig = $tw.wiki.getTiddlerData(configTiddler, null)\n}\nif (!sessionConfig) {\n var configTiddlerDefault = $tw.wiki.getTiddler(CONST_CONFIG_DEFAULT_TIDDLER);\n if ((typeof(configTiddlerDefault) != \"undefined\") && configTiddlerDefault) {\n sessionConfig = $tw.wiki.getTiddlerData(configTiddlerDefault, null)\n }\n}\n\n// Create objects\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar StringView = require(\"./Lib/stringview.js\").StringView;\nvar TiddlyWiki = require(\"./tiddlywiki.js\").TiddlyWiki;\nTiddlyWiki.init(sessionConfig);\n\nvar View3jsWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n};\nView3jsWidget.instanceNb = 0; // count class instances\n\n// Inherit from the base widget class\nView3jsWidget.prototype = new Widget();\n\n//=======================================================================================\n\n// Render this widget into the DOM\nView3jsWidget.prototype.render = function(parent,nextSibling) {\n var fonc = \"View3jsWidget.render\";\n var self = this;\n\n // Debug tools\n var hack = {\n flagActiv: true, // Activate the logs\n log: function(mess, flagNoLog, fonc) {\n if (!hack.flagActiv || flagNoLog) return;\n var id = \"[]\";\n if (tiddlyWiki) id = \"[\"+tiddlyWiki.widget.nodeRootId+\"]\";\n console.log(id+(fonc ? fonc+\": \" : \"\")+mess);\n },\n logPoint: function(x,y) {return \"(\"+x+\",\"+y+\")\";},\n // Following are flags activating logs for specific fonctionnalities.\n // Value : false to activate, true to desactivate (no log).\n bug: false, // current bug investigation\n filesystem: true, // filesystem\n loader: true, // loader\n sceneLoader: true, // Scene loader\n render: true // rendering\n };\n window.hack = hack;\n\n // Create objects (continued)\n // Unfortunately, we can't create THREE object at TiddlyWiki start time (i.e. before\n // any widget instance) :\n // There is a complaint \"ReferenceError: Float32Array is not defined\" because a lot\n // of code is running at load time (many functions auto-defines themselves, allocating\n // Float32Array and returning a sub-function.\n // Float32Array is an object specific to WebGL. It seems that TiddlyWiki denies the use\n // of WebGL in sandbox environment !\n // The THREE module is loaded only once, thanks to the TiddlyWiki's load mechanism.\n window.StringView = StringView;\n window.TiddlyWiki = TiddlyWiki;\n window.THREE = require(\"./Lib/three-min.js\").THREE;\n\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n\n // Create element and assign attributes\n this.nodeRoot = this.document.createElement(\"div\");\n this.nodeRootId = CONST_NODE_ID_PREFIX + \"-\" + ++View3jsWidget.instanceNb;\n this.nodeRoot.setAttribute(\"id\", this.nodeRootId);\n if (this[\"class\"])\n this.nodeRoot.setAttribute(\"class\", this[\"class\"]);\t\t\n if (this.width) {\n var widthStyle = parseInt(this.width,10) + \"px\";\n this.nodeRoot.setAttribute(\"width\", widthStyle);\n this.nodeRoot.style.width = widthStyle;\n }\n if (this.height) {\n var heightStyle = parseInt(this.height,10) + \"px\";\n this.nodeRoot.setAttribute(\"height\", heightStyle);\n this.nodeRoot.style.height = heightStyle;\n } else {\n this.nodeRoot.setAttribute(\"height\", \"\" + CONST_MIN_HEIGHT + \"px\");\n this.nodeRoot.style.height = \"\" + CONST_MIN_HEIGHT + \"px\";\n }\n\n // Insert element\n parent.insertBefore(this.nodeRoot,nextSibling);\n this.domNodes.push(this.nodeRoot);\n\n // UI template\n var uiNodeCreate = function(id, that) {\n // Create a node : <div id=\"<id>\"></div>\n var node = that.document.createElement(\"div\");\n node.setAttribute(\"id\", id);\n parent.insertBefore(node, nextSibling);\n that.domNodes.push(node);\n return node;\n };\n this.nodeError = uiNodeCreate(this.nodeRootId + \"-error\", this);\n\n // Test browser compatibility with WebGL\n var webgl = (function () {\n try {\n var canvas = document.createElement(\"canvas\");\n return !! window.WebGLRenderingContext && (canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\"));\n } catch(e) {\n return false;\n }\n })();\n if (!webgl) {\n this.nodeError.innerHTML = window.WebGLRenderingContext ?\n 'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\" target=\"_blank\">WebGL</a>.<br/>' +\n 'Find out how to get it <a href=\"http://get.webgl.org/\" target=\"_blank\">here</a>.'\n :\n 'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\" target=\"_blank\">WebGL</a>.<br/>' +\n 'Find out how to get it <a href=\"http://get.webgl.org/\" target=\"_blank\">here</a>.';\n return;\n }\n\n // Get code tiddler\n if (!this.tiddler) {\n this.nodeError.innerHTML = \"Error: you must specify a code tiddler\";\n return;\n }\n var tiddler = this.wiki.getTiddler(this.tiddler);\n if ((typeof(tiddler) == \"undefined\") || !tiddler) {\n this.nodeError.innerHTML = \"Error: unknown tiddler: \"+this.tiddler;\n return;\n }\n\n // Get widget configuration\n var widgetConfig = {};\n if (this.path) {\n widgetConfig.filesystem = {PATH: this.path};\n } else {\n if (sessionConfig && sessionConfig.filesystem) {\n widgetConfig.filesystem = {};\n if (sessionConfig.filesystem.PATH)\n widgetConfig.filesystem.PATH = sessionConfig.filesystem.PATH;\n }\n }\n\n window.tiddlyWiki = new TiddlyWiki(this, this.tiddler, widgetConfig);\n\n // Create viewer\n\n // Execute user code\n // Prototype :\n // function main(input)\n // Returns : {onTiddlerRefresh: <refresh function>}\n //\n this.input = {node: this.nodeRoot};\n try {\n this.output = eval(tiddler.fields.text+\";main(this.input);\");\n } catch(e) {\n this.nodeError.innerHTML = \"Error when executing javascript code in <b>\"+this.tiddler+\"</b> tiddler :<br><b>\"+e+\"</b>\";\n alert(\"Stop on error\"); // stop debug and log in case of deaf mad program\n }\n};\n \n// Compute the internal state of the widget\nView3jsWidget.prototype.execute = function() {\n // Get our parameters\n this.tiddler = this.getAttribute(\"tiddler\");\n this.width = this.getAttribute(\"width\");\n this.height = this.getAttribute(\"height\");\n this.path = this.getAttribute(\"path\");\n this[\"class\"] = this.getAttribute(\"class\");\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget or any\n// of its children needed re-rendering\nView3jsWidget.prototype.refresh = function(changedTiddlers) {\n var fonc = \"View3jsWidget.refresh\";\n\n var changedAttributes = this.computeAttributes();\n if (changedAttributes.tiddler ||\n changedAttributes.width ||\n changedAttributes.height ||\n changedAttributes.path ||\n changedAttributes[\"class\"] ||\n changedTiddlers[this.tiddler]) {\n this.refreshSelf();\n //hack.log(\"after this.refreshSelf()\", false, fonc);\n return true;\n } else {\n //hack.log(\"other case\", false, fonc);\n if (this.output && this.output.onTiddlerRefresh) this.output.onTiddlerRefresh();\n return false;\t\t\n }\n};\n\nexports.view3js = View3jsWidget;\n\n})();\n",
"title": "$:/plugins/rboue/Three.js/view3js.js",
"type": "application/javascript",
"module-type": "widget"
}
}
}
{
"tiddlers": {
"$:/plugins/rboue/Three.js/Lib/SimplexNoise.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/SimplexNoise.js",
"module-type": "library",
"text": "// Ported from Stefan Gustavson's java implementation\n// http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n// Read Stefan's excellent paper for details on how this code works.\n//\n// Sean McCullough banksean@gmail.com\n//\n// Added 4D noise\n// Joshua Koo zz85nus@gmail.com \n\n/**\n * You can pass in a random number generator object if you like.\n * It is assumed to have a random() method.\n */\nvar SimplexNoise = function(r) {\n\tif (r == undefined) r = Math;\n this.grad3 = [[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0], \n [1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1], \n [0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]]; \n\n this.grad4 = [[0,1,1,1], [0,1,1,-1], [0,1,-1,1], [0,1,-1,-1],\n\t [0,-1,1,1], [0,-1,1,-1], [0,-1,-1,1], [0,-1,-1,-1],\n\t [1,0,1,1], [1,0,1,-1], [1,0,-1,1], [1,0,-1,-1],\n\t [-1,0,1,1], [-1,0,1,-1], [-1,0,-1,1], [-1,0,-1,-1],\n\t [1,1,0,1], [1,1,0,-1], [1,-1,0,1], [1,-1,0,-1],\n\t [-1,1,0,1], [-1,1,0,-1], [-1,-1,0,1], [-1,-1,0,-1],\n\t [1,1,1,0], [1,1,-1,0], [1,-1,1,0], [1,-1,-1,0],\n\t [-1,1,1,0], [-1,1,-1,0], [-1,-1,1,0], [-1,-1,-1,0]];\n\n this.p = [];\n for (var i=0; i<256; i++) {\n\t this.p[i] = Math.floor(r.random()*256);\n }\n // To remove the need for index wrapping, double the permutation table length \n this.perm = []; \n for(var i=0; i<512; i++) {\n\t\tthis.perm[i]=this.p[i & 255];\n\t} \n\n // A lookup table to traverse the simplex around a given point in 4D. \n // Details can be found where this table is used, in the 4D noise method. \n this.simplex = [ \n [0,1,2,3],[0,1,3,2],[0,0,0,0],[0,2,3,1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,2,3,0], \n [0,2,1,3],[0,0,0,0],[0,3,1,2],[0,3,2,1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,3,2,0], \n [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0], \n [1,2,0,3],[0,0,0,0],[1,3,0,2],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,3,0,1],[2,3,1,0], \n [1,0,2,3],[1,0,3,2],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,0,3,1],[0,0,0,0],[2,1,3,0], \n [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0], \n [2,0,1,3],[0,0,0,0],[0,0,0,0],[0,0,0,0],[3,0,1,2],[3,0,2,1],[0,0,0,0],[3,1,2,0], \n [2,1,0,3],[0,0,0,0],[0,0,0,0],[0,0,0,0],[3,1,0,2],[0,0,0,0],[3,2,0,1],[3,2,1,0]]; \n};\n\nSimplexNoise.prototype.dot = function(g, x, y) { \n\treturn g[0]*x + g[1]*y;\n};\n\nSimplexNoise.prototype.dot3 = function(g, x, y, z) {\n return g[0]*x + g[1]*y + g[2]*z; \n}\n\nSimplexNoise.prototype.dot4 = function(g, x, y, z, w) {\n return g[0]*x + g[1]*y + g[2]*z + g[3]*w;\n};\n\nSimplexNoise.prototype.noise = function(xin, yin) { \n var n0, n1, n2; // Noise contributions from the three corners \n // Skew the input space to determine which simplex cell we're in \n var F2 = 0.5*(Math.sqrt(3.0)-1.0); \n var s = (xin+yin)*F2; // Hairy factor for 2D \n var i = Math.floor(xin+s); \n var j = Math.floor(yin+s); \n var G2 = (3.0-Math.sqrt(3.0))/6.0; \n var t = (i+j)*G2; \n var X0 = i-t; // Unskew the cell origin back to (x,y) space \n var Y0 = j-t; \n var x0 = xin-X0; // The x,y distances from the cell origin \n var y0 = yin-Y0; \n // For the 2D case, the simplex shape is an equilateral triangle. \n // Determine which simplex we are in. \n var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords \n if(x0>y0) {i1=1; j1=0;} // lower triangle, XY order: (0,0)->(1,0)->(1,1) \n else {i1=0; j1=1;} // upper triangle, YX order: (0,0)->(0,1)->(1,1) \n // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and \n // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where \n // c = (3-sqrt(3))/6 \n var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords \n var y1 = y0 - j1 + G2; \n var x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords \n var y2 = y0 - 1.0 + 2.0 * G2; \n // Work out the hashed gradient indices of the three simplex corners \n var ii = i & 255; \n var jj = j & 255; \n var gi0 = this.perm[ii+this.perm[jj]] % 12; \n var gi1 = this.perm[ii+i1+this.perm[jj+j1]] % 12; \n var gi2 = this.perm[ii+1+this.perm[jj+1]] % 12; \n // Calculate the contribution from the three corners \n var t0 = 0.5 - x0*x0-y0*y0; \n if(t0<0) n0 = 0.0; \n else { \n t0 *= t0; \n n0 = t0 * t0 * this.dot(this.grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient \n } \n var t1 = 0.5 - x1*x1-y1*y1; \n if(t1<0) n1 = 0.0; \n else { \n t1 *= t1; \n n1 = t1 * t1 * this.dot(this.grad3[gi1], x1, y1); \n }\n var t2 = 0.5 - x2*x2-y2*y2; \n if(t2<0) n2 = 0.0; \n else { \n t2 *= t2; \n n2 = t2 * t2 * this.dot(this.grad3[gi2], x2, y2); \n } \n // Add contributions from each corner to get the final noise value. \n // The result is scaled to return values in the interval [-1,1]. \n return 70.0 * (n0 + n1 + n2); \n};\n\n// 3D simplex noise \nSimplexNoise.prototype.noise3d = function(xin, yin, zin) { \n var n0, n1, n2, n3; // Noise contributions from the four corners \n // Skew the input space to determine which simplex cell we're in \n var F3 = 1.0/3.0; \n var s = (xin+yin+zin)*F3; // Very nice and simple skew factor for 3D \n var i = Math.floor(xin+s); \n var j = Math.floor(yin+s); \n var k = Math.floor(zin+s); \n var G3 = 1.0/6.0; // Very nice and simple unskew factor, too \n var t = (i+j+k)*G3; \n var X0 = i-t; // Unskew the cell origin back to (x,y,z) space \n var Y0 = j-t; \n var Z0 = k-t; \n var x0 = xin-X0; // The x,y,z distances from the cell origin \n var y0 = yin-Y0; \n var z0 = zin-Z0; \n // For the 3D case, the simplex shape is a slightly irregular tetrahedron. \n // Determine which simplex we are in. \n var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords \n var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords \n if(x0>=y0) { \n if(y0>=z0) \n { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order \n else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order \n else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Y order \n } \n else { // x0<y0 \n if(y0<z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } // Z Y X order \n else if(x0<z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } // Y Z X order \n else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } // Y X Z order \n } \n // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z), \n // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and \n // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where \n // c = 1/6.\n var x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords \n var y1 = y0 - j1 + G3; \n var z1 = z0 - k1 + G3; \n var x2 = x0 - i2 + 2.0*G3; // Offsets for third corner in (x,y,z) coords \n var y2 = y0 - j2 + 2.0*G3; \n var z2 = z0 - k2 + 2.0*G3; \n var x3 = x0 - 1.0 + 3.0*G3; // Offsets for last corner in (x,y,z) coords \n var y3 = y0 - 1.0 + 3.0*G3; \n var z3 = z0 - 1.0 + 3.0*G3; \n // Work out the hashed gradient indices of the four simplex corners \n var ii = i & 255; \n var jj = j & 255; \n var kk = k & 255; \n var gi0 = this.perm[ii+this.perm[jj+this.perm[kk]]] % 12; \n var gi1 = this.perm[ii+i1+this.perm[jj+j1+this.perm[kk+k1]]] % 12; \n var gi2 = this.perm[ii+i2+this.perm[jj+j2+this.perm[kk+k2]]] % 12; \n var gi3 = this.perm[ii+1+this.perm[jj+1+this.perm[kk+1]]] % 12; \n // Calculate the contribution from the four corners \n var t0 = 0.6 - x0*x0 - y0*y0 - z0*z0; \n if(t0<0) n0 = 0.0; \n else { \n t0 *= t0; \n n0 = t0 * t0 * this.dot3(this.grad3[gi0], x0, y0, z0); \n }\n var t1 = 0.6 - x1*x1 - y1*y1 - z1*z1; \n if(t1<0) n1 = 0.0; \n else { \n t1 *= t1; \n n1 = t1 * t1 * this.dot3(this.grad3[gi1], x1, y1, z1); \n } \n var t2 = 0.6 - x2*x2 - y2*y2 - z2*z2; \n if(t2<0) n2 = 0.0; \n else { \n t2 *= t2; \n n2 = t2 * t2 * this.dot3(this.grad3[gi2], x2, y2, z2); \n } \n var t3 = 0.6 - x3*x3 - y3*y3 - z3*z3; \n if(t3<0) n3 = 0.0; \n else { \n t3 *= t3; \n n3 = t3 * t3 * this.dot3(this.grad3[gi3], x3, y3, z3); \n } \n // Add contributions from each corner to get the final noise value. \n // The result is scaled to stay just inside [-1,1] \n return 32.0*(n0 + n1 + n2 + n3); \n};\n\n// 4D simplex noise\nSimplexNoise.prototype.noise4d = function( x, y, z, w ) {\n\t// For faster and easier lookups\n\tvar grad4 = this.grad4;\n\tvar simplex = this.simplex;\n\tvar perm = this.perm;\n\t\n // The skewing and unskewing factors are hairy again for the 4D case\n var F4 = (Math.sqrt(5.0)-1.0)/4.0;\n var G4 = (5.0-Math.sqrt(5.0))/20.0;\n var n0, n1, n2, n3, n4; // Noise contributions from the five corners\n // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n var s = (x + y + z + w) * F4; // Factor for 4D skewing\n var i = Math.floor(x + s);\n var j = Math.floor(y + s);\n var k = Math.floor(z + s);\n var l = Math.floor(w + s);\n var t = (i + j + k + l) * G4; // Factor for 4D unskewing\n var X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n var Y0 = j - t;\n var Z0 = k - t;\n var W0 = l - t;\n var x0 = x - X0; // The x,y,z,w distances from the cell origin\n var y0 = y - Y0;\n var z0 = z - Z0;\n var w0 = w - W0;\n\n // For the 4D case, the simplex is a 4D shape I won't even try to describe.\n // To find out which of the 24 possible simplices we're in, we need to\n // determine the magnitude ordering of x0, y0, z0 and w0.\n // The method below is a good way of finding the ordering of x,y,z,w and\n // then find the correct traversal order for the simplex we’re in.\n // First, six pair-wise comparisons are performed between each possible pair\n // of the four coordinates, and the results are used to add up binary bits\n // for an integer index.\n var c1 = (x0 > y0) ? 32 : 0;\n var c2 = (x0 > z0) ? 16 : 0;\n var c3 = (y0 > z0) ? 8 : 0;\n var c4 = (x0 > w0) ? 4 : 0;\n var c5 = (y0 > w0) ? 2 : 0;\n var c6 = (z0 > w0) ? 1 : 0;\n var c = c1 + c2 + c3 + c4 + c5 + c6;\n var i1, j1, k1, l1; // The integer offsets for the second simplex corner\n var i2, j2, k2, l2; // The integer offsets for the third simplex corner\n var i3, j3, k3, l3; // The integer offsets for the fourth simplex corner\n // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n // Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n // impossible. Only the 24 indices which have non-zero entries make any sense.\n // We use a thresholding to set the coordinates in turn from the largest magnitude.\n // The number 3 in the \"simplex\" array is at the position of the largest coordinate.\n i1 = simplex[c][0]>=3 ? 1 : 0;\n j1 = simplex[c][1]>=3 ? 1 : 0;\n k1 = simplex[c][2]>=3 ? 1 : 0;\n l1 = simplex[c][3]>=3 ? 1 : 0;\n // The number 2 in the \"simplex\" array is at the second largest coordinate.\n i2 = simplex[c][0]>=2 ? 1 : 0;\n j2 = simplex[c][1]>=2 ? 1 : 0; k2 = simplex[c][2]>=2 ? 1 : 0;\n l2 = simplex[c][3]>=2 ? 1 : 0;\n // The number 1 in the \"simplex\" array is at the second smallest coordinate.\n i3 = simplex[c][0]>=1 ? 1 : 0;\n j3 = simplex[c][1]>=1 ? 1 : 0;\n k3 = simplex[c][2]>=1 ? 1 : 0;\n l3 = simplex[c][3]>=1 ? 1 : 0;\n // The fifth corner has all coordinate offsets = 1, so no need to look that up.\n var x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n var y1 = y0 - j1 + G4;\n var z1 = z0 - k1 + G4;\n var w1 = w0 - l1 + G4;\n var x2 = x0 - i2 + 2.0*G4; // Offsets for third corner in (x,y,z,w) coords\n var y2 = y0 - j2 + 2.0*G4;\n var z2 = z0 - k2 + 2.0*G4;\n var w2 = w0 - l2 + 2.0*G4;\n var x3 = x0 - i3 + 3.0*G4; // Offsets for fourth corner in (x,y,z,w) coords\n var y3 = y0 - j3 + 3.0*G4;\n var z3 = z0 - k3 + 3.0*G4;\n var w3 = w0 - l3 + 3.0*G4;\n var x4 = x0 - 1.0 + 4.0*G4; // Offsets for last corner in (x,y,z,w) coords\n var y4 = y0 - 1.0 + 4.0*G4;\n var z4 = z0 - 1.0 + 4.0*G4;\n var w4 = w0 - 1.0 + 4.0*G4;\n // Work out the hashed gradient indices of the five simplex corners\n var ii = i & 255;\n var jj = j & 255;\n var kk = k & 255;\n var ll = l & 255;\n var gi0 = perm[ii+perm[jj+perm[kk+perm[ll]]]] % 32;\n var gi1 = perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]] % 32;\n var gi2 = perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]] % 32;\n var gi3 = perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]] % 32;\n var gi4 = perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]] % 32;\n // Calculate the contribution from the five corners\n var t0 = 0.6 - x0*x0 - y0*y0 - z0*z0 - w0*w0;\n if(t0<0) n0 = 0.0;\n else {\n t0 *= t0;\n n0 = t0 * t0 * this.dot4(grad4[gi0], x0, y0, z0, w0);\n }\n var t1 = 0.6 - x1*x1 - y1*y1 - z1*z1 - w1*w1;\n if(t1<0) n1 = 0.0;\n else {\n t1 *= t1;\n n1 = t1 * t1 * this.dot4(grad4[gi1], x1, y1, z1, w1);\n }\n var t2 = 0.6 - x2*x2 - y2*y2 - z2*z2 - w2*w2;\n if(t2<0) n2 = 0.0;\n else {\n t2 *= t2;\n n2 = t2 * t2 * this.dot4(grad4[gi2], x2, y2, z2, w2);\n } var t3 = 0.6 - x3*x3 - y3*y3 - z3*z3 - w3*w3;\n if(t3<0) n3 = 0.0;\n else {\n t3 *= t3;\n n3 = t3 * t3 * this.dot4(grad4[gi3], x3, y3, z3, w3);\n }\n var t4 = 0.6 - x4*x4 - y4*y4 - z4*z4 - w4*w4;\n if(t4<0) n4 = 0.0;\n else {\n t4 *= t4;\n n4 = t4 * t4 * this.dot4(grad4[gi4], x4, y4, z4, w4);\n }\n // Sum up and scale the result to cover the range [-1,1]\n return 27.0 * (n0 + n1 + n2 + n3 + n4);\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Utils/UVsUtils.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Utils/UVsUtils.js",
"module-type": "library",
"text": "/*\n * @author gyuque / http://github.com/gyuque\n * Cylinder Mapping for ExtrudeGeometry\n */\n\nTHREE.UVsUtils = {\n\n};\n\nTHREE.UVsUtils.CylinderUVGenerator = function() {\n this.uRepeat = 1;\n this.targetGeometry = null;\n this.lengthCache = null;\n};\n\nTHREE.UVsUtils.CylinderUVGenerator.prototype = {\n generateTopUV: THREE.ExtrudeGeometry.WorldUVGenerator.generateTopUV,\n generateBottomUV: THREE.ExtrudeGeometry.WorldUVGenerator.generateBottomUV,\n \n generateSideWallUV: function( geometry, extrudedShape, wallContour, extrudeOptions,\n indexA, indexB, indexC, indexD, stepIndex, stepsLength,\n contourIndex1, contourIndex2 ) {\n // first call\n if (this.targetGeometry !== geometry) {\n this.prepare(geometry, wallContour);\n }\n\n // generate uv\n var u_list = this.lengthCache;\n var v1 = stepIndex / stepsLength;\n var v2 = ( stepIndex + 1 ) / stepsLength;\n \n var u1 = u_list[contourIndex1];\n var u2 = u_list[contourIndex2];\n if (u1 < u2) {u1 += 1.0;}\n \n u1 *= this.uRepeat;\n u2 *= this.uRepeat;\n return [\n new THREE.Vector2( u1, v1 ),\n new THREE.Vector2( u2, v1 ),\n new THREE.Vector2( u2, v2 ),\n new THREE.Vector2( u1, v2 )\n ];\n },\n \n prepare: function(geometry, wallContour) {\n var p1, p2;\n var u_list = [];\n var lengthSum = 0;\n var len = wallContour.length;\n for (var i = 0;i < len;i++) {\n p1 = wallContour[ i ];\n p2 = wallContour[ (i+1) % len ];\n\n var dx = p1.x - p2.x;\n var dy = p1.y - p2.y;\n var segmentLength = Math.sqrt(dx*dx + dy*dy);\n \n u_list.push(lengthSum);\n lengthSum += segmentLength;\n }\n \n this.normalizeArray(u_list, lengthSum);\n this.targetGeometry = geometry;\n this.lengthCache = u_list;\n },\n \n normalizeArray: function(ls, v) {\n var len = ls.length;\n for (var i = 0;i < len;i++) {\n ls[i] /= v;\n }\n \n return ls;\n }\n};\n\n\n\n/* \n * @author zz85 / http://github.com/zz85\n * @author WestLangley / http://github.com/WestLangley\n *\n * tool for \"unwrapping\" and debugging three.js \n * geometries UV mapping\n *\n * Sample usage:\n *\tdocument.body.appendChild(\n *\t\tTHREE.UVsDebug(\n *\t\t\tnew THREE.SphereGeometry(10,10,10,10));\n *\n */\n \nTHREE.UVsDebug = function( geometry, size ) {\n\n // handles wrapping of uv.x > 1 only\n \n var abc = 'abcd';\n\n var uv, u, ax, ay;\n var i, il, j, jl;\n var vnum;\n\n var a = new THREE.Vector2();\n var b = new THREE.Vector2();\n\n var faces = geometry.faces;\n var uvs = geometry.faceVertexUvs[ 0 ];\n\n var canvas = document.createElement( 'canvas' );\n var width = size || 1024; // power of 2 required for wrapping\n var height = size || 1024;\n canvas.width = width;\n canvas.height = height;\n\n var ctx = canvas.getContext( '2d' );\n ctx.lineWidth = 2;\n ctx.strokeStyle = 'rgba( 0, 0, 0, 1.0 )';\n ctx.textAlign = 'center';\n\n // paint background white\n\n ctx.fillStyle = 'rgba( 255, 255, 255, 1.0 )';\n ctx.fillRect( 0, 0, width, height );\n\n for ( i = 0, il = uvs.length; i < il; i++ ) {\n\n uv = uvs[ i ];\n\n // draw lines\n\n ctx.beginPath();\n\n a.set( 0, 0 );\n\n for ( j = 0, jl = uv.length; j < jl; j++ ) {\n\n u = uv[ j ];\n\n a.x += u.x;\n a.y += u.y;\n\n if ( j == 0 ) {\n\n ctx.moveTo( u.x * width, ( 1 - u.y ) * height );\n\n } else {\n\n ctx.lineTo( u.x * width, ( 1 - u.y ) * height );\n\n }\n\n }\n\n ctx.closePath();\n ctx.stroke();\n\n a.divideScalar( jl );\n\n // label the face number\n\n ctx.font = \"12pt Arial bold\";\n ctx.fillStyle = 'rgba( 0, 0, 0, 1.0 )';\n ctx.fillText( i, a.x * width, ( 1 - a.y ) * height );\n\n if ( a.x > 0.95 ) { // wrap x // 0.95 is arbitrary\n\n ctx.fillText( i, ( a.x % 1 ) * width, ( 1 - a.y ) * height );\n\n }\n\n ctx.font = \"8pt Arial bold\";\n ctx.fillStyle = 'rgba( 0, 0, 0, 1.0 )';\n\n // label uv edge orders\n\n for ( j = 0, jl = uv.length; j < jl; j++ ) {\n\n u = uv[ j ];\n b.addVectors( a, u ).divideScalar( 2 );\n\n vnum = faces[ i ][ abc[ j ] ];\n ctx.fillText( abc[ j ] + vnum, b.x * width, ( 1 - b.y ) * height );\n\n if ( b.x > 0.95 ) { // wrap x\n\n ctx.fillText( abc[ j ] + vnum, ( b.x % 1 ) * width, ( 1 - b.y ) * height );\n\n }\n\n }\n\n }\n\n return canvas;\n\n}\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Utils/GeometryUtils.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Utils/GeometryUtils.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.GeometryUtils = {\n\n\t// Merge two geometries or geometry and geometry from object (using object's transform)\n\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\tvar matrix;\n\n\t\tif ( geometry2 instanceof THREE.Mesh ) {\n\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\tmatrix = geometry2.matrix;\n\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t}\n\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t},\n\n\t// Get random point in triangle (via barycentric coordinates)\n\t// \t(uniform distribution)\n\t// \thttp://www.cgafaq.info/wiki/Random_Point_In_Triangle\n\n\trandomPointInTriangle: function () {\n\n\t\tvar vector = new THREE.Vector3();\n\n\t\treturn function ( vectorA, vectorB, vectorC ) {\n\n\t\t\tvar point = new THREE.Vector3();\n\n\t\t\tvar a = THREE.Math.random16();\n\t\t\tvar b = THREE.Math.random16();\n\n\t\t\tif ( ( a + b ) > 1 ) {\n\n\t\t\t\ta = 1 - a;\n\t\t\t\tb = 1 - b;\n\n\t\t\t}\n\n\t\t\tvar c = 1 - a - b;\n\n\t\t\tpoint.copy( vectorA );\n\t\t\tpoint.multiplyScalar( a );\n\n\t\t\tvector.copy( vectorB );\n\t\t\tvector.multiplyScalar( b );\n\n\t\t\tpoint.add( vector );\n\n\t\t\tvector.copy( vectorC );\n\t\t\tvector.multiplyScalar( c );\n\n\t\t\tpoint.add( vector );\n\n\t\t\treturn point;\n\n\t\t};\n\n\t}(),\n\n\t// Get random point in face (triangle)\n\t// (uniform distribution)\n\n\trandomPointInFace: function ( face, geometry, useCachedAreas ) {\n\n\t\tvar vA, vB, vC;\n\n\t\tvA = geometry.vertices[ face.a ];\n\t\tvB = geometry.vertices[ face.b ];\n\t\tvC = geometry.vertices[ face.c ];\n\n\t\treturn THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC );\n\n\t},\n\n\t// Get uniformly distributed random points in mesh\n\t// \t- create array with cumulative sums of face areas\n\t// - pick random number from 0 to total area\n\t// - find corresponding place in area array by binary search\n\t//\t- get random point in face\n\n\trandomPointsInGeometry: function ( geometry, n ) {\n\n\t\tvar face, i,\n\t\t\tfaces = geometry.faces,\n\t\t\tvertices = geometry.vertices,\n\t\t\til = faces.length,\n\t\t\ttotalArea = 0,\n\t\t\tcumulativeAreas = [],\n\t\t\tvA, vB, vC, vD;\n\n\t\t// precompute face areas\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvA = vertices[ face.a ];\n\t\t\tvB = vertices[ face.b ];\n\t\t\tvC = vertices[ face.c ];\n\n\t\t\tface._area = THREE.GeometryUtils.triangleArea( vA, vB, vC );\n\n\t\t\ttotalArea += face._area;\n\n\t\t\tcumulativeAreas[ i ] = totalArea;\n\n\t\t}\n\n\t\t// binary search cumulative areas array\n\n\t\tfunction binarySearchIndices( value ) {\n\n\t\t\tfunction binarySearch( start, end ) {\n\n\t\t\t\t// return closest larger index\n\t\t\t\t// if exact number is not found\n\n\t\t\t\tif ( end < start )\n\t\t\t\t\treturn start;\n\n\t\t\t\tvar mid = start + Math.floor( ( end - start ) / 2 );\n\n\t\t\t\tif ( cumulativeAreas[ mid ] > value ) {\n\n\t\t\t\t\treturn binarySearch( start, mid - 1 );\n\n\t\t\t\t} else if ( cumulativeAreas[ mid ] < value ) {\n\n\t\t\t\t\treturn binarySearch( mid + 1, end );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn mid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar result = binarySearch( 0, cumulativeAreas.length - 1 )\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// pick random face weighted by face area\n\n\t\tvar r, index,\n\t\t\tresult = [];\n\n\t\tvar stats = {};\n\n\t\tfor ( i = 0; i < n; i ++ ) {\n\n\t\t\tr = THREE.Math.random16() * totalArea;\n\n\t\t\tindex = binarySearchIndices( r );\n\n\t\t\tresult[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true );\n\n\t\t\tif ( ! stats[ index ] ) {\n\n\t\t\t\tstats[ index ] = 1;\n\n\t\t\t} else {\n\n\t\t\t\tstats[ index ] += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\trandomPointsInBufferGeometry: function ( geometry, n ) {\n\n\t\tvar i,\n\t\t\tvertices = geometry.attributes.position.array,\n\t\t\ttotalArea = 0,\n\t\t\tcumulativeAreas = [],\n\t\t\tvA, vB, vC;\n\n\t\t// precompute face areas\n\t\tvA = new THREE.Vector3();\n\t\tvB = new THREE.Vector3();\n\t\tvC = new THREE.Vector3();\n\n\t\t// geometry._areas = [];\n\t\tvar il = vertices.length / 9;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tvA.set( vertices[i * 9 + 0], vertices[i * 9 + 1], vertices[i * 9 + 2] );\n\t\t\tvB.set( vertices[i * 9 + 3], vertices[i * 9 + 4], vertices[i * 9 + 5] );\n\t\t\tvC.set( vertices[i * 9 + 6], vertices[i * 9 + 7], vertices[i * 9 + 8] );\n\n\t\t\tarea = THREE.GeometryUtils.triangleArea( vA, vB, vC );\n\t\t\ttotalArea += area;\n\n\t\t\tcumulativeAreas.push(totalArea);\n\t\t}\n\n\t\t// binary search cumulative areas array\n\n\t\tfunction binarySearchIndices( value ) {\n\n\t\t\tfunction binarySearch( start, end ) {\n\n\t\t\t\t// return closest larger index\n\t\t\t\t// if exact number is not found\n\n\t\t\t\tif ( end < start )\n\t\t\t\t\treturn start;\n\n\t\t\t\tvar mid = start + Math.floor( ( end - start ) / 2 );\n\n\t\t\t\tif ( cumulativeAreas[ mid ] > value ) {\n\n\t\t\t\t\treturn binarySearch( start, mid - 1 );\n\n\t\t\t\t} else if ( cumulativeAreas[ mid ] < value ) {\n\n\t\t\t\t\treturn binarySearch( mid + 1, end );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn mid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar result = binarySearch( 0, cumulativeAreas.length - 1 )\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// pick random face weighted by face area\n\n\t\tvar r, index,\n\t\t\tresult = [];\n\n\t\tfor ( i = 0; i < n; i ++ ) {\n\n\t\t\tr = THREE.Math.random16() * totalArea;\n\n\t\t\tindex = binarySearchIndices( r );\n\n\t\t\t// result[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true );\n\t\t\tvA.set( vertices[index * 9 + 0], vertices[index * 9 + 1], vertices[index * 9 + 2] );\n\t\t\tvB.set( vertices[index * 9 + 3], vertices[index * 9 + 4], vertices[index * 9 + 5] );\n\t\t\tvC.set( vertices[index * 9 + 6], vertices[index * 9 + 7], vertices[index * 9 + 8] );\n\t\t\tresult[ i ] = THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC );\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// Get triangle area (half of parallelogram)\n\t// http://mathworld.wolfram.com/TriangleArea.html\n\n\ttriangleArea: function () {\n\n\t\tvar vector1 = new THREE.Vector3();\n\t\tvar vector2 = new THREE.Vector3();\n\n\t\treturn function ( vectorA, vectorB, vectorC ) {\n\n\t\t\tvector1.subVectors( vectorB, vectorA );\n\t\t\tvector2.subVectors( vectorC, vectorA );\n\t\t\tvector1.cross( vector2 );\n\n\t\t\treturn 0.5 * vector1.length();\n\n\t\t};\n\n\t}(),\n\n\tcenter: function ( geometry ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\treturn geometry.center();\n\n\t}\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Effects/VREffect.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Effects/VREffect.js",
"module-type": "library",
"text": "/**\n * @author dmarcos / https://github.com/dmarcos\n *\n * It handles stereo rendering\n * If mozGetVRDevices and getVRDevices APIs are not available it gracefuly falls back to a\n * regular renderer\n *\n * The HMD supported is the Oculus DK1 and The Web API doesn't currently allow\n * to query for the display resolution (only the chrome API allows it).\n * The dimensions of the screen are temporarly hardcoded (1280 x 800).\n *\n * For VR mode to work it has to be used with the Oculus enabled builds of Firefox or Chrome:\n *\n * Firefox:\n *\n * OSX: http://people.mozilla.com/~vladimir/vr/firefox-33.0a1.en-US.mac.dmg\n * WIN: http://people.mozilla.com/~vladimir/vr/firefox-33.0a1.en-US.win64-x86_64.zip\n *\n * Chrome builds:\n *\n * https://drive.google.com/folderview?id=0BzudLt22BqGRbW9WTHMtOWMzNjQ&usp=sharing#list\n *\n */\nTHREE.VREffect = function ( renderer, done ) {\n\tthis._renderer = renderer;\n\n\tthis._init = function() {\n\t\tvar self = this;\n\t\tif ( !navigator.mozGetVRDevices && !navigator.getVRDevices ) {\n\t\t\tif ( done ) {\n\t\t\t\tdone(\"Your browser is not VR Ready\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif ( navigator.getVRDevices ) {\n\t\t\tnavigator.getVRDevices().then( gotVRDevices );\n\t\t} else {\n\t\t\tnavigator.mozGetVRDevices( gotVRDevices );\n\t\t}\n\t\tfunction gotVRDevices( devices ) {\n\t\t\tvar vrHMD;\n\t\t\tvar error;\n\t\t\tfor ( var i = 0; i < devices.length; ++i ) {\n\t\t\t\tif ( devices[i] instanceof HMDVRDevice ) {\n\t\t\t\t\tvrHMD = devices[i];\n\t\t\t\t\tself._vrHMD = vrHMD;\n\t\t\t\t\tself.leftEyeTranslation = vrHMD.getEyeTranslation( \"left\" );\n\t\t\t\t\tself.rightEyeTranslation = vrHMD.getEyeTranslation( \"right\" );\n\t\t\t\t\tself.leftEyeFOV = vrHMD.getRecommendedEyeFieldOfView( \"left\" );\n\t\t\t\t\tself.rightEyeFOV = vrHMD.getRecommendedEyeFieldOfView( \"right\" );\n\t\t\t\t\tbreak; // We keep the first we encounter\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( done ) {\n\t\t\t\tif ( !vrHMD ) {\n\t\t\t\t error = 'HMD not available';\n\t\t\t\t}\n\t\t\t\tdone( error );\n\t\t\t}\n\t\t}\n\t};\n\n\tthis._init();\n\n\tthis.render = function ( scene, camera ) {\n\t\tvar renderer = this._renderer;\n\t\tvar vrHMD = this._vrHMD;\n\t\trenderer.enableScissorTest( false );\n\t\t// VR render mode if HMD is available\n\t\tif ( vrHMD ) {\n\t\t\tthis.renderStereo.apply( this, arguments );\n\t\t\treturn;\n\t\t}\n\t\t// Regular render mode if not HMD\n\t\trenderer.render.apply( this._renderer , arguments );\n\t};\n\n\tthis.renderStereo = function( scene, camera, renderTarget, forceClear ) {\n\t\tvar cameraLeft;\n\t\tvar cameraRight;\n\t\tvar leftEyeTranslation = this.leftEyeTranslation;\n\t\tvar rightEyeTranslation = this.rightEyeTranslation;\n\t\tvar renderer = this._renderer;\n\t\tvar rendererWidth = renderer.domElement.width / renderer.devicePixelRatio;\n\t\tvar rendererHeight = renderer.domElement.height / renderer.devicePixelRatio;\n\t\tvar eyeDivisionLine = rendererWidth / 2;\n\t\trenderer.enableScissorTest( true );\n\t\trenderer.clear();\n\n\t\t// Grab camera matrix from user.\n\t\t// This is interpreted as the head base.\n\t\tif ( camera.matrixAutoUpdate ) {\n\t\t\tcamera.updateMatrix();\n\t\t}\n\t\tvar eyeWorldMatrix = camera.matrixWorld.clone();\n\n\t\tcameraLeft = camera.clone();\n\t\tcameraRight = camera.clone();\n\t\tcameraLeft.projectionMatrix = this.FovToProjection( this.leftEyeFOV );\n\t\tcameraRight.projectionMatrix = this.FovToProjection( this.rightEyeFOV );\n\t\tcameraLeft.position.add(new THREE.Vector3(\n\t\t\tleftEyeTranslation.x, leftEyeTranslation.y, leftEyeTranslation.z) );\n\t\tcameraRight.position.add(new THREE.Vector3(\n\t\t\trightEyeTranslation.x, rightEyeTranslation.y, rightEyeTranslation.z) );\n\n\t\t// render left eye\n\t\trenderer.setViewport( 0, 0, eyeDivisionLine, rendererHeight );\n\t\trenderer.setScissor( 0, 0, eyeDivisionLine, rendererHeight );\n\t\trenderer.render( scene, cameraLeft );\n\n\t\t// render right eye\n\t\trenderer.setViewport( eyeDivisionLine, 0, eyeDivisionLine, rendererHeight );\n\t\trenderer.setScissor( eyeDivisionLine, 0, eyeDivisionLine, rendererHeight );\n\t\trenderer.render( scene, cameraRight );\n\n\t};\n\n\tthis.setFullScreen = function( enable ) {\n\t\tvar renderer = this._renderer;\n\t\tvar vrHMD = this._vrHMD;\n\t\tvar canvasOriginalSize = this._canvasOriginalSize;\n\t\tif (!vrHMD) {\n\t\t\treturn;\n\t\t}\n\t\t// If state doesn't change we do nothing\n\t\tif ( enable === this._fullScreen ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._fullScreen = !!enable;\n\n\t\t// VR Mode disabled\n\t\tif ( !enable ) {\n\t\t\t// Restores canvas original size\n\t\t\trenderer.setSize( canvasOriginalSize.width, canvasOriginalSize.height );\n\t\t\treturn;\n\t\t}\n\t\t// VR Mode enabled\n\t\tthis._canvasOriginalSize = {\n\t\t\twidth: renderer.domElement.width,\n\t\t\theight: renderer.domElement.height\n\t\t};\n\t\t// Hardcoded Rift display size\n\t\trenderer.setSize( 1280, 800, false );\n\t\tthis.startFullscreen();\n\t};\n\n\tthis.startFullscreen = function() {\n\t\tvar self = this;\n\t\tvar renderer = this._renderer;\n\t\tvar vrHMD = this._vrHMD;\n\t\tvar canvas = renderer.domElement;\n\t\tvar fullScreenChange =\n\t\t\tcanvas.mozRequestFullScreen? 'mozfullscreenchange' : 'webkitfullscreenchange';\n\n\t\tdocument.addEventListener( fullScreenChange, onFullScreenChanged, false );\n\t\tfunction onFullScreenChanged() {\n\t\t\tif ( !document.mozFullScreenElement && !document.webkitFullScreenElement ) {\n\t\t\t\tself.setFullScreen( false );\n\t\t\t}\n\t\t}\n\t\tif ( canvas.mozRequestFullScreen ) {\n\t\t\tcanvas.mozRequestFullScreen( { vrDisplay: vrHMD } );\n\t\t} else {\n\t\t\tcanvas.webkitRequestFullscreen( { vrDisplay: vrHMD } );\n\t\t}\n\t};\n\n\tthis.FovToNDCScaleOffset = function( fov ) {\n\t\tvar pxscale = 2.0 / (fov.leftTan + fov.rightTan);\n\t\tvar pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5;\n\t\tvar pyscale = 2.0 / (fov.upTan + fov.downTan);\n\t\tvar pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5;\n\t\treturn { scale: [pxscale, pyscale], offset: [pxoffset, pyoffset] };\n\t};\n\n\tthis.FovPortToProjection = function( fov, rightHanded /* = true */, zNear /* = 0.01 */, zFar /* = 10000.0 */ )\n\t{\n\t\trightHanded = rightHanded === undefined ? true : rightHanded;\n\t\tzNear = zNear === undefined ? 0.01 : zNear;\n\t\tzFar = zFar === undefined ? 10000.0 : zFar;\n\n\t\tvar handednessScale = rightHanded ? -1.0 : 1.0;\n\n\t\t// start with an identity matrix\n\t\tvar mobj = new THREE.Matrix4();\n\t\tvar m = mobj.elements;\n\n\t\t// and with scale/offset info for normalized device coords\n\t\tvar scaleAndOffset = this.FovToNDCScaleOffset(fov);\n\n\t\t// X result, map clip edges to [-w,+w]\n\t\tm[0*4+0] = scaleAndOffset.scale[0];\n\t\tm[0*4+1] = 0.0;\n\t\tm[0*4+2] = scaleAndOffset.offset[0] * handednessScale;\n\t\tm[0*4+3] = 0.0;\n\n\t\t// Y result, map clip edges to [-w,+w]\n\t\t// Y offset is negated because this proj matrix transforms from world coords with Y=up,\n\t\t// but the NDC scaling has Y=down (thanks D3D?)\n\t\tm[1*4+0] = 0.0;\n\t\tm[1*4+1] = scaleAndOffset.scale[1];\n\t\tm[1*4+2] = -scaleAndOffset.offset[1] * handednessScale;\n\t\tm[1*4+3] = 0.0;\n\n\t\t// Z result (up to the app)\n\t\tm[2*4+0] = 0.0;\n\t\tm[2*4+1] = 0.0;\n\t\tm[2*4+2] = zFar / (zNear - zFar) * -handednessScale;\n\t\tm[2*4+3] = (zFar * zNear) / (zNear - zFar);\n\n\t\t// W result (= Z in)\n\t\tm[3*4+0] = 0.0;\n\t\tm[3*4+1] = 0.0;\n\t\tm[3*4+2] = handednessScale;\n\t\tm[3*4+3] = 0.0;\n\n\t\tmobj.transpose();\n\n\t\treturn mobj;\n\t};\n\n\tthis.FovToProjection = function( fov, rightHanded /* = true */, zNear /* = 0.01 */, zFar /* = 10000.0 */ )\n\t{\n\t\tvar fovPort = {\n\t\t\tupTan: Math.tan(fov.upDegrees * Math.PI / 180.0),\n\t\t\tdownTan: Math.tan(fov.downDegrees * Math.PI / 180.0),\n\t\t\tleftTan: Math.tan(fov.leftDegrees * Math.PI / 180.0),\n\t\t\trightTan: Math.tan(fov.rightDegrees * Math.PI / 180.0)\n\t\t};\n\t\treturn this.FovPortToProjection(fovPort, rightHanded, zNear, zFar);\n\t};\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Effects/OculusRiftEffect.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Effects/OculusRiftEffect.js",
"module-type": "library",
"text": "/**\n * @author troffmo5 / http://github.com/troffmo5\n *\n * Effect to render the scene in stereo 3d side by side with lens distortion.\n * It is written to be used with the Oculus Rift (http://www.oculusvr.com/) but\n * it works also with other HMD using the same technology\n */\n\nTHREE.OculusRiftEffect = function ( renderer, options ) {\n\t// worldFactor indicates how many units is 1 meter\n\tvar worldFactor = (options && options.worldFactor) ? options.worldFactor: 1.0;\n\n\t// Specific HMD parameters\n\tvar HMD = (options && options.HMD) ? options.HMD: {\n\t\t// Parameters from the Oculus Rift DK1\n\t\thResolution: 1280,\n\t\tvResolution: 800,\n\t\thScreenSize: 0.14976,\n\t\tvScreenSize: 0.0936,\n\t\tinterpupillaryDistance: 0.064,\n\t\tlensSeparationDistance: 0.064,\n\t\teyeToScreenDistance: 0.041,\n\t\tdistortionK : [1.0, 0.22, 0.24, 0.0],\n\t\tchromaAbParameter: [ 0.996, -0.004, 1.014, 0.0]\n\t};\n\n\t// Perspective camera\n\tvar pCamera = new THREE.PerspectiveCamera();\n\tpCamera.matrixAutoUpdate = false;\n\tpCamera.target = new THREE.Vector3();\n\n\t// Orthographic camera\n\tvar oCamera = new THREE.OrthographicCamera( -1, 1, 1, -1, 1, 1000 );\n\toCamera.position.z = 1;\n\n\t// pre-render hooks\n\tthis.preLeftRender = function() {};\n\tthis.preRightRender = function() {};\n\n\trenderer.autoClear = false;\n\tvar emptyColor = new THREE.Color(\"black\");\n\n\t// Render target\n\tvar RTParams = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };\n\tvar renderTarget = new THREE.WebGLRenderTarget( 640, 800, RTParams );\n\tvar RTMaterial = new THREE.ShaderMaterial( {\n\t\tuniforms: {\n\t\t\t\"texid\": { type: \"t\", value: renderTarget },\n\t\t\t\"scale\": { type: \"v2\", value: new THREE.Vector2(1.0,1.0) },\n\t\t\t\"scaleIn\": { type: \"v2\", value: new THREE.Vector2(1.0,1.0) },\n\t\t\t\"lensCenter\": { type: \"v2\", value: new THREE.Vector2(0.0,0.0) },\n\t\t\t\"hmdWarpParam\": { type: \"v4\", value: new THREE.Vector4(1.0,0.0,0.0,0.0) },\n\t\t\t\"chromAbParam\": { type: \"v4\", value: new THREE.Vector4(1.0,0.0,0.0,0.0) }\n\t\t},\n\t\tvertexShader: [\n\t\t\t\"varying vec2 vUv;\",\n\t\t\t\"void main() {\",\n\t\t\t\" vUv = uv;\",\n\t\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"}\"\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\t\t\t\"uniform vec2 scale;\",\n\t\t\t\"uniform vec2 scaleIn;\",\n\t\t\t\"uniform vec2 lensCenter;\",\n\t\t\t\"uniform vec4 hmdWarpParam;\",\n\t\t\t'uniform vec4 chromAbParam;',\n\t\t\t\"uniform sampler2D texid;\",\n\t\t\t\"varying vec2 vUv;\",\n\t\t\t\"void main()\",\n\t\t\t\"{\",\n\t\t\t\" vec2 uv = (vUv*2.0)-1.0;\", // range from [0,1] to [-1,1]\n\t\t\t\" vec2 theta = (uv-lensCenter)*scaleIn;\",\n\t\t\t\" float rSq = theta.x*theta.x + theta.y*theta.y;\",\n\t\t\t\" vec2 rvector = theta*(hmdWarpParam.x + hmdWarpParam.y*rSq + hmdWarpParam.z*rSq*rSq + hmdWarpParam.w*rSq*rSq*rSq);\",\n\t\t\t' vec2 rBlue = rvector * (chromAbParam.z + chromAbParam.w * rSq);',\n\t\t\t\" vec2 tcBlue = (lensCenter + scale * rBlue);\",\n\t\t\t\" tcBlue = (tcBlue+1.0)/2.0;\", // range from [-1,1] to [0,1]\n\t\t\t\" if (any(bvec2(clamp(tcBlue, vec2(0.0,0.0), vec2(1.0,1.0))-tcBlue))) {\",\n\t\t\t\" gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\",\n\t\t\t\" return;}\",\n\t\t\t\" vec2 tcGreen = lensCenter + scale * rvector;\",\n\t\t\t\" tcGreen = (tcGreen+1.0)/2.0;\", // range from [-1,1] to [0,1]\n\t\t\t\" vec2 rRed = rvector * (chromAbParam.x + chromAbParam.y * rSq);\",\n\t\t\t\" vec2 tcRed = lensCenter + scale * rRed;\",\n\t\t\t\" tcRed = (tcRed+1.0)/2.0;\", // range from [-1,1] to [0,1]\n\t\t\t\" gl_FragColor = vec4(texture2D(texid, tcRed).r, texture2D(texid, tcGreen).g, texture2D(texid, tcBlue).b, 1);\",\n\t\t\t\"}\"\n\t\t].join(\"\\n\")\n\t} );\n\n\tvar mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), RTMaterial );\n\n\t// Final scene\n\tvar finalScene = new THREE.Scene();\n\tfinalScene.add( oCamera );\n\tfinalScene.add( mesh );\n\n var left = {}, right = {};\n var distScale = 1.0;\n\tthis.setHMD = function(v) {\n\t\tHMD = v;\n\t\t// Compute aspect ratio and FOV\n\t\tvar aspect = HMD.hResolution / (2*HMD.vResolution);\n\n\t\t// Fov is normally computed with:\n\t\t// THREE.Math.radToDeg( 2*Math.atan2(HMD.vScreenSize,2*HMD.eyeToScreenDistance) );\n\t\t// But with lens distortion it is increased (see Oculus SDK Documentation)\n\t\tvar r = -1.0 - (4 * (HMD.hScreenSize/4 - HMD.lensSeparationDistance/2) / HMD.hScreenSize);\n\t\tdistScale = (HMD.distortionK[0] + HMD.distortionK[1] * Math.pow(r,2) + HMD.distortionK[2] * Math.pow(r,4) + HMD.distortionK[3] * Math.pow(r,6));\n\t\tvar fov = THREE.Math.radToDeg(2*Math.atan2(HMD.vScreenSize*distScale, 2*HMD.eyeToScreenDistance));\n\n\t\t// Compute camera projection matrices\n\t\tvar proj = (new THREE.Matrix4()).makePerspective( fov, aspect, 0.3, 10000 );\n\t\tvar h = 4 * (HMD.hScreenSize/4 - HMD.interpupillaryDistance/2) / HMD.hScreenSize;\n\t\tleft.proj = ((new THREE.Matrix4()).makeTranslation( h, 0.0, 0.0 )).multiply(proj);\n\t\tright.proj = ((new THREE.Matrix4()).makeTranslation( -h, 0.0, 0.0 )).multiply(proj);\n\n\t\t// Compute camera transformation matrices\n\t\tleft.tranform = (new THREE.Matrix4()).makeTranslation( -worldFactor * HMD.interpupillaryDistance/2, 0.0, 0.0 );\n\t\tright.tranform = (new THREE.Matrix4()).makeTranslation( worldFactor * HMD.interpupillaryDistance/2, 0.0, 0.0 );\n\n\t\t// Compute Viewport\n\t\tleft.viewport = [0, 0, HMD.hResolution/2, HMD.vResolution];\n\t\tright.viewport = [HMD.hResolution/2, 0, HMD.hResolution/2, HMD.vResolution];\n\n\t\t// Distortion shader parameters\n\t\tvar lensShift = 4 * (HMD.hScreenSize/4 - HMD.lensSeparationDistance/2) / HMD.hScreenSize;\n\t\tleft.lensCenter = new THREE.Vector2(lensShift, 0.0);\n\t\tright.lensCenter = new THREE.Vector2(-lensShift, 0.0);\n\n\t\tRTMaterial.uniforms['hmdWarpParam'].value = new THREE.Vector4(HMD.distortionK[0], HMD.distortionK[1], HMD.distortionK[2], HMD.distortionK[3]);\n\t\tRTMaterial.uniforms['chromAbParam'].value = new THREE.Vector4(HMD.chromaAbParameter[0], HMD.chromaAbParameter[1], HMD.chromaAbParameter[2], HMD.chromaAbParameter[3]);\n\t\tRTMaterial.uniforms['scaleIn'].value = new THREE.Vector2(1.0,1.0/aspect);\n\t\tRTMaterial.uniforms['scale'].value = new THREE.Vector2(1.0/distScale, 1.0*aspect/distScale);\n\n\t\t// Create render target\n\t\tif ( renderTarget ) renderTarget.dispose();\n\t\trenderTarget = new THREE.WebGLRenderTarget( HMD.hResolution*distScale/2, HMD.vResolution*distScale, RTParams );\n\t\tRTMaterial.uniforms[ \"texid\" ].value = renderTarget;\n\n\t}\t\n\tthis.getHMD = function() {return HMD};\n\n\tthis.setHMD(HMD);\t\n\n\tthis.setSize = function ( width, height ) {\n\t\tleft.viewport = [width/2 - HMD.hResolution/2, height/2 - HMD.vResolution/2, HMD.hResolution/2, HMD.vResolution];\n\t\tright.viewport = [width/2, height/2 - HMD.vResolution/2, HMD.hResolution/2, HMD.vResolution];\n\n\t\trenderer.setSize( width, height );\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\t\tvar cc = renderer.getClearColor().clone();\n\n\t\t// Clear\n\t\trenderer.setClearColor(emptyColor);\n\t\trenderer.clear();\n\t\trenderer.setClearColor(cc);\n\n\t\t// camera parameters\n\t\tif (camera.matrixAutoUpdate) camera.updateMatrix();\n\n\t\t// Render left\n\t\tthis.preLeftRender();\n\n\t\tpCamera.projectionMatrix.copy(left.proj);\n\n\t\tpCamera.matrix.copy(camera.matrix).multiply(left.tranform);\n\t\tpCamera.matrixWorldNeedsUpdate = true;\n\n\t\trenderer.setViewport(left.viewport[0], left.viewport[1], left.viewport[2], left.viewport[3]);\n\n\t\tRTMaterial.uniforms['lensCenter'].value = left.lensCenter;\n\t\trenderer.render( scene, pCamera, renderTarget, true );\n\n\t\trenderer.render( finalScene, oCamera );\n\n\t\t// Render right\n\t\tthis.preRightRender();\n\n\t\tpCamera.projectionMatrix.copy(right.proj);\n\n\t\tpCamera.matrix.copy(camera.matrix).multiply(right.tranform);\n\t\tpCamera.matrixWorldNeedsUpdate = true;\n\n\t\trenderer.setViewport(right.viewport[0], right.viewport[1], right.viewport[2], right.viewport[3]);\n\n\t\tRTMaterial.uniforms['lensCenter'].value = right.lensCenter;\n\n\t\trenderer.render( scene, pCamera, renderTarget, true );\n\t\trenderer.render( finalScene, oCamera );\n\n\t};\n\n\tthis.dispose = function() {\n\t\tif ( RTMaterial ) {\n\t\t\tRTMaterial.dispose();\n\t\t}\n\t\tif ( renderTarget ) {\n\t\t\trenderTarget.dispose();\n\t\t}\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Effects/ParallaxBarrierEffect.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Effects/ParallaxBarrierEffect.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author marklundin / http://mark-lundin.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ParallaxBarrierEffect = function ( renderer ) {\n\n\tvar eyeRight = new THREE.Matrix4();\n\tvar eyeLeft = new THREE.Matrix4();\n\tvar focalLength = 125;\n\tvar _aspect, _near, _far, _fov;\n\n\tvar _cameraL = new THREE.PerspectiveCamera();\n\t_cameraL.matrixAutoUpdate = false;\n\n\tvar _cameraR = new THREE.PerspectiveCamera();\n\t_cameraR.matrixAutoUpdate = false;\n\n\tvar _scene = new THREE.Scene();\n\n\tvar _camera = new THREE.PerspectiveCamera( 53, 1, 1, 10000 );\n\t_camera.position.z = 2;\n\t_scene.add( _camera );\n\n\tvar _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };\n\n\tvar _renderTargetL = new THREE.WebGLRenderTarget( 512, 512, _params );\n\tvar _renderTargetR = new THREE.WebGLRenderTarget( 512, 512, _params );\n\n\tvar _material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: {\n\n\t\t\t\"mapLeft\": { type: \"t\", value: _renderTargetL },\n\t\t\t\"mapRight\": { type: \"t\", value: _renderTargetR }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\"\tvUv = vec2( uv.x, uv.y );\",\n\t\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D mapLeft;\",\n\t\t\t\"uniform sampler2D mapRight;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\"\tvec2 uv = vUv;\",\n\n\t\t\t\"\tif ( ( mod( gl_FragCoord.y, 2.0 ) ) > 1.00 ) {\",\n\n\t\t\t\"\t\tgl_FragColor = texture2D( mapLeft, uv );\",\n\n\t\t\t\"\t} else {\",\n\n\t\t\t\"\t\tgl_FragColor = texture2D( mapRight, uv );\",\n\n\t\t\t\"\t}\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t} );\n\n\tvar mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), _material );\n\t_scene.add( mesh );\n\n\tthis.setSize = function ( width, height ) {\n\n\t\t_renderTargetL = new THREE.WebGLRenderTarget( width, height, _params );\n\t\t_renderTargetR = new THREE.WebGLRenderTarget( width, height, _params );\n\n\t\t_material.uniforms[ \"mapLeft\" ].value = _renderTargetL;\n\t\t_material.uniforms[ \"mapRight\" ].value = _renderTargetR;\n\n\t\trenderer.setSize( width, height );\n\n\t};\n\n\t/*\n\t * Renderer now uses an asymmetric perspective projection\n\t * (http://paulbourke.net/miscellaneous/stereographics/stereorender/).\n\t *\n\t * Each camera is offset by the eye seperation and its projection matrix is\n\t * also skewed asymetrically back to converge on the same projection plane.\n\t * Added a focal length parameter to, this is where the parallax is equal to 0.\n\t */\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\n\t\tvar hasCameraChanged = ( _aspect !== camera.aspect ) || ( _near !== camera.near ) || ( _far !== camera.far ) || ( _fov !== camera.fov );\n\n\t\tif ( hasCameraChanged ) {\n\n\t\t\t_aspect = camera.aspect;\n\t\t\t_near = camera.near;\n\t\t\t_far = camera.far;\n\t\t\t_fov = camera.fov;\n\n\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\tvar eyeSep = focalLength / 30 * 0.5;\n\t\t\tvar eyeSepOnProjection = eyeSep * _near / focalLength;\n\t\t\tvar ymax = _near * Math.tan( THREE.Math.degToRad( _fov * 0.5 ) );\n\t\t\tvar xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\teyeRight.elements[12] = eyeSep;\n\t\t\teyeLeft.elements[12] = -eyeSep;\n\n\t\t\t// for left eye\n\n\t\t\txmin = -ymax * _aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * _aspect + eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[0] = 2 * _near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[8] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t_cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = -ymax * _aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * _aspect - eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[0] = 2 * _near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[8] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t_cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t}\n\n\t\t_cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t_cameraL.position.copy( camera.position );\n\t\t_cameraL.near = camera.near;\n\t\t_cameraL.far = camera.far;\n\n\t\trenderer.render( scene, _cameraL, _renderTargetL, true );\n\n\t\t_cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\t\t_cameraR.position.copy( camera.position );\n\t\t_cameraR.near = camera.near;\n\t\t_cameraR.far = camera.far;\n\n\t\trenderer.render( scene, _cameraR, _renderTargetR, true );\n\n\t\t_scene.updateMatrixWorld();\n\n\t\trenderer.render( _scene, _camera );\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Effects/AnaglyphEffect.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Effects/AnaglyphEffect.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author marklundin / http://mark-lundin.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.AnaglyphEffect = function ( renderer, width, height ) {\n\n\tvar eyeRight = new THREE.Matrix4();\n\tvar eyeLeft = new THREE.Matrix4();\n\tvar focalLength = 125;\n\tvar _aspect, _near, _far, _fov;\n\n\tvar _cameraL = new THREE.PerspectiveCamera();\n\t_cameraL.matrixAutoUpdate = false;\n\n\tvar _cameraR = new THREE.PerspectiveCamera();\n\t_cameraR.matrixAutoUpdate = false;\n\n\tvar _camera = new THREE.OrthographicCamera( -1, 1, 1, - 1, 0, 1 );\n\n\tvar _scene = new THREE.Scene();\n\n\tvar _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };\n\n\tif ( width === undefined ) width = 512;\n\tif ( height === undefined ) height = 512;\n\n\tvar _renderTargetL = new THREE.WebGLRenderTarget( width, height, _params );\n\tvar _renderTargetR = new THREE.WebGLRenderTarget( width, height, _params );\n\n\tvar _material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: {\n\n\t\t\t\"mapLeft\": { type: \"t\", value: _renderTargetL },\n\t\t\t\"mapRight\": { type: \"t\", value: _renderTargetR }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\"\tvUv = vec2( uv.x, uv.y );\",\n\t\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D mapLeft;\",\n\t\t\t\"uniform sampler2D mapRight;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\"\tvec4 colorL, colorR;\",\n\t\t\t\"\tvec2 uv = vUv;\",\n\n\t\t\t\"\tcolorL = texture2D( mapLeft, uv );\",\n\t\t\t\"\tcolorR = texture2D( mapRight, uv );\",\n\n\t\t\t\t// http://3dtv.at/Knowhow/AnaglyphComparison_en.aspx\n\n\t\t\t\"\tgl_FragColor = vec4( colorL.g * 0.7 + colorL.b * 0.3, colorR.g, colorR.b, colorL.a + colorR.a ) * 1.1;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t} );\n\n\tvar mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), _material );\n\t_scene.add( mesh );\n\n\tthis.setSize = function ( width, height ) {\n\n\t\tif ( _renderTargetL ) _renderTargetL.dispose();\n\t\tif ( _renderTargetR ) _renderTargetR.dispose();\n\t\t_renderTargetL = new THREE.WebGLRenderTarget( width, height, _params );\n\t\t_renderTargetR = new THREE.WebGLRenderTarget( width, height, _params );\n\n\t\t_material.uniforms[ \"mapLeft\" ].value = _renderTargetL;\n\t\t_material.uniforms[ \"mapRight\" ].value = _renderTargetR;\n\n\t\trenderer.setSize( width, height );\n\n\t};\n\n\t/*\n\t * Renderer now uses an asymmetric perspective projection\n\t * (http://paulbourke.net/miscellaneous/stereographics/stereorender/).\n\t *\n\t * Each camera is offset by the eye seperation and its projection matrix is\n\t * also skewed asymetrically back to converge on the same projection plane.\n\t * Added a focal length parameter to, this is where the parallax is equal to 0.\n\t */\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\n\t\tvar hasCameraChanged = ( _aspect !== camera.aspect ) || ( _near !== camera.near ) || ( _far !== camera.far ) || ( _fov !== camera.fov );\n\n\t\tif ( hasCameraChanged ) {\n\n\t\t\t_aspect = camera.aspect;\n\t\t\t_near = camera.near;\n\t\t\t_far = camera.far;\n\t\t\t_fov = camera.fov;\n\n\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\tvar eyeSep = focalLength / 30 * 0.5;\n\t\t\tvar eyeSepOnProjection = eyeSep * _near / focalLength;\n\t\t\tvar ymax = _near * Math.tan( THREE.Math.degToRad( _fov * 0.5 ) );\n\t\t\tvar xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\teyeRight.elements[12] = eyeSep;\n\t\t\teyeLeft.elements[12] = -eyeSep;\n\n\t\t\t// for left eye\n\n\t\t\txmin = -ymax * _aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * _aspect + eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[0] = 2 * _near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[8] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t_cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = -ymax * _aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * _aspect - eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[0] = 2 * _near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[8] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t_cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t}\n\n\t\t_cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t_cameraL.position.copy( camera.position );\n\t\t_cameraL.near = camera.near;\n\t\t_cameraL.far = camera.far;\n\n\t\trenderer.render( scene, _cameraL, _renderTargetL, true );\n\n\t\t_cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\t\t_cameraR.position.copy( camera.position );\n\t\t_cameraR.near = camera.near;\n\t\t_cameraR.far = camera.far;\n\n\t\trenderer.render( scene, _cameraR, _renderTargetR, true );\n\n\t\trenderer.render( _scene, _camera );\n\n\t};\n\n\tthis.dispose = function() {\n\t\tif ( _renderTargetL ) _renderTargetL.dispose();\n\t\tif ( _renderTargetR ) _renderTargetR.dispose();\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Effects/StereoEffect.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Effects/StereoEffect.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n * @authod mrdoob / http://mrdoob.com/\n * @authod arodic / http://aleksandarrodic.com/\n */\n\nTHREE.StereoEffect = function ( renderer ) {\n\n\t// API\n\n\tthis.separation = 3;\n\n\t// internals\n\n\tvar _width, _height;\n\n\tvar _position = new THREE.Vector3();\n\tvar _quaternion = new THREE.Quaternion();\n\tvar _scale = new THREE.Vector3();\n\n\tvar _cameraL = new THREE.PerspectiveCamera();\n\tvar _cameraR = new THREE.PerspectiveCamera();\n\n\t// initialization\n\n\trenderer.autoClear = false;\n\n\tthis.setSize = function ( width, height ) {\n\n\t\t_width = width / 2;\n\t\t_height = height;\n\n\t\trenderer.setSize( width, height );\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\n\t\n\t\tcamera.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t// left\n\n\t\t_cameraL.fov = camera.fov;\n\t\t_cameraL.aspect = 0.5 * camera.aspect;\n\t\t_cameraL.near = camera.near;\n\t\t_cameraL.far = camera.far;\n\t\t_cameraL.updateProjectionMatrix();\n\n\t\t_cameraL.position.copy( _position );\n\t\t_cameraL.quaternion.copy( _quaternion );\n\t\t_cameraL.translateX( - this.separation );\n\n\t\t// right\n\n\t\t_cameraR.near = camera.near;\n\t\t_cameraR.far = camera.far;\n\t\t_cameraR.projectionMatrix = _cameraL.projectionMatrix;\n\n\t\t_cameraR.position.copy( _position );\n\t\t_cameraR.quaternion.copy( _quaternion );\n\t\t_cameraR.translateX( this.separation );\n\n\t\t//\n\n\t\trenderer.setViewport( 0, 0, _width * 2, _height );\n\t\trenderer.clear();\n\n\t\trenderer.setViewport( 0, 0, _width, _height );\n\t\trenderer.render( scene, _cameraL );\n\n\t\trenderer.setViewport( _width, 0, _width, _height );\n\t\trenderer.render( scene, _cameraR );\n\n\t};\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Effects/AsciiEffect.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Effects/AsciiEffect.js",
"module-type": "library",
"text": "/*\n * @author zz85 / https://github.com/zz85\n *\n * Ascii generation is based on http://www.nihilogic.dk/labs/jsascii/\n * Maybe more about this later with a blog post at http://lab4games.net/zz85/blog\n *\n * 16 April 2012 - @blurspline\n */\n\nTHREE.AsciiEffect = function ( renderer, charSet, options ) {\n\n\t// its fun to create one your own!\n\n\tcharSet = ( charSet === undefined ) ? ' .:-=+*#%@' : charSet;\n\n\t// ' .,:;=|iI+hHOE#`$';\n\t// darker bolder character set from https://github.com/saw/Canvas-ASCII-Art/\n\t// ' .\\'`^\",:;Il!i~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$'.split('');\n\n\tif ( !options ) options = {};\n\n\t// Some ASCII settings\n\n\tvar bResolution = !options['resolution'] ? 0.15 : options['resolution']; // Higher for more details\n\tvar iScale = !options['scale'] ? 1 : options['scale'];\n\tvar bColor = !options['color'] ? false : options['color']; // nice but slows down rendering!\n\tvar bAlpha = !options['alpha'] ? false : options['alpha']; // Transparency\n\tvar bBlock = !options['block'] ? false : options['block']; // blocked characters. like good O dos\n\tvar bInvert = !options['invert'] ? false : options['invert']; // black is white, white is black\n\n\tvar strResolution = 'low';\n\n\tvar width, height;\n\n\tvar domElement = document.createElement('div');\n\tdomElement.style.cursor = 'default';\n\n\tvar oAscii = document.createElement(\"table\");\n\tdomElement.appendChild( oAscii );\n\n\tvar iWidth, iHeight;\n\tvar oImg;\n\n\tthis.setSize = function ( w, h ) {\n\n\t\twidth = w;\n\t\theight = h;\n\n\t\trenderer.setSize( w, h );\n\n\t\tinitAsciiSize();\n\n\t};\n\n\n\tthis.render = function ( scene, camera ) {\n\n\t\trenderer.render( scene, camera );\n\t\tasciifyImage( renderer, oAscii );\n\n\t};\n\n\tthis.domElement = domElement;\n\n\n\t// Throw in ascii library from http://www.nihilogic.dk/labs/jsascii/jsascii.js\n\n\t/*\n\t* jsAscii 0.1\n\t* Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/\n\t* MIT License [http://www.nihilogic.dk/licenses/mit-license.txt]\n\t*/\n\n\tfunction initAsciiSize() {\n\n\t\tiWidth = Math.round( width * fResolution );\n\t\tiHeight = Math.round( height * fResolution );\n\n\t\toCanvas.width = iWidth;\n\t\toCanvas.height = iHeight;\n\t\t// oCanvas.style.display = \"none\";\n\t\t// oCanvas.style.width = iWidth;\n\t\t// oCanvas.style.height = iHeight;\n\n\t\toImg = renderer.domElement;\n\n\t\tif ( oImg.style.backgroundColor ) {\n\n\t\t\toAscii.rows[0].cells[0].style.backgroundColor = oImg.style.backgroundColor;\n\t\t\toAscii.rows[0].cells[0].style.color = oImg.style.color;\n\n\t\t}\n\n\t\toAscii.cellSpacing = 0;\n\t\toAscii.cellPadding = 0;\n\n\t\tvar oStyle = oAscii.style;\n\t\toStyle.display = \"inline\";\n\t\toStyle.width = Math.round(iWidth/fResolution*iScale) + \"px\";\n\t\toStyle.height = Math.round(iHeight/fResolution*iScale) + \"px\";\n\t\toStyle.whiteSpace = \"pre\";\n\t\toStyle.margin = \"0px\";\n\t\toStyle.padding = \"0px\";\n\t\toStyle.letterSpacing = fLetterSpacing + \"px\";\n\t\toStyle.fontFamily = strFont;\n\t\toStyle.fontSize = fFontSize + \"px\";\n\t\toStyle.lineHeight = fLineHeight + \"px\";\n\t\toStyle.textAlign = \"left\";\n\t\toStyle.textDecoration = \"none\";\n\t}\n\n\n\tvar aDefaultCharList = (\" .,:;i1tfLCG08@\").split(\"\");\n\tvar aDefaultColorCharList = (\" CGO08@\").split(\"\");\n\tvar strFont = \"courier new, monospace\";\n\n\tvar oCanvasImg = renderer.domElement;\n\n\tvar oCanvas = document.createElement(\"canvas\");\n\tif (!oCanvas.getContext) {\n\t\treturn;\n\t}\n\n\tvar oCtx = oCanvas.getContext(\"2d\");\n\tif (!oCtx.getImageData) {\n\t\treturn;\n\t}\n\n\tvar aCharList = (bColor ? aDefaultColorCharList : aDefaultCharList);\n\n\tif (charSet) aCharList = charSet;\n\n\tvar fResolution = 0.5;\n\n\tswitch ( strResolution ) {\n\n\t\tcase \"low\" : \tfResolution = 0.25; break;\n\t\tcase \"medium\" : fResolution = 0.5; break;\n\t\tcase \"high\" : \tfResolution = 1; break;\n\n\t}\n\n\tif ( bResolution ) fResolution = bResolution;\n\n\t// Setup dom\n\n\tvar fFontSize = (2/fResolution)*iScale;\n\tvar fLineHeight = (2/fResolution)*iScale;\n\n\t// adjust letter-spacing for all combinations of scale and resolution to get it to fit the image width.\n\n\tvar fLetterSpacing = 0;\n\n\tif ( strResolution == \"low\" ) {\n\n\t\tswitch (iScale) {\n\t\t\tcase 1 : fLetterSpacing = -1; break;\n\t\t\tcase 2 :\n\t\t\tcase 3 : fLetterSpacing = -2.1; break;\n\t\t\tcase 4 : fLetterSpacing = -3.1; break;\n\t\t\tcase 5 : fLetterSpacing = -4.15; break;\n\t\t}\n\n\t}\n\n\tif ( strResolution == \"medium\" ) {\n\n\t\tswitch (iScale) {\n\t\t\tcase 1 : fLetterSpacing = 0; break;\n\t\t\tcase 2 : fLetterSpacing = -1; break;\n\t\t\tcase 3 : fLetterSpacing = -1.04; break;\n\t\t\tcase 4 :\n\t\t\tcase 5 : fLetterSpacing = -2.1; break;\n\t\t}\n\n\t}\n\n\tif ( strResolution == \"high\" ) {\n\n\t\tswitch (iScale) {\n\t\t\tcase 1 :\n\t\t\tcase 2 : fLetterSpacing = 0; break;\n\t\t\tcase 3 :\n\t\t\tcase 4 :\n\t\t\tcase 5 : fLetterSpacing = -1; break;\n\t\t}\n\n\t}\n\n\n\t// can't get a span or div to flow like an img element, but a table works?\n\n\n\t// convert img element to ascii\n\n\tfunction asciifyImage( canvasRenderer, oAscii ) {\n\n\t\toCtx.clearRect( 0, 0, iWidth, iHeight );\n\t\toCtx.drawImage( oCanvasImg, 0, 0, iWidth, iHeight );\n\t\tvar oImgData = oCtx.getImageData(0, 0, iWidth, iHeight).data;\n\n\t\t// Coloring loop starts now\n\t\tvar strChars = \"\";\n\n\t\t// console.time('rendering');\n\n\t\tfor (var y=0;y<iHeight;y+=2) {\n\t\t\tfor (var x=0;x<iWidth;x++) {\n\t\t\t\tvar iOffset = (y*iWidth + x) * 4;\n\n\t\t\t\tvar iRed = oImgData[iOffset];\n\t\t\t\tvar iGreen = oImgData[iOffset + 1];\n\t\t\t\tvar iBlue = oImgData[iOffset + 2];\n\t\t\t\tvar iAlpha = oImgData[iOffset + 3];\n\t\t\t\tvar iCharIdx;\n\n\t\t\t\tvar fBrightness;\n\n\t\t\t\tfBrightness = (0.3*iRed + 0.59*iGreen + 0.11*iBlue) / 255;\n\t\t\t\t// fBrightness = (0.3*iRed + 0.5*iGreen + 0.3*iBlue) / 255;\n\n\t\t\t\tif (iAlpha == 0) {\n\t\t\t\t\t// should calculate alpha instead, but quick hack :)\n\t\t\t\t\t//fBrightness *= (iAlpha / 255);\n\t\t\t\t\tfBrightness = 1;\n\n\t\t\t\t}\n\n\t\t\t\tiCharIdx = Math.floor((1-fBrightness) * (aCharList.length-1));\n\n\t\t\t\tif (bInvert) {\n\t\t\t\t\tiCharIdx = aCharList.length - iCharIdx - 1;\n\t\t\t\t}\n\n\t\t\t\t// good for debugging\n\t\t\t\t//fBrightness = Math.floor(fBrightness * 10);\n\t\t\t\t//strThisChar = fBrightness;\n\n\t\t\t\tvar strThisChar = aCharList[iCharIdx];\n\n\t\t\t\tif (strThisChar===undefined || strThisChar == \" \")\n\t\t\t\t\tstrThisChar = \" \";\n\n\t\t\t\tif (bColor) {\n\t\t\t\t\tstrChars += \"<span style='\"\n\t\t\t\t\t\t+ \"color:rgb(\"+iRed+\",\"+iGreen+\",\"+iBlue+\");\"\n\t\t\t\t\t\t+ (bBlock ? \"background-color:rgb(\"+iRed+\",\"+iGreen+\",\"+iBlue+\");\" : \"\")\n\t\t\t\t\t\t+ (bAlpha ? \"opacity:\" + (iAlpha/255) + \";\" : \"\")\n\t\t\t\t\t\t+ \"'>\" + strThisChar + \"</span>\";\n\t\t\t\t} else {\n\t\t\t\t\tstrChars += strThisChar;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstrChars += \"<br/>\";\n\t\t}\n\n\t\toAscii.innerHTML = \"<tr><td>\" + strChars + \"</td></tr>\";\n\n\t\t// console.timeEnd('rendering');\n\n\t\t// return oAscii;\n\t}\n\n\t// end modified asciifyImage block\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/OBJExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/OBJExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.OBJExporter = function () {};\n\nTHREE.OBJExporter.prototype = {\n\n\tconstructor: THREE.OBJExporter,\n\n\tparse: function ( geometry ) {\n\n\t\tvar output = '';\n\n\t\tfor ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {\n\n\t\t\tvar vertex = geometry.vertices[ i ];\n\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t}\n\n\t\t// uvs\n\n\t\tfor ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {\n\n\t\t\tvar vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];\n\n\t\t\tfor ( var j = 0; j < vertexUvs.length; j ++ ) {\n\n\t\t\t\tvar uv = vertexUvs[ j ];\n\t\t\t\toutput += 'vt ' + uv.x + ' ' + uv.y + '\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normals\n\n\t\tfor ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {\n\n\t\t\tvar normals = geometry.faces[ i ].vertexNormals;\n\n\t\t\tfor ( var j = 0; j < normals.length; j ++ ) {\n\n\t\t\t\tvar normal = normals[ j ];\n\t\t\t\toutput += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// faces\n\n\t\tfor ( var i = 0, j = 1, l = geometry.faces.length; i < l; i ++, j += 3 ) {\n\n\t\t\tvar face = geometry.faces[ i ];\n\n\t\t\toutput += 'f ';\n\t\t\toutput += ( face.a + 1 ) + '/' + ( j ) + '/' + ( j ) + ' ';\n\t\t\toutput += ( face.b + 1 ) + '/' + ( j + 1 ) + '/' + ( j + 1 ) + ' ';\n\t\t\toutput += ( face.c + 1 ) + '/' + ( j + 2 ) + '/' + ( j + 2 ) + '\\n';\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/STLExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/STLExporter.js",
"module-type": "library",
"text": "/**\n * @author kovacsv / http://kovacsv.hu/\n * @author mrdoob / http://mrdoob.com/\n */\n \nTHREE.STLExporter = function () {};\n\nTHREE.STLExporter.prototype = {\n\n\tconstructor: THREE.STLExporter,\n\n\tparse: ( function () {\n\n\t\tvar vector = new THREE.Vector3();\n\t\tvar normalMatrixWorld = new THREE.Matrix3();\n\n\t\treturn function ( scene ) {\n\n\t\t\tvar output = '';\n\n\t\t\toutput += 'solid exported\\n';\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( object instanceof THREE.Mesh ) {\n\n\t\t\t\t\tvar geometry = object.geometry;\n\t\t\t\t\tvar matrixWorld = object.matrixWorld;\n\n\t\t\t\t\tif ( geometry instanceof THREE.Geometry ) {\n\n\t\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\t\tvar faces = geometry.faces;\n\n\t\t\t\t\t\tnormalMatrixWorld.getNormalMatrix( matrixWorld );\n\n\t\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\t\t\tvector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t\t\toutput += '\\tfacet normal ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\\n';\n\t\t\t\t\t\t\toutput += '\\t\\touter loop\\n';\n\n\t\t\t\t\t\t\tvar indices = [ face.a, face.b, face.c ];\n\n\t\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\tvector.copy( vertices[ indices[ j ] ] ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\t\t\toutput += '\\t\\t\\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\\n';\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput += '\\t\\tendloop\\n';\n\t\t\t\t\t\t\toutput += '\\tendfacet\\n';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\toutput += 'endsolid exported\\n';\n\n\t\t\treturn output;\n\n\t\t};\n\n\t}() )\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/MaterialExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/MaterialExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.MaterialExporter = function () {};\n\nTHREE.MaterialExporter.prototype = {\n\n\tconstructor: THREE.MaterialExporter,\n\n\tparse: function ( material ) {\n\n\t\tvar output = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.2,\n\t\t\t\ttype: 'material',\n\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t}\n\t\t};\n\n\t\toutput.uuid = material.uuid;\n\n\t\tif ( material.name !== \"\" ) output.name = material.name;\n\n\t\tif ( material instanceof THREE.MeshBasicMaterial ) {\n\n\t\t\toutput.type = 'MeshBasicMaterial';\n\t\t\toutput.color = material.color.getHex();\n\t\t\tif ( material.vertexColors !== THREE.NoColors ) output.vertexColors = material.vertexColors;\n\t\t\tif ( material.blending !== THREE.NormalBlending ) output.blending = material.blending;\n\t\t\tif ( material.side !== THREE.FrontSide ) output.side = material.side;\n\t\t\toutput.opacity = material.opacity;\n\t\t\toutput.transparent = material.transparent;\n\t\t\toutput.wireframe = material.wireframe;\n\n\t\t} else if ( material instanceof THREE.MeshLambertMaterial ) {\n\n\t\t\toutput.type = 'MeshLambertMaterial';\n\t\t\toutput.color = material.color.getHex();\n\t\t\toutput.ambient = material.ambient.getHex();\n\t\t\toutput.emissive = material.emissive.getHex();\n\t\t\tif ( material.vertexColors !== THREE.NoColors ) output.vertexColors = material.vertexColors;\n\t\t\tif ( material.blending !== THREE.NormalBlending ) output.blending = material.blending;\n\t\t\tif ( material.side !== THREE.FrontSide ) output.side = material.side;\n\t\t\toutput.opacity = material.opacity;\n\t\t\toutput.transparent = material.transparent;\n\t\t\toutput.wireframe = material.wireframe;\n\n\t\t} else if ( material instanceof THREE.MeshPhongMaterial ) {\n\n\t\t\toutput.type = 'MeshPhongMaterial';\n\t\t\toutput.color = material.color.getHex();\n\t\t\toutput.ambient = material.ambient.getHex();\n\t\t\toutput.emissive = material.emissive.getHex();\n\t\t\toutput.specular = material.specular.getHex();\n\t\t\toutput.shininess = material.shininess;\n\t\t\tif ( material.vertexColors !== THREE.NoColors ) output.vertexColors = material.vertexColors;\n\t\t\tif ( material.blending !== THREE.NormalBlending ) output.blending = material.blending;\n\t\t\tif ( material.side !== THREE.FrontSide ) output.side = material.side;\n\t\t\toutput.opacity = material.opacity;\n\t\t\toutput.transparent = material.transparent;\n\t\t\toutput.wireframe = material.wireframe;\n\n\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\n\n\t\t\toutput.type = 'MeshNormalMaterial';\n\t\t\tif ( material.blending !== THREE.NormalBlending ) output.blending = material.blending;\n\t\t\tif ( material.side !== THREE.FrontSide ) output.side = material.side;\n\t\t\toutput.opacity = material.opacity;\n\t\t\toutput.transparent = material.transparent;\n\t\t\toutput.wireframe = material.wireframe;\n\n\t\t} else if ( material instanceof THREE.MeshDepthMaterial ) {\n\n\t\t\toutput.type = 'MeshDepthMaterial';\n\t\t\tif ( material.blending !== THREE.NormalBlending ) output.blending = material.blending;\n\t\t\tif ( material.side !== THREE.FrontSide ) output.side = material.side;\n\t\t\toutput.opacity = material.opacity;\n\t\t\toutput.transparent = material.transparent;\n\t\t\toutput.wireframe = material.wireframe;\n\n\t\t} else if ( material instanceof THREE.MeshFaceMaterial ) {\n\n\t\t\toutput.type = 'MeshFaceMaterial';\n\t\t\toutput.materials = [];\n\n\t\t\tfor ( var i = 0, l = material.materials.length; i < l; i ++ ) {\n\n\t\t\t\toutput.materials.push( this.parse( material.materials[ i ] ) );\n\n\t\t\t}\n\n\t\t} else if ( material instanceof THREE.ShaderMaterial ) {\n\n\t\t\toutput.type = 'ShaderMaterial';\n\t\t\toutput.uniforms = material.uniforms;\n\t\t\toutput.vertexShader = material.vertexShader;\n\t\t\toutput.fragmentShader = material.fragmentShader;\n\n\t\t} else if ( material instanceof THREE.SpriteMaterial ) {\n\n\t\t\toutput.type = 'SpriteMaterial';\n\t\t\toutput.color = material.color.getHex();\n\t\t\toutput.opacity = material.opacity;\n\t\t\toutput.transparent = material.transparent;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/BufferGeometryExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/BufferGeometryExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.BufferGeometryExporter = function () {};\n\nTHREE.BufferGeometryExporter.prototype = {\n\n\tconstructor: THREE.BufferGeometryExporter,\n\n\tparse: function ( geometry ) {\n\n\t\tvar output = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.0,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometryExporter'\n\t\t\t},\n\t\t\tattributes: {\n\t\t\t}\n\t\t};\n\n\t\tvar attributes = geometry.attributes;\n\t\tvar offsets = geometry.offsets;\n\t\tvar boundingSphere = geometry.boundingSphere;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\n\t\t\tvar array = [], typeArray = attribute.array;\n\n\t\t\tfor ( var i = 0, l = typeArray.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = typeArray[ i ];\n\n\t\t\t}\n\n\t\t\toutput.attributes[ key ] = {\n\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\tarray: array\n\t\t\t}\n\n\t\t}\n\n\t\tif ( offsets.length > 0 ) {\n\n\t\t\toutput.offsets = JSON.parse( JSON.stringify( offsets ) );\n\n\t\t}\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\toutput.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t}\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/ObjectExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/ObjectExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.ObjectExporter = function () {};\n\nTHREE.ObjectExporter.prototype = {\n\n\tconstructor: THREE.ObjectExporter,\n\n\tparse: function ( object ) {\n\n\t\t// console.log( object );\n\n\t\tvar output = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.3,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'ObjectExporter'\n\t\t\t}\n\t\t};\n\n\t\t//\n\n\t\tvar geometries = {};\n\t\tvar geometryExporter = new THREE.GeometryExporter();\n\t\tvar bufferGeometryExporter = new THREE.BufferGeometryExporter();\n\n\t\tvar parseGeometry = function ( geometry ) {\n\n\t\t\tif ( output.geometries === undefined ) {\n\n\t\t\t\toutput.geometries = [];\n\n\t\t\t}\n\n\t\t\tif ( geometries[ geometry.uuid ] === undefined ) {\n\n\t\t\t\tvar data = {};\n\n\t\t\t\tdata.uuid = geometry.uuid;\n\n\t\t\t\tif ( geometry.name !== \"\" ) data.name = geometry.name;\n\n\t\t\t\tvar handleParameters = function ( parameters ) {\n\n\t\t\t\t\tfor ( var i = 0; i < parameters.length; i ++ ) {\n\n\t\t\t\t\t\tvar parameter = parameters[ i ];\n\n\t\t\t\t\t\tif ( geometry.parameters[ parameter ] !== undefined ) {\n\n\t\t\t\t\t\t\tdata[ parameter ] = geometry.parameters[ parameter ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tif ( geometry instanceof THREE.PlaneGeometry ) {\n\n\t\t\t\t\tdata.type = 'PlaneGeometry';\n\t\t\t\t\thandleParameters( [ 'width', 'height', 'widthSegments', 'heightSegments' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.BoxGeometry ) {\n\n\t\t\t\t\tdata.type = 'BoxGeometry';\n\t\t\t\t\thandleParameters( [ 'width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegments' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.CircleGeometry ) {\n\n\t\t\t\t\tdata.type = 'CircleGeometry';\n\t\t\t\t\thandleParameters( [ 'radius', 'segments' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.CylinderGeometry ) {\n\n\t\t\t\t\tdata.type = 'CylinderGeometry';\n\t\t\t\t\thandleParameters( [ 'radiusTop', 'radiusBottom', 'height', 'radialSegments', 'heightSegments', 'openEnded' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.SphereGeometry ) {\n\n\t\t\t\t\tdata.type = 'SphereGeometry';\n\t\t\t\t\thandleParameters( [ 'radius', 'widthSegments', 'heightSegments', 'phiStart', 'phiLength', 'thetaStart', 'thetaLength' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.IcosahedronGeometry ) {\n\n\t\t\t\t\tdata.type = 'IcosahedronGeometry';\n\t\t\t\t\thandleParameters( [ 'radius', 'detail' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.TorusGeometry ) {\n\n\t\t\t\t\tdata.type = 'TorusGeometry';\n\t\t\t\t\thandleParameters( [ 'radius', 'tube', 'radialSegments', 'tubularSegments', 'arc' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.TorusKnotGeometry ) {\n\n\t\t\t\t\tdata.type = 'TorusKnotGeometry';\n\t\t\t\t\thandleParameters( [ 'radius', 'tube', 'radialSegments', 'tubularSegments', 'p', 'q', 'heightScale' ] );\n\n\t\t\t\t} else if ( geometry instanceof THREE.BufferGeometry ) {\n\n\t\t\t\t\tdata.type = 'BufferGeometry';\n\t\t\t\t\tdata.data = bufferGeometryExporter.parse( geometry );\n\n\t\t\t\t\tdelete data.data.metadata;\n\n\t\t\t\t} else if ( geometry instanceof THREE.Geometry ) {\n\n\t\t\t\t\tdata.type = 'Geometry';\n\t\t\t\t\tdata.data = geometryExporter.parse( geometry );\n\n\t\t\t\t\tdelete data.data.metadata;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.uuid ] = data;\n\n\t\t\t\toutput.geometries.push( data );\n\n\t\t\t}\n\n\t\t\treturn geometry.uuid;\n\n\t\t};\n\n\t\t//\n\n\t\tvar materials = {};\n\t\tvar materialExporter = new THREE.MaterialExporter();\n\n\t\tvar parseMaterial = function ( material ) {\n\n\t\t\tif ( output.materials === undefined ) {\n\n\t\t\t\toutput.materials = [];\n\n\t\t\t}\n\n\t\t\tif ( materials[ material.uuid ] === undefined ) {\n\n\t\t\t\tvar data = materialExporter.parse( material );\n\n\t\t\t\tdelete data.metadata;\n\n\t\t\t\tmaterials[ material.uuid ] = data;\n\n\t\t\t\toutput.materials.push( data );\n\n\t\t\t}\n\n\t\t\treturn material.uuid;\n\n\t\t};\n\n\t\t//\n\n\t\tvar parseObject = function ( object ) {\n\n\t\t\tvar data = {};\n\n\t\t\tdata.uuid = object.uuid;\n\n\t\t\tif ( object.name !== '' ) data.name = object.name;\n\t\t\tif ( JSON.stringify( object.userData ) !== '{}' ) data.userData = object.userData;\n\t\t\tif ( object.visible !== true ) data.visible = object.visible;\n\n\t\t\tif ( object instanceof THREE.Scene ) {\n\n\t\t\t\tdata.type = 'Scene';\n\n\t\t\t} else if ( object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tdata.type = 'PerspectiveCamera';\n\t\t\t\tdata.fov = object.fov;\n\t\t\t\tdata.aspect = object.aspect;\n\t\t\t\tdata.near = object.near;\n\t\t\t\tdata.far = object.far;\n\n\t\t\t} else if ( object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tdata.type = 'OrthographicCamera';\n\t\t\t\tdata.left = object.left;\n\t\t\t\tdata.right = object.right;\n\t\t\t\tdata.top = object.top;\n\t\t\t\tdata.bottom = object.bottom;\n\t\t\t\tdata.near = object.near;\n\t\t\t\tdata.far = object.far;\n\n\t\t\t} else if ( object instanceof THREE.AmbientLight ) {\n\n\t\t\t\tdata.type = 'AmbientLight';\n\t\t\t\tdata.color = object.color.getHex();\n\n\t\t\t} else if ( object instanceof THREE.DirectionalLight ) {\n\n\t\t\t\tdata.type = 'DirectionalLight';\n\t\t\t\tdata.color = object.color.getHex();\n\t\t\t\tdata.intensity = object.intensity;\n\n\t\t\t} else if ( object instanceof THREE.PointLight ) {\n\n\t\t\t\tdata.type = 'PointLight';\n\t\t\t\tdata.color = object.color.getHex();\n\t\t\t\tdata.intensity = object.intensity;\n\t\t\t\tdata.distance = object.distance;\n\n\t\t\t} else if ( object instanceof THREE.SpotLight ) {\n\n\t\t\t\tdata.type = 'SpotLight';\n\t\t\t\tdata.color = object.color.getHex();\n\t\t\t\tdata.intensity = object.intensity;\n\t\t\t\tdata.distance = object.distance;\n\t\t\t\tdata.angle = object.angle;\n\t\t\t\tdata.exponent = object.exponent;\n\n\t\t\t} else if ( object instanceof THREE.HemisphereLight ) {\n\n\t\t\t\tdata.type = 'HemisphereLight';\n\t\t\t\tdata.color = object.color.getHex();\n\t\t\t\tdata.groundColor = object.groundColor.getHex();\n\n\t\t\t} else if ( object instanceof THREE.Mesh ) {\n\n\t\t\t\tdata.type = 'Mesh';\n\t\t\t\tdata.geometry = parseGeometry( object.geometry );\n\t\t\t\tdata.material = parseMaterial( object.material );\n\n\t\t\t} else if ( object instanceof THREE.Sprite ) {\n\n\t\t\t\tdata.type = 'Sprite';\n\t\t\t\tdata.material = parseMaterial( object.material );\n\n\t\t\t} else {\n\n\t\t\t\tdata.type = 'Object3D';\n\n\t\t\t}\n\n\t\t\tdata.matrix = object.matrix.toArray();\n\n\t\t\tif ( object.children.length > 0 ) {\n\n\t\t\t\tdata.children = [];\n\n\t\t\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\t\t\tdata.children.push( parseObject( object.children[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\toutput.object = parseObject( object );\n\n\t\treturn output;\n\n\t}\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/SceneExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/SceneExporter.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SceneExporter = function () {};\n\nTHREE.SceneExporter.prototype = {\n\n\tconstructor: THREE.SceneExporter,\n\n\tparse: function ( scene ) {\n\n\t\tvar position = Vector3String( scene.position );\n\t\tvar rotation = Vector3String( scene.rotation );\n\t\tvar scale = Vector3String( scene.scale );\n\n\t\tvar nobjects = 0;\n\t\tvar ngeometries = 0;\n\t\tvar nmaterials = 0;\n\t\tvar ntextures = 0;\n\n\t\tvar objectsArray = [];\n\t\tvar geometriesArray = [];\n\t\tvar materialsArray = [];\n\t\tvar texturesArray = [];\n\t\tvar fogsArray = [];\n\n\t\tvar geometriesMap = {};\n\t\tvar materialsMap = {};\n\t\tvar texturesMap = {};\n\n\t\t// extract objects, geometries, materials, textures\n\n\t\tvar checkTexture = function ( map ) {\n\n\t\t\tif ( ! map ) return;\n\n\t\t\tif ( ! ( map.id in texturesMap ) ) {\n\n\t\t\t\ttexturesMap[ map.id ] = true;\n\t\t\t\ttexturesArray.push( TextureString( map ) );\n\t\t\t\tntextures += 1;\n\n\t\t\t}\n\n\t\t};\n\n\t\tvar linesArray = [];\n\n\t\tfunction createObjectsList( object, pad ) {\n\n\t\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\t\tvar node = object.children[ i ];\n\n\t\t\t\tif ( node instanceof THREE.Mesh ) {\n\n\t\t\t\t\tlinesArray.push( MeshString( node, pad ) );\n\t\t\t\t\tnobjects += 1;\n\n\t\t\t\t\tif ( ! ( node.geometry.id in geometriesMap ) ) {\n\n\t\t\t\t\t\tgeometriesMap[ node.geometry.id ] = true;\n\t\t\t\t\t\tgeometriesArray.push( GeometryString( node.geometry ) );\n\t\t\t\t\t\tngeometries += 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! ( node.material.id in materialsMap ) ) {\n\n\t\t\t\t\t\tmaterialsMap[ node.material.id ] = true;\n\t\t\t\t\t\tmaterialsArray.push( MaterialString( node.material ) );\n\t\t\t\t\t\tnmaterials += 1;\n\n\t\t\t\t\t\tcheckTexture( node.material.map );\n\t\t\t\t\t\tcheckTexture( node.material.envMap );\n\t\t\t\t\t\tcheckTexture( node.material.lightMap );\n\t\t\t\t\t\tcheckTexture( node.material.specularMap );\n\t\t\t\t\t\tcheckTexture( node.material.bumpMap );\n\t\t\t\t\t\tcheckTexture( node.material.normalMap );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( node instanceof THREE.Light ) {\n\n\t\t\t\t\tlinesArray.push( LightString( node, pad ) );\n\t\t\t\t\tnobjects += 1;\n\n\t\t\t\t} else if ( node instanceof THREE.Camera ) {\n\n\t\t\t\t\tlinesArray.push( CameraString( node, pad ) );\n\t\t\t\t\tnobjects += 1;\n\n\t\t\t\t} else if ( node instanceof THREE.Object3D ) {\n\n\t\t\t\t\tlinesArray.push( ObjectString( node, pad ) );\n\t\t\t\t\tnobjects += 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( node.children.length > 0 ) {\n\n\t\t\t\t\tlinesArray.push( PaddingString( pad + 1 ) + '\\t\\t\"children\" : {' );\n\n\t\t\t\t}\n\n\t\t\t\tcreateObjectsList( node, pad + 2 );\n\n\t\t\t\tif ( node.children.length > 0 ) {\n\n\t\t\t\t\tlinesArray.push( PaddingString( pad + 1 ) + \"\\t\\t}\" );\n\n\t\t\t\t}\n\n\t\t\t\tlinesArray.push( PaddingString( pad ) + \"\\t\\t}\" + ( i < object.children.length - 1 ? \",\\n\" : \"\" ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tcreateObjectsList( scene, 0 );\n\n\t\tvar objects = linesArray.join( \"\\n\" );\n\n\t\t// extract fog\n\n\t\tif ( scene.fog ) {\n\n\t\t\tfogsArray.push( FogString( scene.fog ) );\n\n\t\t}\n\n\t\t// generate sections\n\n\t\tvar geometries = generateMultiLineString( geometriesArray, \",\\n\\n\\t\" );\n\t\tvar materials = generateMultiLineString( materialsArray, \",\\n\\n\\t\" );\n\t\tvar textures = generateMultiLineString( texturesArray, \",\\n\\n\\t\" );\n\t\tvar fogs = generateMultiLineString( fogsArray, \",\\n\\n\\t\" );\n\n\t\t// generate defaults\n\n\t\tvar activeCamera = null;\n\n\t\tscene.traverse( function ( node ) {\n\n\t\t\tif ( node instanceof THREE.Camera && node.userData.active ) {\n\n\t\t\t\tactiveCamera = node;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tvar defcamera = LabelString( activeCamera ? getObjectName( activeCamera ) : \"\" );\n\t\tvar deffog = LabelString( scene.fog ? getFogName( scene.fog ) : \"\" );\n\n\t\t// templates\n\n\t\tfunction Vector2String( v ) {\n\n\t\t\treturn \"[\" + v.x + \",\" + v.y + \"]\";\n\n\t\t}\n\n\t\tfunction Vector3String( v ) {\n\n\t\t\treturn \"[\" + v.x + \",\" + v.y + \",\" + v.z + \"]\";\n\n\t\t}\n\n\t\tfunction ColorString( c ) {\n\n\t\t\treturn \"[\" + c.r.toFixed( 3 ) + \",\" + c.g.toFixed( 3 ) + \",\" + c.b.toFixed( 3 ) + \"]\";\n\n\t\t}\n\n\t\tfunction LabelString( s ) {\n\n\t\t\treturn '\"' + s + '\"';\n\n\t\t}\n\n\t\tfunction NumConstantString( c ) {\n\n\t\t\tvar constants = [ \"NearestFilter\", \"NearestMipMapNearestFilter\" , \"NearestMipMapLinearFilter\",\n\t\t\t\t\t\t\t \"LinearFilter\", \"LinearMipMapNearestFilter\", \"LinearMipMapLinearFilter\" ];\n\n\t\t\tfor ( var i = 0; i < constants.length; i ++ ) {\n\n\t\t\t\tif ( THREE[ constants[ i ] ] === c ) return LabelString( constants[ i ] );\n\n\t\t\t};\n\n\t\t\treturn \"\";\n\n\t\t}\n\n\t\tfunction PaddingString( n ) {\n\n\t\t\tvar output = \"\";\n\n\t\t\tfor ( var i = 0; i < n; i ++ ) output += \"\\t\";\n\n\t\t\treturn output;\n\n\t\t}\n\n\n\t\t//\n\n\t\tfunction LightString( o, n ) {\n\n\t\t\tif ( o instanceof THREE.AmbientLight ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"AmbientLight\",',\n\t\t\t\t'\t\"color\" : ' + o.color.getHex() + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else if ( o instanceof THREE.DirectionalLight ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"DirectionalLight\",',\n\t\t\t\t'\t\"color\" : ' + o.color.getHex() + ',',\n\t\t\t\t'\t\"intensity\" : ' + o.intensity + ',',\n\t\t\t\t'\t\"direction\" : ' + Vector3String( o.position ) + ',',\n\t\t\t\t'\t\"target\" : ' + LabelString( getObjectName( o.target ) ) + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else if ( o instanceof THREE.PointLight ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"PointLight\",',\n\t\t\t\t'\t\"color\" : ' + o.color.getHex() + ',',\n\t\t\t\t'\t\"intensity\" : ' + o.intensity + ',',\n\t\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ',',\n\t\t\t\t'\t\"distance\" : ' + o.distance + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else if ( o instanceof THREE.SpotLight ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"SpotLight\",',\n\t\t\t\t'\t\"color\" : ' + o.color.getHex() + ',',\n\t\t\t\t'\t\"intensity\" : ' + o.intensity + ',',\n\t\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ',',\n\t\t\t\t'\t\"distance\" : ' + o.distance + ',',\n\t\t\t\t'\t\"angle\" : ' + o.angle + ',',\n\t\t\t\t'\t\"exponent\" : ' + o.exponent + ',',\n\t\t\t\t'\t\"target\" : ' + LabelString( getObjectName( o.target ) ) + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else if ( o instanceof THREE.HemisphereLight ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"HemisphereLight\",',\n\t\t\t\t'\t\"skyColor\" : ' + o.color.getHex() + ',',\n\t\t\t\t'\t\"groundColor\" : ' + o.groundColor.getHex() + ',',\n\t\t\t\t'\t\"intensity\" : ' + o.intensity + ',',\n\t\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tvar output = [];\n\n\t\t\t}\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t', n );\n\n\t\t}\n\n\t\tfunction CameraString( o, n ) {\n\n\t\t\tif ( o instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"PerspectiveCamera\",',\n\t\t\t\t'\t\"fov\" : ' + o.fov + ',',\n\t\t\t\t'\t\"aspect\" : ' + o.aspect + ',',\n\t\t\t\t'\t\"near\" : ' + o.near + ',',\n\t\t\t\t'\t\"far\" : ' + o.far + ',',\n\t\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else if ( o instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t\t'\t\"type\" : \"OrthographicCamera\",',\n\t\t\t\t'\t\"left\" : ' + o.left + ',',\n\t\t\t\t'\t\"right\" : ' + o.right + ',',\n\t\t\t\t'\t\"top\" : ' + o.top + ',',\n\t\t\t\t'\t\"bottom\" : ' + o.bottom + ',',\n\t\t\t\t'\t\"near\" : ' + o.near + ',',\n\t\t\t\t'\t\"far\" : ' + o.far + ',',\n\t\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ( o.children.length ? ',' : '' )\n\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tvar output = [];\n\n\t\t\t}\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t', n );\n\n\t\t}\n\n\t\tfunction ObjectString( o, n ) {\n\n\t\t\tvar output = [\n\n\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ',',\n\t\t\t'\t\"rotation\" : ' + Vector3String( o.rotation ) + ',',\n\t\t\t'\t\"scale\"\t : ' + Vector3String( o.scale ) + ',',\n\t\t\t'\t\"visible\" : ' + o.visible + ( o.children.length ? ',' : '' )\n\n\t\t\t];\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t', n );\n\n\t\t}\n\n\t\tfunction MeshString( o, n ) {\n\n\t\t\tvar output = [\n\n\t\t\t'\\t\\t' + LabelString( getObjectName( o ) ) + ' : {',\n\t\t\t'\t\"geometry\" : ' + LabelString( getGeometryName( o.geometry ) ) + ',',\n\t\t\t'\t\"material\" : ' + LabelString( getMaterialName( o.material ) ) + ',',\n\t\t\t'\t\"position\" : ' + Vector3String( o.position ) + ',',\n\t\t\t'\t\"rotation\" : ' + Vector3String( o.rotation ) + ',',\n\t\t\t'\t\"scale\"\t : ' + Vector3String( o.scale ) + ',',\n\t\t\t'\t\"visible\" : ' + o.visible + ( o.children.length ? ',' : '' )\n\n\t\t\t];\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t', n );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction GeometryString( g ) {\n\n\t\t\tif ( g instanceof THREE.SphereGeometry ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getGeometryName( g ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"sphere\",',\n\t\t\t\t'\t\"radius\" : ' \t\t + g.radius + ',',\n\t\t\t\t'\t\"widthSegments\" : ' + g.widthSegments + ',',\n\t\t\t\t'\t\"heightSegments\" : ' + g.heightSegments,\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( g instanceof THREE.BoxGeometry ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getGeometryName( g ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"cube\",',\n\t\t\t\t'\t\"width\" : ' + g.width + ',',\n\t\t\t\t'\t\"height\" : ' + g.height + ',',\n\t\t\t\t'\t\"depth\" : ' + g.depth + ',',\n\t\t\t\t'\t\"widthSegments\" : ' + g.widthSegments + ',',\n\t\t\t\t'\t\"heightSegments\" : ' + g.heightSegments + ',',\n\t\t\t\t'\t\"depthSegments\" : ' + g.depthSegments,\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( g instanceof THREE.PlaneGeometry ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getGeometryName( g ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"plane\",',\n\t\t\t\t'\t\"width\" : ' + g.width + ',',\n\t\t\t\t'\t\"height\" : ' + g.height + ',',\n\t\t\t\t'\t\"widthSegments\" : ' + g.widthSegments + ',',\n\t\t\t\t'\t\"heightSegments\" : ' + g.heightSegments,\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( g instanceof THREE.Geometry ) {\n\n\t\t\t\tif ( g.sourceType === \"ascii\" || g.sourceType === \"ctm\" || g.sourceType === \"stl\" || g.sourceType === \"vtk\" ) {\n\n\t\t\t\t\tvar output = [\n\n\t\t\t\t\t'\\t' + LabelString( getGeometryName( g ) ) + ': {',\n\t\t\t\t\t'\t\"type\" : ' + LabelString( g.sourceType ) + ',',\n\t\t\t\t\t'\t\"url\" : ' + LabelString( g.sourceFile ),\n\t\t\t\t\t'}'\n\n\t\t\t\t\t];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar output = [];\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar output = [];\n\n\t\t\t}\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t' );\n\n\t\t}\n\n\t\tfunction MaterialString( m ) {\n\n\t\t\tif ( m instanceof THREE.MeshBasicMaterial ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getMaterialName( m ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"MeshBasicMaterial\",',\n\t\t\t\t'\t\"parameters\" : {',\n\t\t\t\t'\t\t\"color\" : ' \t+ m.color.getHex() + ',',\n\n\t\t\t\tm.map ? \t\t'\t\t\"map\" : ' + LabelString( getTextureName( m.map ) ) + ',' : '',\n\t\t\t\tm.envMap ? \t\t'\t\t\"envMap\" : ' + LabelString( getTextureName( m.envMap ) ) + ',' : '',\n\t\t\t\tm.specularMap ? '\t\t\"specularMap\" : ' + LabelString( getTextureName( m.specularMap ) ) + ',' : '',\n\t\t\t\tm.lightMap ? \t'\t\t\"lightMap\" : ' + LabelString( getTextureName( m.lightMap ) ) + ',' : '',\n\n\t\t\t\t'\t\t\"reflectivity\" : ' + m.reflectivity + ',',\n\t\t\t\t'\t\t\"transparent\" : ' + m.transparent + ',',\n\t\t\t\t'\t\t\"opacity\" : ' \t+ m.opacity + ',',\n\t\t\t\t'\t\t\"wireframe\" : ' + m.wireframe + ',',\n\t\t\t\t'\t\t\"wireframeLinewidth\" : ' + m.wireframeLinewidth,\n\t\t\t\t'\t}',\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\n\t\t\t} else if ( m instanceof THREE.MeshLambertMaterial ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getMaterialName( m ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"MeshLambertMaterial\",',\n\t\t\t\t'\t\"parameters\" : {',\n\t\t\t\t'\t\t\"color\" : ' \t+ m.color.getHex() + ',',\n\t\t\t\t'\t\t\"ambient\" : ' \t+ m.ambient.getHex() + ',',\n\t\t\t\t'\t\t\"emissive\" : ' + m.emissive.getHex() + ',',\n\n\t\t\t\tm.map ? \t\t'\t\t\"map\" : ' + LabelString( getTextureName( m.map ) ) + ',' : '',\n\t\t\t\tm.envMap ? \t\t'\t\t\"envMap\" : ' + LabelString( getTextureName( m.envMap ) ) + ',' : '',\n\t\t\t\tm.specularMap ? '\t\t\"specularMap\" : ' + LabelString( getTextureName( m.specularMap ) ) + ',' : '',\n\t\t\t\tm.lightMap ? \t'\t\t\"lightMap\" : ' + LabelString( getTextureName( m.lightMap ) ) + ',' : '',\n\n\t\t\t\t'\t\t\"reflectivity\" : ' + m.reflectivity + ',',\n\t\t\t\t'\t\t\"transparent\" : ' + m.transparent + ',',\n\t\t\t\t'\t\t\"opacity\" : ' \t+ m.opacity + ',',\n\t\t\t\t'\t\t\"wireframe\" : ' + m.wireframe + ',',\n\t\t\t\t'\t\t\"wireframeLinewidth\" : ' + m.wireframeLinewidth,\n\t\t\t\t'\t}',\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( m instanceof THREE.MeshPhongMaterial ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getMaterialName( m ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"MeshPhongMaterial\",',\n\t\t\t\t'\t\"parameters\" : {',\n\t\t\t\t'\t\t\"color\" : ' \t+ m.color.getHex() + ',',\n\t\t\t\t'\t\t\"ambient\" : ' \t+ m.ambient.getHex() + ',',\n\t\t\t\t'\t\t\"emissive\" : ' + m.emissive.getHex() + ',',\n\t\t\t\t'\t\t\"specular\" : ' + m.specular.getHex() + ',',\n\t\t\t\t'\t\t\"shininess\" : ' + m.shininess + ',',\n\n\t\t\t\tm.map ? \t\t'\t\t\"map\" : ' + LabelString( getTextureName( m.map ) ) + ',' : '',\n\t\t\t\tm.envMap ? \t\t'\t\t\"envMap\" : ' + LabelString( getTextureName( m.envMap ) ) + ',' : '',\n\t\t\t\tm.specularMap ? '\t\t\"specularMap\" : ' + LabelString( getTextureName( m.specularMap ) ) + ',' : '',\n\t\t\t\tm.lightMap ? \t'\t\t\"lightMap\" : ' + LabelString( getTextureName( m.lightMap ) ) + ',' : '',\n\t\t\t\tm.normalMap ? \t'\t\t\"normalMap\" : ' + LabelString( getTextureName( m.normalMap ) ) + ',' : '',\n\t\t\t\tm.bumpMap ? \t'\t\t\"bumpMap\" : ' + LabelString( getTextureName( m.bumpMap ) ) + ',' : '',\n\n\t\t\t\t'\t\t\"bumpScale\" : ' + m.bumpScale + ',',\n\t\t\t\t'\t\t\"reflectivity\" : ' + m.reflectivity + ',',\n\t\t\t\t'\t\t\"transparent\" : ' + m.transparent + ',',\n\t\t\t\t'\t\t\"opacity\" : ' \t+ m.opacity + ',',\n\t\t\t\t'\t\t\"wireframe\" : ' + m.wireframe + ',',\n\t\t\t\t'\t\t\"wireframeLinewidth\" : ' + m.wireframeLinewidth,\n\t\t\t\t'\t}',\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( m instanceof THREE.MeshDepthMaterial ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getMaterialName( m ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"MeshDepthMaterial\",',\n\t\t\t\t'\t\"parameters\" : {',\n\t\t\t\t'\t\t\"transparent\" : ' + m.transparent + ',',\n\t\t\t\t'\t\t\"opacity\" : ' \t+ m.opacity + ',',\n\t\t\t\t'\t\t\"wireframe\" : ' + m.wireframe + ',',\n\t\t\t\t'\t\t\"wireframeLinewidth\" : ' + m.wireframeLinewidth,\n\t\t\t\t'\t}',\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( m instanceof THREE.MeshNormalMaterial ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getMaterialName( m ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"MeshNormalMaterial\",',\n\t\t\t\t'\t\"parameters\" : {',\n\t\t\t\t'\t\t\"transparent\" : ' + m.transparent + ',',\n\t\t\t\t'\t\t\"opacity\" : ' \t+ m.opacity + ',',\n\t\t\t\t'\t\t\"wireframe\" : ' + m.wireframe + ',',\n\t\t\t\t'\t\t\"wireframeLinewidth\" : ' + m.wireframeLinewidth,\n\t\t\t\t'\t}',\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( m instanceof THREE.MeshFaceMaterial ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getMaterialName( m ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"MeshFaceMaterial\",',\n\t\t\t\t'\t\"parameters\" : {}',\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t' );\n\n\t\t}\n\n\t\tfunction TextureString( t ) {\n\n\t\t\t// here would be also an option to use data URI\n\t\t\t// with embedded image from \"t.image.src\"\n\t\t\t// (that's a side effect of using FileReader to load images)\n\n\t\t\tvar output = [\n\n\t\t\t'\\t' + LabelString( getTextureName( t ) ) + ': {',\n\t\t\t'\t\"url\" : \"' + t.sourceFile + '\",',\n\t\t\t'\t\"repeat\" : ' + Vector2String( t.repeat ) + ',',\n\t\t\t'\t\"offset\" : ' + Vector2String( t.offset ) + ',',\n\t\t\t'\t\"magFilter\" : ' + NumConstantString( t.magFilter ) + ',',\n\t\t\t'\t\"minFilter\" : ' + NumConstantString( t.minFilter ) + ',',\n\t\t\t'\t\"anisotropy\" : ' + t.anisotropy,\n\t\t\t'}'\n\n\t\t\t];\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t' );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction FogString( f ) {\n\n\t\t\tif ( f instanceof THREE.Fog ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getFogName( f ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"linear\",',\n\t\t\t\t'\t\"color\" : ' + ColorString( f.color ) + ',',\n\t\t\t\t'\t\"near\" : ' + f.near + ',',\n\t\t\t\t'\t\"far\" : ' + f.far,\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else if ( f instanceof THREE.FogExp2 ) {\n\n\t\t\t\tvar output = [\n\n\t\t\t\t'\\t' + LabelString( getFogName( f ) ) + ': {',\n\t\t\t\t'\t\"type\" : \"exp2\",',\n\t\t\t\t'\t\"color\" : ' + ColorString( f.color ) + ',',\n\t\t\t\t'\t\"density\" : ' + f.density,\n\t\t\t\t'}'\n\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tvar output = [];\n\n\t\t\t}\n\n\t\t\treturn generateMultiLineString( output, '\\n\\t\\t' );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction generateMultiLineString( lines, separator, padding ) {\n\n\t\t\tvar cleanLines = [];\n\n\t\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\tvar line = lines[ i ];\n\n\t\t\t\tif ( line ) {\n\n\t\t\t\t\tif ( padding ) line = PaddingString( padding ) + line;\n\t\t\t\t\tcleanLines.push( line );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn cleanLines.join( separator );\n\n\t\t}\n\n\t\tfunction getObjectName( o ) {\n\n\t\t\treturn o.name ? o.name : \"Object_\" + o.id;\n\n\t\t}\n\n\t\tfunction getGeometryName( g ) {\n\n\t\t\treturn g.name ? g.name : \"Geometry_\" + g.id;\n\n\t\t}\n\n\t\tfunction getMaterialName( m ) {\n\n\t\t\treturn m.name ? m.name : \"Material_\" + m.id;\n\n\t\t}\n\n\t\tfunction getTextureName( t ) {\n\n\t\t\treturn t.name ? t.name : \"Texture_\" + t.id;\n\n\t\t}\n\n\t\tfunction getFogName( f ) {\n\n\t\t\treturn f.name ? f.name : \"Default fog\";\n\n\t\t}\n\n\t\t//\n\n\t\tvar output = [\n\t\t\t'{',\n\t\t\t'\t\"metadata\": {',\n\t\t\t'\t\t\"formatVersion\" : 3.2,',\n\t\t\t'\t\t\"type\"\t\t: \"scene\",',\n\t\t\t'\t\t\"generatedBy\"\t: \"SceneExporter\",',\n\t\t\t'\t\t\"objects\" : ' + nobjects + ',',\n\t\t\t'\t\t\"geometries\" : ' + ngeometries + ',',\n\t\t\t'\t\t\"materials\" : ' + nmaterials + ',',\n\t\t\t'\t\t\"textures\" : ' + ntextures,\n\t\t\t'\t},',\n\t\t\t'',\n\t\t\t'\t\"urlBaseType\": \"relativeToScene\",',\n\t\t\t'',\n\n\t\t\t'\t\"objects\" :',\n\t\t\t'\t{',\n\t\t\tobjects,\n\t\t\t'\t},',\n\t\t\t'',\n\n\t\t\t'\t\"geometries\" :',\n\t\t\t'\t{',\n\t\t\t'\\t' + \tgeometries,\n\t\t\t'\t},',\n\t\t\t'',\n\n\t\t\t'\t\"materials\" :',\n\t\t\t'\t{',\n\t\t\t'\\t' + \tmaterials,\n\t\t\t'\t},',\n\t\t\t'',\n\n\t\t\t'\t\"textures\" :',\n\t\t\t'\t{',\n\t\t\t'\\t' + \ttextures,\n\t\t\t'\t},',\n\t\t\t'',\n\n\t\t\t'\t\"fogs\" :',\n\t\t\t'\t{',\n\t\t\t'\\t' + \tfogs,\n\t\t\t'\t},',\n\t\t\t'',\n\n\t\t\t'\t\"transform\" :',\n\t\t\t'\t{',\n\t\t\t'\t\t\"position\" : ' + position + ',',\n\t\t\t'\t\t\"rotation\" : ' + rotation + ',',\n\t\t\t'\t\t\"scale\" : ' + scale,\n\t\t\t'\t},',\n\t\t\t'',\n\t\t\t'\t\"defaults\" :',\n\t\t\t'\t{',\n\t\t\t'\t\t\"camera\" : ' + defcamera + ',',\n\t\t\t'\t\t\"fog\" \t : ' + deffog,\n\t\t\t'\t}',\n\t\t\t'}'\n\t\t].join( '\\n' );\n\n\t\treturn JSON.parse( output );\n\n\t}\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/HTMLExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/HTMLExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.HTMLExporter = function () {};\n\nTHREE.HTMLExporter.prototype = {\n\n\tconstructor: THREE.HTMLExporter,\n\n\tparse: function ( scene ) {\n\n\t\treturn output;\n\n\t}\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/STLBinaryExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/STLBinaryExporter.js",
"module-type": "library",
"text": "/**\n * @author kovacsv / http://kovacsv.hu/\n * @author mrdoob / http://mrdoob.com/\n * @author mudcube / http://mudcu.be/\n */\n \nTHREE.STLBinaryExporter = function () {};\n\nTHREE.STLBinaryExporter.prototype = {\n\n\tconstructor: THREE.STLBinaryExporter,\n\n\tparse: ( function () {\n\n\t\tvar vector = new THREE.Vector3();\n\t\tvar normalMatrixWorld = new THREE.Matrix3();\n\n\t\treturn function ( scene ) {\n\n\t\t\tvar triangles = 0;\n\t\t\tscene.traverse( function ( object ) {\n\t\t\t\tif ( !(object instanceof THREE.Mesh) ) return;\n\t\t\t\ttriangles += object.geometry.faces.length;\n\t\t\t});\n\n\t\t\tvar offset = 80; // skip header\n\t\t\tvar bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;\n\t\t\tvar arrayBuffer = new ArrayBuffer(bufferLength);\n\t\t\tvar output = new DataView(arrayBuffer);\n\t\t\toutput.setUint32(offset, triangles, true); offset += 4;\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( !(object instanceof THREE.Mesh) ) return;\n\t\t\t\tif ( !(object.geometry instanceof THREE.Geometry )) return;\n\n\t\t\t\tvar geometry = object.geometry;\n\t\t\t\tvar matrixWorld = object.matrixWorld;\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar faces = geometry.faces;\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( matrixWorld );\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tvector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\toutput.setFloat32(offset, vector.x, true); offset += 4; // normal\n\t\t\t\t\toutput.setFloat32(offset, vector.y, true); offset += 4;\n\t\t\t\t\toutput.setFloat32(offset, vector.z, true); offset += 4;\n\n\t\t\t\t\tvar indices = [ face.a, face.b, face.c ];\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvector.copy( vertices[ indices[ j ] ] ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\toutput.setFloat32(offset, vector.x, true); offset += 4; // vertices\n\t\t\t\t\t\toutput.setFloat32(offset, vector.y, true); offset += 4;\n\t\t\t\t\t\toutput.setFloat32(offset, vector.z, true); offset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.setUint16(offset, 0, true); offset += 2; // attribute byte count\t\t\t\t\t\n\n\t\t\t\t}\n\n\t\t\t} );\n\t\t\t\n\t\t\treturn output;\n\n\t\t};\n\n\t}() )\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/TypedGeometryExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/TypedGeometryExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.TypedGeometryExporter = function () {};\n\nTHREE.TypedGeometryExporter.prototype = {\n\n\tconstructor: THREE.TypedGeometryExporter,\n\n\tparse: function ( geometry ) {\n\n\t\tvar output = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.0,\n\t\t\t\ttype: 'TypedGeometry',\n\t\t\t\tgenerator: 'TypedGeometryExporter'\n\t\t\t}\n\t\t};\n\n\t\tvar attributes = [ 'vertices', 'normals', 'uvs' ];\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\t\t\t\n\t\t\tvar typedArray = geometry[ attribute ];\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0, l = typedArray.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = typedArray[ i ];\n\n\t\t\t}\n\n\t\t\toutput[ attribute ] = array;\n\n\t\t}\n\n\t\tvar boundingSphere = geometry.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\toutput.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t}\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Exporters/GeometryExporter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Exporters/GeometryExporter.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.GeometryExporter = function () {};\n\nTHREE.GeometryExporter.prototype = {\n\n\tconstructor: THREE.GeometryExporter,\n\n\tparse: function ( geometry ) {\n\n\t\tvar output = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.0,\n\t\t\t\ttype: 'geometry',\n\t\t\t\tgenerator: 'GeometryExporter'\n\t\t\t}\n\t\t};\n\n\t\tvar vertices = [];\n\n\t\tfor ( var i = 0; i < geometry.vertices.length; i ++ ) {\n\n\t\t\tvar vertex = geometry.vertices[ i ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tvar faces = [];\n\t\tvar normals = [];\n\t\tvar normalsHash = {};\n\t\tvar colors = [];\n\t\tvar colorsHash = {};\n\t\tvar uvs = [];\n\t\tvar uvsHash = {};\n\n\t\tfor ( var i = 0; i < geometry.faces.length; i ++ ) {\n\n\t\t\tvar face = geometry.faces[ i ];\n\n\t\t\tvar hasMaterial = false; // face.materialIndex !== undefined;\n\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\tvar hasFaceVertexUv = geometry.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\tvar faceType = 0;\n\n\t\t\tfaceType = setBit( faceType, 0, 0 );\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\tfaces.push( faceType );\n\t\t\tfaces.push( face.a, face.b, face.c );\n\n\n\t\t\t/*\n\t\t\tif ( hasMaterial ) {\n\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t}\n\t\t\t*/\n\n\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position) );\n\n\t\t}\n\n\t\tfunction getNormalIndex( normal ) {\n\n\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\treturn normalsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getColorIndex( color ) {\n\n\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\tcolors.push( color.getHex() );\n\n\t\t\treturn colorsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getUvIndex( uv ) {\n\n\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\treturn uvsHash[ hash ];\n\n\t\t}\n\n\t\toutput.vertices = vertices;\n\t\toutput.normals = normals;\n\t\tif ( colors.length > 0 ) output.colors = colors;\n\t\tif ( uvs.length > 0 ) output.uvs = [ uvs ]; // temporal backward compatibility\n\t\toutput.faces = faces;\n\n\t\t//\n\n\t\treturn output;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/BloomPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/BloomPass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.BloomPass = function ( strength, kernelSize, sigma, resolution ) {\n\n\tstrength = ( strength !== undefined ) ? strength : 1;\n\tkernelSize = ( kernelSize !== undefined ) ? kernelSize : 25;\n\tsigma = ( sigma !== undefined ) ? sigma : 4.0;\n\tresolution = ( resolution !== undefined ) ? resolution : 256;\n\n\t// render targets\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat };\n\n\tthis.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\tthis.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );\n\n\t// copy material\n\n\tif ( THREE.CopyShader === undefined )\n\t\tconsole.error( \"THREE.BloomPass relies on THREE.CopyShader\" );\n\n\tvar copyShader = THREE.CopyShader;\n\n\tthis.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );\n\n\tthis.copyUniforms[ \"opacity\" ].value = strength;\n\n\tthis.materialCopy = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.copyUniforms,\n\t\tvertexShader: copyShader.vertexShader,\n\t\tfragmentShader: copyShader.fragmentShader,\n\t\tblending: THREE.AdditiveBlending,\n\t\ttransparent: true\n\n\t} );\n\n\t// convolution material\n\n\tif ( THREE.ConvolutionShader === undefined )\n\t\tconsole.error( \"THREE.BloomPass relies on THREE.ConvolutionShader\" );\n\n\tvar convolutionShader = THREE.ConvolutionShader;\n\n\tthis.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );\n\n\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurx;\n\tthis.convolutionUniforms[ \"cKernel\" ].value = THREE.ConvolutionShader.buildKernel( sigma );\n\n\tthis.materialConvolution = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.convolutionUniforms,\n\t\tvertexShader: convolutionShader.vertexShader,\n\t\tfragmentShader: convolutionShader.fragmentShader,\n\t\tdefines: {\n\t\t\t\"KERNEL_SIZE_FLOAT\": kernelSize.toFixed( 1 ),\n\t\t\t\"KERNEL_SIZE_INT\": kernelSize.toFixed( 0 )\n\t\t}\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.BloomPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t// Render quad with blured scene into texture (convolution pass 1)\n\n\t\tthis.quad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].value = readBuffer;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurX;\n\n\t\trenderer.render( this.scene, this.camera, this.renderTargetX, true );\n\n\n\t\t// Render quad with blured scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ \"tDiffuse\" ].value = this.renderTargetX;\n\t\tthis.convolutionUniforms[ \"uImageIncrement\" ].value = THREE.BloomPass.blurY;\n\n\t\trenderer.render( this.scene, this.camera, this.renderTargetY, true );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tthis.quad.material = this.materialCopy;\n\n\t\tthis.copyUniforms[ \"tDiffuse\" ].value = this.renderTargetY;\n\n\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t}\n\n};\n\nTHREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );\nTHREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/ShaderPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/ShaderPass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function ( shader, textureID ) {\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderToScreen = false;\n\n\tthis.enabled = true;\n\tthis.needsSwap = true;\n\tthis.clear = false;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.ShaderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer;\n\n\t\t}\n\n\t\tthis.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/SavePass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/SavePass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SavePass = function ( renderTarget ) {\n\n\tif ( THREE.CopyShader === undefined )\n\t\tconsole.error( \"THREE.SavePass relies on THREE.CopyShader\" );\n\n\tvar shader = THREE.CopyShader;\n\n\tthis.textureID = \"tDiffuse\";\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.renderTarget = renderTarget;\n\n\tif ( this.renderTarget === undefined ) {\n\n\t\tthis.renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\t\tthis.renderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, this.renderTargetParameters );\n\n\t}\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.clear = false;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.SavePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer;\n\n\t\t}\n\n\t\tthis.quad.material = this.material;\n\n\t\trenderer.render( this.scene, this.camera, this.renderTarget, this.clear );\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/DotScreenPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/DotScreenPass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.DotScreenPass = function ( center, angle, scale ) {\n\n\tif ( THREE.DotScreenShader === undefined )\n\t\tconsole.error( \"THREE.DotScreenPass relies on THREE.DotScreenShader\" );\n\n\tvar shader = THREE.DotScreenShader;\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif ( center !== undefined ) this.uniforms[ \"center\" ].value.copy( center );\n\tif ( angle !== undefined ) this.uniforms[ \"angle\"].value = angle;\n\tif ( scale !== undefined ) this.uniforms[ \"scale\"].value = scale;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.DotScreenPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].value = readBuffer;\n\t\tthis.uniforms[ \"tSize\" ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tthis.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( this.scene, this.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/GlitchPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/GlitchPass.js",
"module-type": "library",
"text": "/**\n \n */\n\nTHREE.GlitchPass = function ( dt_size ) {\n\n\tif ( THREE.DigitalGlitch === undefined ) console.error( \"THREE.GlitchPass relies on THREE.DigitalGlitch\" );\n\t\n\tvar shader = THREE.DigitalGlitch;\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tif(dt_size==undefined) dt_size=64;\n\t\n\t\n\tthis.uniforms[ \"tDisp\"].value=this.generateHeightmap(dt_size);\n\t\n\n\tthis.material = new THREE.ShaderMaterial({\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\t});\n\n\tconsole.log(this.material);\n\t\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\t\n\tthis.goWild=false;\n\tthis.curF=0;\n\tthis.generateTrigger();\n\t\n};\n\nTHREE.GlitchPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) \n\t{\n\t\tthis.uniforms[ \"tDiffuse\" ].value = readBuffer;\n\t\tthis.uniforms[ 'seed' ].value=Math.random();//default seeding\n\t\tthis.uniforms[ 'byp' ].value=0;\n\t\t\n\t\tif(this.curF % this.randX ==0 || this.goWild==true)\n\t\t{\n\t\t\tthis.uniforms[ 'amount' ].value=Math.random()/30;\n\t\t\tthis.uniforms[ 'angle' ].value=THREE.Math.randFloat(-Math.PI,Math.PI);\n\t\t\tthis.uniforms[ 'seed_x' ].value=THREE.Math.randFloat(-1,1);\n\t\t\tthis.uniforms[ 'seed_y' ].value=THREE.Math.randFloat(-1,1);\n\t\t\tthis.uniforms[ 'distortion_x' ].value=THREE.Math.randFloat(0,1);\n\t\t\tthis.uniforms[ 'distortion_y' ].value=THREE.Math.randFloat(0,1);\n\t\t\tthis.curF=0;\n\t\t\tthis.generateTrigger();\n\t\t}\n\t\telse if(this.curF % this.randX <this.randX/5)\n\t\t{\n\t\t\tthis.uniforms[ 'amount' ].value=Math.random()/90;\n\t\t\tthis.uniforms[ 'angle' ].value=THREE.Math.randFloat(-Math.PI,Math.PI);\n\t\t\tthis.uniforms[ 'distortion_x' ].value=THREE.Math.randFloat(0,1);\n\t\t\tthis.uniforms[ 'distortion_y' ].value=THREE.Math.randFloat(0,1);\n\t\t\tthis.uniforms[ 'seed_x' ].value=THREE.Math.randFloat(-0.3,0.3);\n\t\t\tthis.uniforms[ 'seed_y' ].value=THREE.Math.randFloat(-0.3,0.3);\n\t\t}\n\t\telse if(this.goWild==false)\n\t\t{\n\t\t\tthis.uniforms[ 'byp' ].value=1;\n\t\t}\n\t\tthis.curF++;\n\t\t\n\t\tthis.quad.material = this.material;\n\t\tif ( this.renderToScreen ) \n\t\t{\n\t\t\trenderer.render( this.scene, this.camera );\n\t\t} \n\t\telse \n\t\t{\n\t\t\trenderer.render( this.scene, this.camera, writeBuffer, false );\n\t\t}\n\t},\n\tgenerateTrigger:function()\n\t{\n\t\tthis.randX=THREE.Math.randInt(120,240);\n\t},\n\tgenerateHeightmap:function(dt_size)\n\t{\n\t\tvar data_arr = new Float32Array( dt_size*dt_size * 3 );\n\t\tconsole.log(dt_size);\n\t\tvar length=dt_size*dt_size;\n\t\t\n\t\tfor ( var i = 0; i < length; i++) \n\t\t{\n\t\t\tvar val=THREE.Math.randFloat(0,1);\n\t\t\tdata_arr[ i*3 + 0 ] = val;\n\t\t\tdata_arr[ i*3 + 1 ] = val;\n\t\t\tdata_arr[ i*3 + 2 ] = val;\n\t\t}\n\t\t\n\t\tvar texture = new THREE.DataTexture( data_arr, dt_size, dt_size, THREE.RGBFormat, THREE.FloatType );\n\t\tconsole.log(texture);\n\t\tconsole.log(dt_size);\n\t\ttexture.minFilter = THREE.NearestFilter;\n\t\ttexture.magFilter = THREE.NearestFilter;\n\t\ttexture.needsUpdate = true;\n\t\ttexture.flipY = false;\n\t\treturn texture;\n\t}\n};"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/EffectComposer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/EffectComposer.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function ( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tif ( renderTarget === undefined ) {\n\n\t\tvar width = window.innerWidth || 1;\n\t\tvar height = window.innerHeight || 1;\n\t\tvar parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };\n\n\t\trenderTarget = new THREE.WebGLRenderTarget( width, height, parameters );\n\n\t}\n\n\tthis.renderTarget1 = renderTarget;\n\tthis.renderTarget2 = renderTarget.clone();\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\tif ( THREE.CopyShader === undefined )\n\t\tconsole.error( \"THREE.EffectComposer relies on THREE.CopyShader\" );\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.CopyShader );\n\n};\n\nTHREE.EffectComposer.prototype = {\n\n\tswapBuffers: function() {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t},\n\n\tinsertPass: function ( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( !pass.enabled ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\tmaskActive = true;\n\n\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\tmaskActive = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\n\t\t\trenderTarget.width = window.innerWidth;\n\t\t\trenderTarget.height = window.innerHeight;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t},\n\n\tsetSize: function ( width, height ) {\n\n\t\tvar renderTarget = this.renderTarget1.clone();\n\n\t\trenderTarget.width = width;\n\t\trenderTarget.height = height;\n\n\t\tthis.reset( renderTarget );\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/FilmPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/FilmPass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.FilmPass = function ( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {\n\n\tif ( THREE.FilmShader === undefined )\n\t\tconsole.error( \"THREE.FilmPass relies on THREE.FilmShader\" );\n\n\tvar shader = THREE.FilmShader;\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tif ( grayscale !== undefined )\tthis.uniforms.grayscale.value = grayscale;\n\tif ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;\n\tif ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;\n\tif ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;\n\n\tthis.enabled = true;\n\tthis.renderToScreen = false;\n\tthis.needsSwap = true;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.FilmPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.uniforms[ \"tDiffuse\" ].value = readBuffer;\n\t\tthis.uniforms[ \"time\" ].value += delta;\n\n\t\tthis.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( this.scene, this.camera, writeBuffer, false );\n\n\t\t}\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/RenderPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/RenderPass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/BokehPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/BokehPass.js",
"module-type": "library",
"text": "/**\n * Depth-of-field post-process with bokeh shader\n */\n\n\nTHREE.BokehPass = function ( scene, camera, params ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tvar focus = ( params.focus !== undefined ) ? params.focus : 1.0;\n\tvar aspect = ( params.aspect !== undefined ) ? params.aspect : camera.aspect;\n\tvar aperture = ( params.aperture !== undefined ) ? params.aperture : 0.025;\n\tvar maxblur = ( params.maxblur !== undefined ) ? params.maxblur : 1.0;\n\n\t// render targets\n\n\tvar width = params.width || window.innerWidth || 1;\n\tvar height = params.height || window.innerHeight || 1;\n\n\tthis.renderTargetColor = new THREE.WebGLRenderTarget( width, height, {\n\t\tminFilter: THREE.LinearFilter,\n\t\tmagFilter: THREE.LinearFilter,\n\t\tformat: THREE.RGBFormat\n\t} );\n\n\tthis.renderTargetDepth = this.renderTargetColor.clone();\n\n\t// depth material\n\n\tthis.materialDepth = new THREE.MeshDepthMaterial();\n\n\t// bokeh material\n\n\tif ( THREE.BokehShader === undefined ) {\n\t\tconsole.error( \"THREE.BokehPass relies on THREE.BokehShader\" );\n\t}\n\t\n\tvar bokehShader = THREE.BokehShader;\n\tvar bokehUniforms = THREE.UniformsUtils.clone( bokehShader.uniforms );\n\n\tbokehUniforms[ \"tDepth\" ].value = this.renderTargetDepth;\n\n\tbokehUniforms[ \"focus\" ].value = focus;\n\tbokehUniforms[ \"aspect\" ].value = aspect;\n\tbokehUniforms[ \"aperture\" ].value = aperture;\n\tbokehUniforms[ \"maxblur\" ].value = maxblur;\n\n\tthis.materialBokeh = new THREE.ShaderMaterial({\n\t\tuniforms: bokehUniforms,\n\t\tvertexShader: bokehShader.vertexShader,\n\t\tfragmentShader: bokehShader.fragmentShader\n\t});\n\n\tthis.uniforms = bokehUniforms;\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\tthis.renderToScreen = false;\n\tthis.clear = false;\n\n\tthis.camera2 = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene2 = new THREE.Scene();\n\n\tthis.quad2 = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene2.add( this.quad2 );\n\n};\n\nTHREE.BokehPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tthis.quad2.material = this.materialBokeh;\n\n\t\t// Render depth into texture\n\n\t\tthis.scene.overrideMaterial = this.materialDepth;\n\n\t\trenderer.render( this.scene, this.camera, this.renderTargetDepth, true );\n\n\t\t// Render bokeh composite\n\n\t\tthis.uniforms[ \"tColor\" ].value = readBuffer;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( this.scene2, this.camera2 );\n\n\t\t} else {\n\n\t\t\trenderer.render( this.scene2, this.camera2, writeBuffer, this.clear );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\n\t}\n\n};\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/MaskPass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/MaskPass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MaskPass = function ( scene, camera ) {\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.enabled = true;\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.inverse = false;\n\n};\n\nTHREE.MaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\t// don't update color or depth\n\n\t\tcontext.colorMask( false, false, false, false );\n\t\tcontext.depthMask( false );\n\n\t\t// set up stencil\n\n\t\tvar writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tcontext.enable( context.STENCIL_TEST );\n\t\tcontext.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tcontext.stencilFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tcontext.clearStencil( clearValue );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.render( this.scene, this.camera, readBuffer, this.clear );\n\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t// re-enable update of color and depth\n\n\t\tcontext.colorMask( true, true, true, true );\n\t\tcontext.depthMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tcontext.stencilOp( context.KEEP, context.KEEP, context.KEEP );\n\n\t}\n\n};\n\n\nTHREE.ClearMaskPass = function () {\n\n\tthis.enabled = true;\n\n};\n\nTHREE.ClearMaskPass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tvar context = renderer.context;\n\n\t\tcontext.disable( context.STENCIL_TEST );\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Postprocessing/TexturePass.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Postprocessing/TexturePass.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TexturePass = function ( texture, opacity ) {\n\n\tif ( THREE.CopyShader === undefined )\n\t\tconsole.error( \"THREE.TexturePass relies on THREE.CopyShader\" );\n\n\tvar shader = THREE.CopyShader;\n\n\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\tthis.uniforms[ \"opacity\" ].value = ( opacity !== undefined ) ? opacity : 1.0;\n\tthis.uniforms[ \"tDiffuse\" ].value = texture;\n\n\tthis.material = new THREE.ShaderMaterial( {\n\n\t\tuniforms: this.uniforms,\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader\n\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.TexturePass.prototype = {\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta ) {\n\n\t\tthis.quad.material = this.material;\n\n\t\trenderer.render( this.scene, this.camera, readBuffer );\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/ShaderToon.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ShaderToon.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * ShaderToon currently contains:\n *\n *\ttoon1\n *\ttoon2\n *\thatching\n *\tdotted\n */\n\nTHREE.ShaderToon = {\n\n'toon1' : {\n\n\tuniforms: {\n\n\t\t\"uDirLightPos\":\t{ type: \"v3\", value: new THREE.Vector3() },\n\t\t\"uDirLightColor\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\n\t\t\"uAmbientLightColor\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\n\t\t\"uBaseColor\": { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec3 vNormal;\",\n\t\t\"varying vec3 vRefract;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec3 worldNormal = normalize ( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );\",\n\n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\t\"vec3 I = worldPosition.xyz - cameraPosition;\",\n\t\t\t\"vRefract = refract( normalize( I ), worldNormal, 1.02 );\",\n\n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform vec3 uBaseColor;\",\n\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"varying vec3 vRefract;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\n\t\t\t\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\n\t\t\t\"intensity += length(lightWeighting) * 0.2;\",\n\n\t\t\t\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\n\t\t\t\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\n\t\t\t\"intensity = intensity * 0.2 + 0.3;\",\n\n\t\t\t\"if ( intensity < 0.50 ) {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\n\n\t\t\t\"} else {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n},\n\n'toon2' : {\n\n\tuniforms: {\n\n\t\t\"uDirLightPos\":\t{ type: \"v3\", value: new THREE.Vector3() },\n\t\t\"uDirLightColor\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\n\t\t\"uAmbientLightColor\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\n\t\t\"uBaseColor\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\t\t\"uLineColor1\": { type: \"c\", value: new THREE.Color( 0x808080 ) },\n\t\t\"uLineColor2\": { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\"uLineColor3\": { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\"uLineColor4\": { type: \"c\", value: new THREE.Color( 0x000000 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\"uniform vec3 uLineColor1;\",\n\t\t\"uniform vec3 uLineColor2;\",\n\t\t\"uniform vec3 uLineColor3;\",\n\t\t\"uniform vec3 uLineColor4;\",\n\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"float camera = max( dot( normalize( vNormal ), vec3( 0.0, 0.0, 1.0 ) ), 0.4);\",\n\t\t\t\"float light = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\n\n\t\t\t\"gl_FragColor = vec4( uBaseColor, 1.0 );\",\n\n\t\t\t\"if ( length(uAmbientLightColor + uDirLightColor * light) < 1.00 ) {\",\n\n\t\t\t\t\"gl_FragColor *= vec4( uLineColor1, 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"if ( length(uAmbientLightColor + uDirLightColor * camera) < 0.50 ) {\",\n\n\t\t\t\t\"gl_FragColor *= vec4( uLineColor2, 1.0 );\",\n\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n},\n\n'hatching' : {\n\n\tuniforms: {\n\n\t\t\"uDirLightPos\":\t{ type: \"v3\", value: new THREE.Vector3() },\n\t\t\"uDirLightColor\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\n\t\t\"uAmbientLightColor\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\n\t\t\"uBaseColor\": { type: \"c\", value: new THREE.Color( 0xffffff ) },\n\t\t\"uLineColor1\": { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\"uLineColor2\": { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\"uLineColor3\": { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\"uLineColor4\": { type: \"c\", value: new THREE.Color( 0x000000 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\"uniform vec3 uLineColor1;\",\n\t\t\"uniform vec3 uLineColor2;\",\n\t\t\"uniform vec3 uLineColor3;\",\n\t\t\"uniform vec3 uLineColor4;\",\n\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\n\t\t\t\"gl_FragColor = vec4( uBaseColor, 1.0 );\",\n\n\t\t\t\"if ( length(lightWeighting) < 1.00 ) {\",\n\n\t\t\t\t\"if ( mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( uLineColor1, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t\t\"if ( length(lightWeighting) < 0.75 ) {\",\n\n\t\t\t\t\"if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( uLineColor2, 1.0 );\",\n\n\t\t\t\t\"}\",\n\t\t\t\"}\",\n\n\t\t\t\"if ( length(lightWeighting) < 0.50 ) {\",\n\n\t\t\t\t\"if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( uLineColor3, 1.0 );\",\n\n\t\t\t\t\"}\",\n\t\t\t\"}\",\n\n\t\t\t\"if ( length(lightWeighting) < 0.3465 ) {\",\n\n\t\t\t\t\"if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( uLineColor4, 1.0 );\",\n\n\t\t\t\t\"}\",\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n},\n\n'dotted' : {\n\n\tuniforms: {\n\n\t\t\"uDirLightPos\":\t{ type: \"v3\", value: new THREE.Vector3() },\n\t\t\"uDirLightColor\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\n\t\t\"uAmbientLightColor\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\n\t\t\"uBaseColor\": { type: \"c\", value: new THREE.Color( 0xffffff ) },\n\t\t\"uLineColor1\": { type: \"c\", value: new THREE.Color( 0x000000 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform vec3 uBaseColor;\",\n\t\t\"uniform vec3 uLineColor1;\",\n\t\t\"uniform vec3 uLineColor2;\",\n\t\t\"uniform vec3 uLineColor3;\",\n\t\t\"uniform vec3 uLineColor4;\",\n\n\t\t\"uniform vec3 uDirLightPos;\",\n\t\t\"uniform vec3 uDirLightColor;\",\n\n\t\t\"uniform vec3 uAmbientLightColor;\",\n\n\t\t\"varying vec3 vNormal;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);\",\n\t\t\t\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\n\n\t\t\t\"gl_FragColor = vec4( uBaseColor, 1.0 );\",\n\n\t\t\t\"if ( length(lightWeighting) < 1.00 ) {\",\n\n\t\t\t\t\"if ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( uLineColor1, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t\t\"if ( length(lightWeighting) < 0.50 ) {\",\n\n\t\t\t\t\"if ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( uLineColor1, 1.0 );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/MarchingCubes.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/MarchingCubes.js",
"module-type": "library",
"text": "/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * Port of greggman's ThreeD version of marching cubes to Three.js\r\n * http://webglsamples.googlecode.com/hg/blob/blob.html\r\n */\r\n\r\nTHREE.MarchingCubes = function ( resolution, material, enableUvs, enableColors ) {\r\n\r\n\tTHREE.ImmediateRenderObject.call( this );\r\n\r\n\tthis.material = material;\r\n\r\n\tthis.enableUvs = enableUvs !== undefined ? enableUvs : false;\r\n\tthis.enableColors = enableColors !== undefined ? enableColors : false;\r\n\r\n\t// functions have to be object properties\r\n\t// prototype functions kill performance\r\n\t// (tested and it was 4x slower !!!)\r\n\r\n\tthis.init = function( resolution ) {\r\n\r\n\t\tthis.resolution = resolution;\r\n\r\n\t\t// parameters\r\n\r\n\t\tthis.isolation = 80.0;\r\n\r\n\t\t// size of field, 32 is pushing it in Javascript :)\r\n\r\n\t\tthis.size = resolution;\r\n\t\tthis.size2 = this.size * this.size;\r\n\t\tthis.size3 = this.size2 * this.size;\r\n\t\tthis.halfsize = this.size / 2.0;\r\n\r\n\t\t// deltas\r\n\r\n\t\tthis.delta = 2.0 / this.size;\r\n\t\tthis.yd = this.size;\r\n\t\tthis.zd = this.size2;\r\n\r\n\t\tthis.field = new Float32Array( this.size3 );\r\n\t\tthis.normal_cache = new Float32Array( this.size3 * 3 );\r\n\r\n\t\t// temp buffers used in polygonize\r\n\r\n\t\tthis.vlist = new Float32Array( 12 * 3 );\r\n\t\tthis.nlist = new Float32Array( 12 * 3 );\r\n\r\n\t\tthis.firstDraw = true;\r\n\r\n\t\t// immediate render mode simulator\r\n\r\n\t\tthis.maxCount = 4096; // TODO: find the fastest size for this buffer\r\n\t\tthis.count = 0;\r\n\r\n\t\tthis.hasPositions = false;\r\n\t\tthis.hasNormals = false;\r\n\t\tthis.hasColors = false;\r\n\t\tthis.hasUvs = false;\r\n\r\n\t\tthis.positionArray = new Float32Array( this.maxCount * 3 );\r\n\t\tthis.normalArray = new Float32Array( this.maxCount * 3 );\r\n\r\n\t\tif ( this.enableUvs ) {\r\n\r\n\t\t\tthis.uvArray = new Float32Array( this.maxCount * 2 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.enableColors ) {\r\n\r\n\t\t\tthis.colorArray = new Float32Array( this.maxCount * 3 );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t///////////////////////\r\n\t// Polygonization\r\n\t///////////////////////\r\n\r\n\tthis.lerp = function( a, b, t ) { return a + ( b - a ) * t; };\r\n\r\n\tthis.VIntX = function( q, pout, nout, offset, isol, x, y, z, valp1, valp2 ) {\r\n\r\n\t\tvar mu = ( isol - valp1 ) / ( valp2 - valp1 ),\r\n\t\tnc = this.normal_cache;\r\n\r\n\t\tpout[ offset ] \t = x + mu * this.delta;\r\n\t\tpout[ offset + 1 ] = y;\r\n\t\tpout[ offset + 2 ] = z;\r\n\r\n\t\tnout[ offset ] \t = this.lerp( nc[ q ], nc[ q + 3 ], mu );\r\n\t\tnout[ offset + 1 ] = this.lerp( nc[ q + 1 ], nc[ q + 4 ], mu );\r\n\t\tnout[ offset + 2 ] = this.lerp( nc[ q + 2 ], nc[ q + 5 ], mu );\r\n\r\n\t};\r\n\r\n\tthis.VIntY = function( q, pout, nout, offset, isol, x, y, z, valp1, valp2 ) {\r\n\r\n\t\tvar mu = ( isol - valp1 ) / ( valp2 - valp1 ),\r\n\t\tnc = this.normal_cache;\r\n\r\n\t\tpout[ offset ] \t = x;\r\n\t\tpout[ offset + 1 ] = y + mu * this.delta;\r\n\t\tpout[ offset + 2 ] = z;\r\n\r\n\t\tvar q2 = q + this.yd * 3;\r\n\r\n\t\tnout[ offset ] \t = this.lerp( nc[ q ], nc[ q2 ], mu );\r\n\t\tnout[ offset + 1 ] = this.lerp( nc[ q + 1 ], nc[ q2 + 1 ], mu );\r\n\t\tnout[ offset + 2 ] = this.lerp( nc[ q + 2 ], nc[ q2 + 2 ], mu );\r\n\r\n\t};\r\n\r\n\tthis.VIntZ = function( q, pout, nout, offset, isol, x, y, z, valp1, valp2 ) {\r\n\r\n\t\tvar mu = ( isol - valp1 ) / ( valp2 - valp1 ),\r\n\t\tnc = this.normal_cache;\r\n\r\n\t\tpout[ offset ] \t = x;\r\n\t\tpout[ offset + 1 ] = y;\r\n\t\tpout[ offset + 2 ] = z + mu * this.delta;\r\n\r\n\t\tvar q2 = q + this.zd * 3;\r\n\r\n\t\tnout[ offset ] \t = this.lerp( nc[ q ], nc[ q2 ], mu );\r\n\t\tnout[ offset + 1 ] = this.lerp( nc[ q + 1 ], nc[ q2 + 1 ], mu );\r\n\t\tnout[ offset + 2 ] = this.lerp( nc[ q + 2 ], nc[ q2 + 2 ], mu );\r\n\r\n\t};\r\n\r\n\tthis.compNorm = function( q ) {\r\n\r\n\t\tvar q3 = q * 3;\r\n\r\n\t\tif ( this.normal_cache[ q3 ] === 0.0 ) {\r\n\r\n\t\t\tthis.normal_cache[ q3 ] = this.field[ q - 1 ] \t - this.field[ q + 1 ];\r\n\t\t\tthis.normal_cache[ q3 + 1 ] = this.field[ q - this.yd ] - this.field[ q + this.yd ];\r\n\t\t\tthis.normal_cache[ q3 + 2 ] = this.field[ q - this.zd ] - this.field[ q + this.zd ];\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Returns total number of triangles. Fills triangles.\r\n\t// (this is where most of time is spent - it's inner work of O(n3) loop )\r\n\r\n\tthis.polygonize = function( fx, fy, fz, q, isol, renderCallback ) {\r\n\r\n\t\t// cache indices\r\n\t\tvar q1 = q + 1,\r\n\t\t\tqy = q + this.yd,\r\n\t\t\tqz = q + this.zd,\r\n\t\t\tq1y = q1 + this.yd,\r\n\t\t\tq1z = q1 + this.zd,\r\n\t\t\tqyz = q + this.yd + this.zd,\r\n\t\t\tq1yz = q1 + this.yd + this.zd;\r\n\r\n\t\tvar cubeindex = 0,\r\n\t\t\tfield0 = this.field[ q ],\r\n\t\t\tfield1 = this.field[ q1 ],\r\n\t\t\tfield2 = this.field[ qy ],\r\n\t\t\tfield3 = this.field[ q1y ],\r\n\t\t\tfield4 = this.field[ qz ],\r\n\t\t\tfield5 = this.field[ q1z ],\r\n\t\t\tfield6 = this.field[ qyz ],\r\n\t\t\tfield7 = this.field[ q1yz ];\r\n\r\n\t\tif ( field0 < isol ) cubeindex |= 1;\r\n\t\tif ( field1 < isol ) cubeindex |= 2;\r\n\t\tif ( field2 < isol ) cubeindex |= 8;\r\n\t\tif ( field3 < isol ) cubeindex |= 4;\r\n\t\tif ( field4 < isol ) cubeindex |= 16;\r\n\t\tif ( field5 < isol ) cubeindex |= 32;\r\n\t\tif ( field6 < isol ) cubeindex |= 128;\r\n\t\tif ( field7 < isol ) cubeindex |= 64;\r\n\r\n\t\t// if cube is entirely in/out of the surface - bail, nothing to draw\r\n\r\n\t\tvar bits = THREE.edgeTable[ cubeindex ];\r\n\t\tif ( bits === 0 ) return 0;\r\n\r\n\t\tvar d = this.delta,\r\n\t\t\tfx2 = fx + d,\r\n\t\t\tfy2 = fy + d,\r\n\t\t\tfz2 = fz + d;\r\n\r\n\t\t// top of the cube\r\n\r\n\t\tif ( bits & 1 ) {\r\n\r\n\t\t\tthis.compNorm( q );\r\n\t\t\tthis.compNorm( q1 );\r\n\t\t\tthis.VIntX( q * 3, this.vlist, this.nlist, 0, isol, fx, fy, fz, field0, field1 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 2 ) {\r\n\r\n\t\t\tthis.compNorm( q1 );\r\n\t\t\tthis.compNorm( q1y );\r\n\t\t\tthis.VIntY( q1 * 3, this.vlist, this.nlist, 3, isol, fx2, fy, fz, field1, field3 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 4 ) {\r\n\r\n\t\t\tthis.compNorm( qy );\r\n\t\t\tthis.compNorm( q1y );\r\n\t\t\tthis.VIntX( qy * 3, this.vlist, this.nlist, 6, isol, fx, fy2, fz, field2, field3 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 8 ) {\r\n\r\n\t\t\tthis.compNorm( q );\r\n\t\t\tthis.compNorm( qy );\r\n\t\t\tthis.VIntY( q * 3, this.vlist, this.nlist, 9, isol, fx, fy, fz, field0, field2 );\r\n\r\n\t\t};\r\n\r\n\t\t// bottom of the cube\r\n\r\n\t\tif ( bits & 16 ) {\r\n\r\n\t\t\tthis.compNorm( qz );\r\n\t\t\tthis.compNorm( q1z );\r\n\t\t\tthis.VIntX( qz * 3, this.vlist, this.nlist, 12, isol, fx, fy, fz2, field4, field5 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 32 ) {\r\n\r\n\t\t\tthis.compNorm( q1z );\r\n\t\t\tthis.compNorm( q1yz );\r\n\t\t\tthis.VIntY( q1z * 3, this.vlist, this.nlist, 15, isol, fx2, fy, fz2, field5, field7 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 64 ) {\r\n\r\n\t\t\tthis.compNorm( qyz );\r\n\t\t\tthis.compNorm( q1yz );\r\n\t\t\tthis.VIntX( qyz * 3, this.vlist, this.nlist, 18, isol, fx, fy2, fz2, field6, field7 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 128 ) {\r\n\r\n\t\t\tthis.compNorm( qz );\r\n\t\t\tthis.compNorm( qyz );\r\n\t\t\tthis.VIntY( qz * 3, this.vlist, this.nlist, 21, isol, fx, fy, fz2, field4, field6 );\r\n\r\n\t\t};\r\n\r\n\t\t// vertical lines of the cube\r\n\r\n\t\tif ( bits & 256 ) {\r\n\r\n\t\t\tthis.compNorm( q );\r\n\t\t\tthis.compNorm( qz );\r\n\t\t\tthis.VIntZ( q * 3, this.vlist, this.nlist, 24, isol, fx, fy, fz, field0, field4 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 512 ) {\r\n\r\n\t\t\tthis.compNorm( q1 );\r\n\t\t\tthis.compNorm( q1z );\r\n\t\t\tthis.VIntZ( q1 * 3, this.vlist, this.nlist, 27, isol, fx2, fy, fz, field1, field5 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 1024 ) {\r\n\r\n\t\t\tthis.compNorm( q1y );\r\n\t\t\tthis.compNorm( q1yz );\r\n\t\t\tthis.VIntZ( q1y * 3, this.vlist, this.nlist, 30, isol, fx2, fy2, fz, field3, field7 );\r\n\r\n\t\t};\r\n\r\n\t\tif ( bits & 2048 ) {\r\n\r\n\t\t\tthis.compNorm( qy );\r\n\t\t\tthis.compNorm( qyz );\r\n\t\t\tthis.VIntZ( qy * 3, this.vlist, this.nlist, 33, isol, fx, fy2, fz, field2, field6 );\r\n\r\n\t\t};\r\n\r\n\t\tcubeindex <<= 4; // re-purpose cubeindex into an offset into triTable\r\n\r\n\t\tvar o1, o2, o3, numtris = 0, i = 0;\r\n\r\n\t\t// here is where triangles are created\r\n\r\n\t\twhile ( THREE.triTable[ cubeindex + i ] != -1 ) {\r\n\r\n\t\t\to1 = cubeindex + i;\r\n\t\t\to2 = o1 + 1;\r\n\t\t\to3 = o1 + 2;\r\n\r\n\t\t\tthis.posnormtriv( this.vlist, this.nlist,\r\n\t\t\t\t\t\t\t 3 * THREE.triTable[ o1 ],\r\n\t\t\t\t\t\t\t 3 * THREE.triTable[ o2 ],\r\n\t\t\t\t\t\t\t 3 * THREE.triTable[ o3 ],\r\n\t\t\t\t\t\t\t renderCallback );\r\n\r\n\t\t\ti += 3;\r\n\t\t\tnumtris ++;\r\n\r\n\t\t}\r\n\r\n\t\treturn numtris;\r\n\r\n\t};\r\n\r\n\t/////////////////////////////////////\r\n\t// Immediate render mode simulator\r\n\t/////////////////////////////////////\r\n\r\n\tthis.posnormtriv = function( pos, norm, o1, o2, o3, renderCallback ) {\r\n\r\n\t\tvar c = this.count * 3;\r\n\r\n\t\t// positions\r\n\r\n\t\tthis.positionArray[ c ] \t= pos[ o1 ];\r\n\t\tthis.positionArray[ c + 1 ] = pos[ o1 + 1 ];\r\n\t\tthis.positionArray[ c + 2 ] = pos[ o1 + 2 ];\r\n\r\n\t\tthis.positionArray[ c + 3 ] = pos[ o2 ];\r\n\t\tthis.positionArray[ c + 4 ] = pos[ o2 + 1 ];\r\n\t\tthis.positionArray[ c + 5 ] = pos[ o2 + 2 ];\r\n\r\n\t\tthis.positionArray[ c + 6 ] = pos[ o3 ];\r\n\t\tthis.positionArray[ c + 7 ] = pos[ o3 + 1 ];\r\n\t\tthis.positionArray[ c + 8 ] = pos[ o3 + 2 ];\r\n\r\n\t\t// normals\r\n\r\n\t\tthis.normalArray[ c ] \t = norm[ o1 ];\r\n\t\tthis.normalArray[ c + 1 ] = norm[ o1 + 1 ];\r\n\t\tthis.normalArray[ c + 2 ] = norm[ o1 + 2 ];\r\n\r\n\t\tthis.normalArray[ c + 3 ] = norm[ o2 ];\r\n\t\tthis.normalArray[ c + 4 ] = norm[ o2 + 1 ];\r\n\t\tthis.normalArray[ c + 5 ] = norm[ o2 + 2 ];\r\n\r\n\t\tthis.normalArray[ c + 6 ] = norm[ o3 ];\r\n\t\tthis.normalArray[ c + 7 ] = norm[ o3 + 1 ];\r\n\t\tthis.normalArray[ c + 8 ] = norm[ o3 + 2 ];\r\n\r\n\t\t// uvs\r\n\r\n\t\tif ( this.enableUvs ) {\r\n\r\n\t\t\tvar d = this.count * 2;\r\n\r\n\t\t\tthis.uvArray[ d ] \t = pos[ o1 ];\r\n\t\t\tthis.uvArray[ d + 1 ] = pos[ o1 + 2 ];\r\n\r\n\t\t\tthis.uvArray[ d + 2 ] = pos[ o2 ];\r\n\t\t\tthis.uvArray[ d + 3 ] = pos[ o2 + 2 ];\r\n\r\n\t\t\tthis.uvArray[ d + 4 ] = pos[ o3 ];\r\n\t\t\tthis.uvArray[ d + 5 ] = pos[ o3 + 2 ];\r\n\r\n\t\t}\r\n\r\n\t\t// colors\r\n\r\n\t\tif ( this.enableColors ) {\r\n\r\n\t\t\tthis.colorArray[ c ] \t = pos[ o1 ];\r\n\t\t\tthis.colorArray[ c + 1 ] = pos[ o1 + 1 ];\r\n\t\t\tthis.colorArray[ c + 2 ] = pos[ o1 + 2 ];\r\n\r\n\t\t\tthis.colorArray[ c + 3 ] = pos[ o2 ];\r\n\t\t\tthis.colorArray[ c + 4 ] = pos[ o2 + 1 ];\r\n\t\t\tthis.colorArray[ c + 5 ] = pos[ o2 + 2 ];\r\n\r\n\t\t\tthis.colorArray[ c + 6 ] = pos[ o3 ];\r\n\t\t\tthis.colorArray[ c + 7 ] = pos[ o3 + 1 ];\r\n\t\t\tthis.colorArray[ c + 8 ] = pos[ o3 + 2 ];\r\n\r\n\t\t}\r\n\r\n\t\tthis.count += 3;\r\n\r\n\t\tif ( this.count >= this.maxCount - 3 ) {\r\n\r\n\t\t\tthis.hasPositions = true;\r\n\t\t\tthis.hasNormals = true;\r\n\r\n\t\t\tif ( this.enableUvs ) {\r\n\r\n\t\t\t\tthis.hasUvs = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( this.enableColors ) {\r\n\r\n\t\t\t\tthis.hasColors = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\trenderCallback( this );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.begin = function( ) {\r\n\r\n\t\tthis.count = 0;\r\n\r\n\t\tthis.hasPositions = false;\r\n\t\tthis.hasNormals = false;\r\n\t\tthis.hasUvs = false;\r\n\t\tthis.hasColors = false;\r\n\r\n\t};\r\n\r\n\tthis.end = function( renderCallback ) {\r\n\r\n\t\tif ( this.count === 0 )\r\n\t\t\treturn;\r\n\r\n\t\tfor ( var i = this.count * 3; i < this.positionArray.length; i ++ )\r\n\t\t\tthis.positionArray[ i ] = 0.0;\r\n\r\n\t\tthis.hasPositions = true;\r\n\t\tthis.hasNormals = true;\r\n\r\n\t\tif ( this.enableUvs ) {\r\n\r\n\t\t\tthis.hasUvs = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.enableColors ) {\r\n\r\n\t\t\tthis.hasColors = true;\r\n\r\n\t\t}\r\n\r\n\t\trenderCallback( this );\r\n\r\n\t};\r\n\r\n\t/////////////////////////////////////\r\n\t// Metaballs\r\n\t/////////////////////////////////////\r\n\r\n\t// Adds a reciprocal ball (nice and blobby) that, to be fast, fades to zero after\r\n\t// a fixed distance, determined by strength and subtract.\r\n\r\n\tthis.addBall = function( ballx, bally, ballz, strength, subtract ) {\r\n\r\n\t\t// Let's solve the equation to find the radius:\r\n\t\t// 1.0 / (0.000001 + radius^2) * strength - subtract = 0\r\n\t\t// strength / (radius^2) = subtract\r\n\t\t// strength = subtract * radius^2\r\n\t\t// radius^2 = strength / subtract\r\n\t\t// radius = sqrt(strength / subtract)\r\n\r\n\t\tvar radius = this.size * Math.sqrt( strength / subtract ),\r\n\t\t\tzs = ballz * this.size,\r\n\t\t\tys = bally * this.size,\r\n\t\t\txs = ballx * this.size;\r\n\r\n\t\tvar min_z = Math.floor( zs - radius ); if ( min_z < 1 ) min_z = 1;\r\n\t\tvar max_z = Math.floor( zs + radius ); if ( max_z > this.size - 1 ) max_z = this.size - 1;\r\n\t\tvar min_y = Math.floor( ys - radius ); if ( min_y < 1 ) min_y = 1;\r\n\t\tvar max_y = Math.floor( ys + radius ); if ( max_y > this.size - 1 ) max_y = this.size - 1;\r\n\t\tvar min_x = Math.floor( xs - radius ); if ( min_x < 1 ) min_x = 1;\r\n\t\tvar max_x = Math.floor( xs + radius ); if ( max_x > this.size - 1 ) max_x = this.size - 1;\r\n\r\n\r\n\t\t// Don't polygonize in the outer layer because normals aren't\r\n\t\t// well-defined there.\r\n\r\n\t\tvar x, y, z, y_offset, z_offset, fx, fy, fz, fz2, fy2, val;\r\n\r\n\t\tfor ( z = min_z; z < max_z; z++ ) {\r\n\r\n\t\t\tz_offset = this.size2 * z,\r\n\t\t\tfz = z / this.size - ballz,\r\n\t\t\tfz2 = fz * fz;\r\n\r\n\t\t\tfor ( y = min_y; y < max_y; y++ ) {\r\n\r\n\t\t\t\ty_offset = z_offset + this.size * y;\r\n\t\t\t\tfy = y / this.size - bally;\r\n\t\t\t\tfy2 = fy * fy;\r\n\r\n\t\t\t\tfor ( x = min_x; x < max_x; x++ ) {\r\n\r\n\t\t\t\t\tfx = x / this.size - ballx;\r\n\t\t\t\t\tval = strength / ( 0.000001 + fx*fx + fy2 + fz2 ) - subtract;\r\n\t\t\t\t\tif ( val > 0.0 ) this.field[ y_offset + x ] += val;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.addPlaneX = function( strength, subtract ) {\r\n\r\n\t\tvar x, y, z, xx, val, xdiv, cxy,\r\n\r\n\t\t\t// cache attribute lookups\r\n\t\t\tsize = this.size,\r\n\t\t\tyd = this.yd,\r\n\t\t\tzd = this.zd,\r\n\t\t\tfield = this.field,\r\n\r\n\t\t\tdist = size * Math.sqrt( strength / subtract );\r\n\r\n\t\tif ( dist > size ) dist = size;\r\n\r\n\t\tfor ( x = 0; x < dist; x ++ ) {\r\n\r\n\t\t\txdiv = x / size;\r\n\t\t\txx = xdiv * xdiv;\r\n\t\t\tval = strength / ( 0.0001 + xx ) - subtract;\r\n\r\n\t\t\tif ( val > 0.0 ) {\r\n\r\n\t\t\t\tfor ( y = 0; y < size; y ++ ) {\r\n\r\n\t\t\t\t\tcxy = x + y * yd;\r\n\r\n\t\t\t\t\tfor ( z = 0; z < size; z ++ ) {\r\n\r\n\t\t\t\t\t\tfield[ zd * z + cxy ] += val;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.addPlaneY = function( strength, subtract ) {\r\n\r\n\t\tvar x, y, z, yy, val, ydiv, cy, cxy,\r\n\r\n\t\t\t// cache attribute lookups\r\n\t\t\tsize = this.size,\r\n\t\t\tyd = this.yd,\r\n\t\t\tzd = this.zd,\r\n\t\t\tfield = this.field,\r\n\r\n\t\t\tdist = size * Math.sqrt( strength / subtract );\r\n\r\n\t\tif ( dist > size ) dist = size;\r\n\r\n\t\tfor ( y = 0; y < dist; y ++ ) {\r\n\r\n\t\t\tydiv = y / size;\r\n\t\t\tyy = ydiv * ydiv;\r\n\t\t\tval = strength / ( 0.0001 + yy ) - subtract;\r\n\r\n\t\t\tif ( val > 0.0 ) {\r\n\r\n\t\t\t\tcy = y * yd;\r\n\r\n\t\t\t\tfor ( x = 0; x < size; x ++ ) {\r\n\r\n\t\t\t\t\tcxy = cy + x;\r\n\r\n\t\t\t\t\tfor ( z = 0; z < size; z ++ )\r\n\t\t\t\t\t\tfield[ zd * z + cxy ] += val;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.addPlaneZ = function( strength, subtract ) {\r\n\r\n\t\tvar x, y, z, zz, val, zdiv, cz, cyz,\r\n\r\n\t\t\t// cache attribute lookups\r\n\t\t\tsize = this.size,\r\n\t\t\tyd = this.yd,\r\n\t\t\tzd = this.zd,\r\n\t\t\tfield = this.field,\r\n\r\n\t\t\tdist = size * Math.sqrt( strength / subtract );\r\n\r\n\t\tif ( dist > size ) dist = size;\r\n\r\n\t\tfor ( z = 0; z < dist; z ++ ) {\r\n\r\n\t\t\tzdiv = z / size;\r\n\t\t\tzz = zdiv * zdiv;\r\n\t\t\tval = strength / ( 0.0001 + zz ) - subtract;\r\n\t\t\tif ( val > 0.0 ) {\r\n\r\n\t\t\t\tcz = zd * z;\r\n\r\n\t\t\t\tfor ( y = 0; y < size; y ++ ) {\r\n\r\n\t\t\t\t\tcyz = cz + y * yd;\r\n\r\n\t\t\t\t\tfor ( x = 0; x < size; x ++ )\r\n\t\t\t\t\t\tfield[ cyz + x ] += val;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t/////////////////////////////////////\r\n\t// Updates\r\n\t/////////////////////////////////////\r\n\r\n\tthis.reset = function() {\r\n\r\n\t\tvar i;\r\n\r\n\t\t// wipe the normal cache\r\n\r\n\t\tfor ( i = 0; i < this.size3; i ++ ) {\r\n\r\n\t\t\tthis.normal_cache[ i * 3 ] = 0.0;\r\n\t\t\tthis.field[ i ] = 0.0;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.render = function( renderCallback ) {\r\n\r\n\t\tthis.begin();\r\n\r\n\t\t// Triangulate. Yeah, this is slow.\r\n\r\n\t\tvar q, x, y, z, fx, fy, fz, y_offset, z_offset, smin2 = this.size - 2;\r\n\r\n\t\tfor ( z = 1; z < smin2; z ++ ) {\r\n\r\n\t\t\tz_offset = this.size2 * z;\r\n\t\t\tfz = ( z - this.halfsize ) / this.halfsize; //+ 1\r\n\r\n\t\t\tfor ( y = 1; y < smin2; y ++ ) {\r\n\r\n\t\t\t\ty_offset = z_offset + this.size * y;\r\n\t\t\t\tfy = ( y - this.halfsize ) / this.halfsize; //+ 1\r\n\r\n\t\t\t\tfor ( x = 1; x < smin2; x ++ ) {\r\n\r\n\t\t\t\t\tfx = ( x - this.halfsize ) / this.halfsize; //+ 1\r\n\t\t\t\t\tq = y_offset + x;\r\n\r\n\t\t\t\t\tthis.polygonize( fx, fy, fz, q, this.isolation, renderCallback );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.end( renderCallback );\r\n\r\n\t};\r\n\r\n\tthis.generateGeometry = function() {\r\n\r\n\t\tvar start = 0, geo = new THREE.Geometry();\r\n\t\tvar normals = [];\r\n\r\n\t\tvar geo_callback = function( object ) {\r\n\r\n\t\t\tvar i, x, y, z, vertex, normal,\r\n\t\t\t\tface, a, b, c, na, nb, nc, nfaces;\r\n\r\n\r\n\t\t\tfor ( i = 0; i < object.count; i ++ ) {\r\n\r\n\t\t\t\ta = i * 3;\r\n\t\t\t\tb = a + 1;\r\n\t\t\t\tc = a + 2;\r\n\r\n\t\t\t\tx = object.positionArray[ a ];\r\n\t\t\t\ty = object.positionArray[ b ];\r\n\t\t\t\tz = object.positionArray[ c ];\r\n\t\t\t\tvertex = new THREE.Vector3( x, y, z );\r\n\r\n\t\t\t\tx = object.normalArray[ a ];\r\n\t\t\t\ty = object.normalArray[ b ];\r\n\t\t\t\tz = object.normalArray[ c ];\r\n\t\t\t\tnormal = new THREE.Vector3( x, y, z );\r\n\t\t\t\tnormal.normalize();\r\n\r\n\t\t\t\tgeo.vertices.push( vertex );\r\n\t\t\t\tnormals.push( normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tnfaces = object.count / 3;\r\n\r\n\t\t\tfor ( i = 0; i < nfaces; i ++ ) {\r\n\r\n\t\t\t\ta = ( start + i ) * 3;\r\n\t\t\t\tb = a + 1;\r\n\t\t\t\tc = a + 2;\r\n\r\n\t\t\t\tna = normals[ a ];\r\n\t\t\t\tnb = normals[ b ];\r\n\t\t\t\tnc = normals[ c ];\r\n\r\n\t\t\t\tface = new THREE.Face3( a, b, c, [ na, nb, nc ] );\r\n\r\n\t\t\t\tgeo.faces.push( face );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tstart += nfaces;\r\n\t\t\tobject.count = 0;\r\n\r\n\t\t};\r\n\r\n\t\tthis.render( geo_callback );\r\n\r\n\t\t// console.log( \"generated \" + geo.faces.length + \" triangles\" );\r\n\r\n\t\treturn geo;\r\n\r\n\t};\r\n\r\n\tthis.init( resolution );\r\n\r\n};\r\n\r\nTHREE.MarchingCubes.prototype = Object.create( THREE.ImmediateRenderObject.prototype );\r\n\r\n\r\n/////////////////////////////////////\r\n// Marching cubes lookup tables\r\n/////////////////////////////////////\r\n\r\n// These tables are straight from Paul Bourke's page:\r\n// http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/\r\n// who in turn got them from Cory Gene Bloyd.\r\n\r\nTHREE.edgeTable = new Int32Array([\r\n0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\r\n0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\r\n0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\r\n0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\r\n0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\r\n0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\r\n0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\r\n0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\r\n0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\r\n0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\r\n0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\r\n0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\r\n0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\r\n0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\r\n0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\r\n0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\r\n0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\r\n0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\r\n0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\r\n0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\r\n0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\r\n0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\r\n0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\r\n0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\r\n0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\r\n0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\r\n0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\r\n0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\r\n0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\r\n0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\r\n0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\r\n0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0])\r\n\r\nTHREE.triTable = new Int32Array([\r\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1,\r\n3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1,\r\n3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1,\r\n3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1,\r\n9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1,\r\n9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1,\r\n2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1,\r\n8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1,\r\n9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1,\r\n4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1,\r\n3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1,\r\n1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1,\r\n4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1,\r\n4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1,\r\n9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1,\r\n5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1,\r\n2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1,\r\n9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1,\r\n0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1,\r\n2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1,\r\n10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1,\r\n4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1,\r\n5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1,\r\n5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1,\r\n9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1,\r\n0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1,\r\n1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1,\r\n10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1,\r\n8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1,\r\n2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1,\r\n7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1,\r\n9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1,\r\n2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1,\r\n11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1,\r\n9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1,\r\n5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1,\r\n11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1,\r\n11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1,\r\n1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1,\r\n9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1,\r\n5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1,\r\n2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1,\r\n0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1,\r\n5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1,\r\n6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1,\r\n3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1,\r\n6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1,\r\n5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1,\r\n1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1,\r\n10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1,\r\n6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1,\r\n8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1,\r\n7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1,\r\n3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1,\r\n5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1,\r\n0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1,\r\n9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1,\r\n8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1,\r\n5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1,\r\n0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1,\r\n6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1,\r\n10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1,\r\n10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1,\r\n8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1,\r\n1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1,\r\n3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1,\r\n0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1,\r\n10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1,\r\n3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1,\r\n6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1,\r\n9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1,\r\n8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1,\r\n3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1,\r\n6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1,\r\n0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1,\r\n10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1,\r\n10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1,\r\n2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1,\r\n7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1,\r\n7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1,\r\n2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1,\r\n1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1,\r\n11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1,\r\n8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1,\r\n0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1,\r\n7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1,\r\n10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1,\r\n2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1,\r\n6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1,\r\n7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1,\r\n2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1,\r\n1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1,\r\n10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1,\r\n10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1,\r\n0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1,\r\n7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1,\r\n6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1,\r\n8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1,\r\n6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1,\r\n4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1,\r\n10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1,\r\n8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1,\r\n0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1,\r\n1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1,\r\n8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1,\r\n10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1,\r\n4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1,\r\n10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1,\r\n5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1,\r\n11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1,\r\n9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1,\r\n6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1,\r\n7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1,\r\n3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1,\r\n7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1,\r\n9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1,\r\n3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1,\r\n6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1,\r\n9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1,\r\n1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1,\r\n4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1,\r\n7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1,\r\n6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1,\r\n3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1,\r\n0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1,\r\n6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1,\r\n0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1,\r\n11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1,\r\n6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1,\r\n5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1,\r\n9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1,\r\n1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1,\r\n1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1,\r\n10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1,\r\n0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1,\r\n5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1,\r\n10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1,\r\n11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1,\r\n9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1,\r\n7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1,\r\n2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1,\r\n8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1,\r\n9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1,\r\n9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1,\r\n1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1,\r\n9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1,\r\n9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1,\r\n5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1,\r\n0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1,\r\n10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1,\r\n2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1,\r\n0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1,\r\n0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1,\r\n9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1,\r\n5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1,\r\n3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1,\r\n5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1,\r\n8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1,\r\n9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1,\r\n0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1,\r\n1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1,\r\n3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1,\r\n4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1,\r\n9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1,\r\n11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1,\r\n11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1,\r\n2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1,\r\n9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1,\r\n3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1,\r\n1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1,\r\n4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1,\r\n4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1,\r\n0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1,\r\n3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1,\r\n3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1,\r\n0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1,\r\n9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1,\r\n1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]);\r\n"
},
"$:/plugins/rboue/Three.js/Lib/Car.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Car.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.Car = function () {\n\n\tvar scope = this;\n\n\t// car geometry manual parameters\n\n\tthis.modelScale = 1;\n\n\tthis.backWheelOffset = 2;\n\n\tthis.autoWheelGeometry = true;\n\n\t// car geometry parameters automatically set from wheel mesh\n\t// \t- assumes wheel mesh is front left wheel in proper global\n\t// position with respect to body mesh\n\t//\t- other wheels are mirrored against car root\n\t//\t- if necessary back wheels can be offset manually\n\n\tthis.wheelOffset = new THREE.Vector3();\n\n\tthis.wheelDiameter = 1;\n\n\t// car \"feel\" parameters\n\n\tthis.MAX_SPEED = 2200;\n\tthis.MAX_REVERSE_SPEED = -1500;\n\n\tthis.MAX_WHEEL_ROTATION = 0.6;\n\n\tthis.FRONT_ACCELERATION = 1250;\n\tthis.BACK_ACCELERATION = 1500;\n\n\tthis.WHEEL_ANGULAR_ACCELERATION = 1.5;\n\n\tthis.FRONT_DECCELERATION = 750;\n\tthis.WHEEL_ANGULAR_DECCELERATION = 1.0;\n\n\tthis.STEERING_RADIUS_RATIO = 0.0023;\n\n\tthis.MAX_TILT_SIDES = 0.05;\n\tthis.MAX_TILT_FRONTBACK = 0.015;\n\n\t// internal control variables\n\n\tthis.speed = 0;\n\tthis.acceleration = 0;\n\n\tthis.wheelOrientation = 0;\n\tthis.carOrientation = 0;\n\n\t// car rigging\n\n\tthis.root = new THREE.Object3D();\n\n\tthis.frontLeftWheelRoot = new THREE.Object3D();\n\tthis.frontRightWheelRoot = new THREE.Object3D();\n\n\tthis.bodyMesh = null;\n\n\tthis.frontLeftWheelMesh = null;\n\tthis.frontRightWheelMesh = null;\n\n\tthis.backLeftWheelMesh = null;\n\tthis.backRightWheelMesh = null;\n\n\tthis.bodyGeometry = null;\n\tthis.wheelGeometry = null;\n\n\tthis.bodyMaterials = null;\n\tthis.wheelMaterials = null;\n\n\t// internal helper variables\n\n\tthis.loaded = false;\n\n\tthis.meshes = [];\n\n\t// API\n\n\tthis.enableShadows = function ( enable ) {\n\n\t\tfor ( var i = 0; i < this.meshes.length; i ++ ) {\n\n\t\t\tthis.meshes[ i ].castShadow = enable;\n\t\t\tthis.meshes[ i ].receiveShadow = enable;\n\n\t\t}\n\n\t};\n\n\tthis.setVisible = function ( enable ) {\n\n\t\tfor ( var i = 0; i < this.meshes.length; i ++ ) {\n\n\t\t\tthis.meshes[ i ].visible = enable;\n\t\t\tthis.meshes[ i ].visible = enable;\n\n\t\t}\n\n\t};\n\n\tthis.loadPartsJSON = function ( bodyURL, wheelURL ) {\n\n\t\tvar loader = new THREE.JSONLoader();\n\n\t\tloader.load( bodyURL, function( geometry, materials ) { createBody( geometry, materials ) } );\n\t\tloader.load( wheelURL, function( geometry, materials ) { createWheels( geometry, materials ) } );\n\n\t};\n\n\tthis.loadPartsBinary = function ( bodyURL, wheelURL ) {\n\n\t\tvar loader = new THREE.BinaryLoader();\n\n\t\tloader.load( bodyURL, function( geometry, materials ) { createBody( geometry, materials ) } );\n\t\tloader.load( wheelURL, function( geometry, materials ) { createWheels( geometry, materials ) } );\n\n\t};\n\n\tthis.updateCarModel = function ( delta, controls ) {\n\n\t\t// speed and wheels based on controls\n\n\t\tif ( controls.moveForward ) {\n\n\t\t\tthis.speed = THREE.Math.clamp( this.speed + delta * this.FRONT_ACCELERATION, this.MAX_REVERSE_SPEED, this.MAX_SPEED );\n\t\t\tthis.acceleration = THREE.Math.clamp( this.acceleration + delta, -1, 1 );\n\n\t\t}\n\n\t\tif ( controls.moveBackward ) {\n\n\n\t\t\tthis.speed = THREE.Math.clamp( this.speed - delta * this.BACK_ACCELERATION, this.MAX_REVERSE_SPEED, this.MAX_SPEED );\n\t\t\tthis.acceleration = THREE.Math.clamp( this.acceleration - delta, -1, 1 );\n\n\t\t}\n\n\t\tif ( controls.moveLeft ) {\n\n\t\t\tthis.wheelOrientation = THREE.Math.clamp( this.wheelOrientation + delta * this.WHEEL_ANGULAR_ACCELERATION, - this.MAX_WHEEL_ROTATION, this.MAX_WHEEL_ROTATION );\n\n\t\t}\n\n\t\tif ( controls.moveRight ) {\n\n\t\t\tthis.wheelOrientation = THREE.Math.clamp( this.wheelOrientation - delta * this.WHEEL_ANGULAR_ACCELERATION, - this.MAX_WHEEL_ROTATION, this.MAX_WHEEL_ROTATION );\n\n\t\t}\n\n\t\t// speed decay\n\n\t\tif ( ! ( controls.moveForward || controls.moveBackward ) ) {\n\n\t\t\tif ( this.speed > 0 ) {\n\n\t\t\t\tvar k = exponentialEaseOut( this.speed / this.MAX_SPEED );\n\n\t\t\t\tthis.speed = THREE.Math.clamp( this.speed - k * delta * this.FRONT_DECCELERATION, 0, this.MAX_SPEED );\n\t\t\t\tthis.acceleration = THREE.Math.clamp( this.acceleration - k * delta, 0, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tvar k = exponentialEaseOut( this.speed / this.MAX_REVERSE_SPEED );\n\n\t\t\t\tthis.speed = THREE.Math.clamp( this.speed + k * delta * this.BACK_ACCELERATION, this.MAX_REVERSE_SPEED, 0 );\n\t\t\t\tthis.acceleration = THREE.Math.clamp( this.acceleration + k * delta, -1, 0 );\n\n\t\t\t}\n\n\n\t\t}\n\n\t\t// steering decay\n\n\t\tif ( ! ( controls.moveLeft || controls.moveRight ) ) {\n\n\t\t\tif ( this.wheelOrientation > 0 ) {\n\n\t\t\t\tthis.wheelOrientation = THREE.Math.clamp( this.wheelOrientation - delta * this.WHEEL_ANGULAR_DECCELERATION, 0, this.MAX_WHEEL_ROTATION );\n\n\t\t\t} else {\n\n\t\t\t\tthis.wheelOrientation = THREE.Math.clamp( this.wheelOrientation + delta * this.WHEEL_ANGULAR_DECCELERATION, - this.MAX_WHEEL_ROTATION, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// car update\n\n\t\tvar forwardDelta = this.speed * delta;\n\n\t\tthis.carOrientation += ( forwardDelta * this.STEERING_RADIUS_RATIO )* this.wheelOrientation;\n\n\t\t// displacement\n\n\t\tthis.root.position.x += Math.sin( this.carOrientation ) * forwardDelta;\n\t\tthis.root.position.z += Math.cos( this.carOrientation ) * forwardDelta;\n\n\t\t// steering\n\n\t\tthis.root.rotation.y = this.carOrientation;\n\n\t\t// tilt\n\n\t\tif ( this.loaded ) {\n\n\t\t\tthis.bodyMesh.rotation.z = this.MAX_TILT_SIDES * this.wheelOrientation * ( this.speed / this.MAX_SPEED );\n\t\t\tthis.bodyMesh.rotation.x = - this.MAX_TILT_FRONTBACK * this.acceleration;\n\n\t\t}\n\n\t\t// wheels rolling\n\n\t\tvar angularSpeedRatio = 1 / ( this.modelScale * ( this.wheelDiameter / 2 ) );\n\n\t\tvar wheelDelta = forwardDelta * angularSpeedRatio;\n\n\t\tif ( this.loaded ) {\n\n\t\t\tthis.frontLeftWheelMesh.rotation.x += wheelDelta;\n\t\t\tthis.frontRightWheelMesh.rotation.x += wheelDelta;\n\t\t\tthis.backLeftWheelMesh.rotation.x += wheelDelta;\n\t\t\tthis.backRightWheelMesh.rotation.x += wheelDelta;\n\n\t\t}\n\n\t\t// front wheels steering\n\n\t\tthis.frontLeftWheelRoot.rotation.y = this.wheelOrientation;\n\t\tthis.frontRightWheelRoot.rotation.y = this.wheelOrientation;\n\n\t};\n\n\t// internal helper methods\n\n\tfunction createBody ( geometry, materials ) {\n\n\t\tscope.bodyGeometry = geometry;\n\t\tscope.bodyMaterials = materials;\n\n\t\tcreateCar();\n\n\t};\n\n\tfunction createWheels ( geometry, materials ) {\n\n\t\tscope.wheelGeometry = geometry;\n\t\tscope.wheelMaterials = materials;\n\n\t\tcreateCar();\n\n\t};\n\n\tfunction createCar () {\n\n\t\tif ( scope.bodyGeometry && scope.wheelGeometry ) {\n\n\t\t\t// compute wheel geometry parameters\n\n\t\t\tif ( scope.autoWheelGeometry ) {\n\n\t\t\t\tscope.wheelGeometry.computeBoundingBox();\n\n\t\t\t\tvar bb = scope.wheelGeometry.boundingBox;\n\n\t\t\t\tscope.wheelOffset.addVectors( bb.min, bb.max );\n\t\t\t\tscope.wheelOffset.multiplyScalar( 0.5 );\n\n\t\t\t\tscope.wheelDiameter = bb.max.y - bb.min.y;\n\n\t\t\t\tscope.wheelGeometry.center();\n\n\t\t\t}\n\n\t\t\t// rig the car\n\n\t\t\tvar s = scope.modelScale,\n\t\t\t\tdelta = new THREE.Vector3();\n\n\t\t\tvar bodyFaceMaterial = new THREE.MeshFaceMaterial( scope.bodyMaterials );\n\t\t\tvar wheelFaceMaterial = new THREE.MeshFaceMaterial( scope.wheelMaterials );\n\n\t\t\t// body\n\n\t\t\tscope.bodyMesh = new THREE.Mesh( scope.bodyGeometry, bodyFaceMaterial );\n\t\t\tscope.bodyMesh.scale.set( s, s, s );\n\n\t\t\tscope.root.add( scope.bodyMesh );\n\n\t\t\t// front left wheel\n\n\t\t\tdelta.multiplyVectors( scope.wheelOffset, new THREE.Vector3( s, s, s ) );\n\n\t\t\tscope.frontLeftWheelRoot.position.add( delta );\n\n\t\t\tscope.frontLeftWheelMesh = new THREE.Mesh( scope.wheelGeometry, wheelFaceMaterial );\n\t\t\tscope.frontLeftWheelMesh.scale.set( s, s, s );\n\n\t\t\tscope.frontLeftWheelRoot.add( scope.frontLeftWheelMesh );\n\t\t\tscope.root.add( scope.frontLeftWheelRoot );\n\n\t\t\t// front right wheel\n\n\t\t\tdelta.multiplyVectors( scope.wheelOffset, new THREE.Vector3( -s, s, s ) );\n\n\t\t\tscope.frontRightWheelRoot.position.add( delta );\n\n\t\t\tscope.frontRightWheelMesh = new THREE.Mesh( scope.wheelGeometry, wheelFaceMaterial );\n\n\t\t\tscope.frontRightWheelMesh.scale.set( s, s, s );\n\t\t\tscope.frontRightWheelMesh.rotation.z = Math.PI;\n\n\t\t\tscope.frontRightWheelRoot.add( scope.frontRightWheelMesh );\n\t\t\tscope.root.add( scope.frontRightWheelRoot );\n\n\t\t\t// back left wheel\n\n\t\t\tdelta.multiplyVectors( scope.wheelOffset, new THREE.Vector3( s, s, -s ) );\n\t\t\tdelta.z -= scope.backWheelOffset;\n\n\t\t\tscope.backLeftWheelMesh = new THREE.Mesh( scope.wheelGeometry, wheelFaceMaterial );\n\n\t\t\tscope.backLeftWheelMesh.position.add( delta );\n\t\t\tscope.backLeftWheelMesh.scale.set( s, s, s );\n\n\t\t\tscope.root.add( scope.backLeftWheelMesh );\n\n\t\t\t// back right wheel\n\n\t\t\tdelta.multiplyVectors( scope.wheelOffset, new THREE.Vector3( -s, s, -s ) );\n\t\t\tdelta.z -= scope.backWheelOffset;\n\n\t\t\tscope.backRightWheelMesh = new THREE.Mesh( scope.wheelGeometry, wheelFaceMaterial );\n\n\t\t\tscope.backRightWheelMesh.position.add( delta );\n\t\t\tscope.backRightWheelMesh.scale.set( s, s, s );\n\t\t\tscope.backRightWheelMesh.rotation.z = Math.PI;\n\n\t\t\tscope.root.add( scope.backRightWheelMesh );\n\n\t\t\t// cache meshes\n\n\t\t\tscope.meshes = [ scope.bodyMesh, scope.frontLeftWheelMesh, scope.frontRightWheelMesh, scope.backLeftWheelMesh, scope.backRightWheelMesh ];\n\n\t\t\t// callback\n\n\t\t\tscope.loaded = true;\n\n\t\t\tif ( scope.callback ) {\n\n\t\t\t\tscope.callback( scope );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tfunction quadraticEaseOut( k ) { return - k * ( k - 2 ); }\n\tfunction cubicEaseOut( k ) { return --k * k * k + 1; }\n\tfunction circularEaseOut( k ) { return Math.sqrt( 1 - --k * k ); }\n\tfunction sinusoidalEaseOut( k ) { return Math.sin( k * Math.PI / 2 ); }\n\tfunction exponentialEaseOut( k ) { return k === 1 ? 1 : - Math.pow( 2, - 10 * k ) + 1; }\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/ShaderSkin.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ShaderSkin.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n */\n\n\nTHREE.ShaderSkin = {\n\n\t/* ------------------------------------------------------------------------------------------\n\t//\tSimple skin shader\n\t//\t\t- per-pixel Blinn-Phong diffuse term mixed with half-Lambert wrap-around term (per color component)\n\t//\t\t- physically based specular term (Kelemen/Szirmay-Kalos specular reflectance)\n\t//\n\t//\t\t- diffuse map\n\t//\t\t- bump map\n\t//\t\t- specular map\n\t//\t\t- point, directional and hemisphere lights (use with \"lights: true\" material option)\n\t//\t\t- fog (use with \"fog: true\" material option)\n\t//\t\t- shadow maps\n\t//\n\t// ------------------------------------------------------------------------------------------ */\n\n\t'skinSimple' : {\n\n\t\tuniforms: THREE.UniformsUtils.merge( [\n\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\n\t\t\tTHREE.UniformsLib[ \"lights\" ],\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ],\n\n\t\t\t{\n\n\t\t\t\"enableBump\"\t: { type: \"i\", value: 0 },\n\t\t\t\"enableSpecular\": { type: \"i\", value: 0 },\n\n\t\t\t\"tDiffuse\"\t: { type: \"t\", value: null },\n\t\t\t\"tBeckmann\"\t: { type: \"t\", value: null },\n\n\t\t\t\"diffuse\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\t\t\t\"specular\": { type: \"c\", value: new THREE.Color( 0x111111 ) },\n\t\t\t\"ambient\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\t\t\t\"opacity\": \t { type: \"f\", value: 1 },\n\n\t\t\t\"uRoughness\": \t \t\t{ type: \"f\", value: 0.15 },\n\t\t\t\"uSpecularBrightness\": \t{ type: \"f\", value: 0.75 },\n\n\t\t\t\"bumpMap\"\t: { type: \"t\", value: null },\n\t\t\t\"bumpScale\" : { type: \"f\", value: 1 },\n\n\t\t\t\"specularMap\" : { type: \"t\", value: null },\n\n\t\t\t\"offsetRepeat\" : { type: \"v4\", value: new THREE.Vector4( 0, 0, 1, 1 ) },\n\n\t\t\t\"uWrapRGB\":\t{ type: \"v3\", value: new THREE.Vector3( 0.75, 0.375, 0.1875 ) }\n\n\t\t\t}\n\n\t\t] ),\n\n\t\tfragmentShader: [\n\n\t\t\t\"#define USE_BUMPMAP\",\n\t\t\t\"#extension GL_OES_standard_derivatives : enable\",\n\n\t\t\t\"uniform bool enableBump;\",\n\t\t\t\"uniform bool enableSpecular;\",\n\n\t\t\t\"uniform vec3 ambient;\",\n\t\t\t\"uniform vec3 diffuse;\",\n\t\t\t\"uniform vec3 specular;\",\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform float uRoughness;\",\n\t\t\t\"uniform float uSpecularBrightness;\",\n\n\t\t\t\"uniform vec3 uWrapRGB;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tBeckmann;\",\n\n\t\t\t\"uniform sampler2D specularMap;\",\n\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"uniform vec3 ambientLightColor;\",\n\n\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"bumpmap_pars_fragment\" ],\n\n\t\t\t// Fresnel term\n\n\t\t\t\"float fresnelReflectance( vec3 H, vec3 V, float F0 ) {\",\n\n\t\t\t\t\"float base = 1.0 - dot( V, H );\",\n\t\t\t\t\"float exponential = pow( base, 5.0 );\",\n\n\t\t\t\t\"return exponential + F0 * ( 1.0 - exponential );\",\n\n\t\t\t\"}\",\n\n\t\t\t// Kelemen/Szirmay-Kalos specular BRDF\n\n\t\t\t\"float KS_Skin_Specular( vec3 N,\", \t\t// Bumped surface normal\n\t\t\t\t\t\t\t\t\t\"vec3 L,\", \t\t// Points to light\n\t\t\t\t\t\t\t\t\t\"vec3 V,\", \t\t// Points to eye\n\t\t\t\t\t\t\t\t\t\"float m,\", \t// Roughness\n\t\t\t\t\t\t\t\t\t\"float rho_s\", \t// Specular brightness\n\t\t\t\t\t\t\t\t\t\") {\",\n\n\t\t\t\t\"float result = 0.0;\",\n\t\t\t\t\"float ndotl = dot( N, L );\",\n\n\t\t\t\t\"if( ndotl > 0.0 ) {\",\n\n\t\t\t\t\t\"vec3 h = L + V;\", // Unnormalized half-way vector\n\t\t\t\t\t\"vec3 H = normalize( h );\",\n\n\t\t\t\t\t\"float ndoth = dot( N, H );\",\n\n\t\t\t\t\t\"float PH = pow( 2.0 * texture2D( tBeckmann, vec2( ndoth, m ) ).x, 10.0 );\",\n\n\t\t\t\t\t\"float F = fresnelReflectance( H, V, 0.028 );\",\n\t\t\t\t\t\"float frSpec = max( PH * F / dot( h, h ), 0.0 );\",\n\n\t\t\t\t\t\"result = ndotl * rho_s * frSpec;\", // BRDF * dot(N,L) * rho_s\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return result;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( 1.0 ), opacity );\",\n\n\t\t\t\t\"vec4 colDiffuse = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"colDiffuse.rgb *= colDiffuse.rgb;\",\n\n\t\t\t\t\"gl_FragColor = gl_FragColor * colDiffuse;\",\n\n\t\t\t\t\"vec3 normal = normalize( vNormal );\",\n\t\t\t\t\"vec3 viewPosition = normalize( vViewPosition );\",\n\n\t\t\t\t\"float specularStrength;\",\n\n\t\t\t\t\"if ( enableSpecular ) {\",\n\n\t\t\t\t\t\"vec4 texelSpecular = texture2D( specularMap, vUv );\",\n\t\t\t\t\t\"specularStrength = texelSpecular.r;\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"specularStrength = 1.0;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"#ifdef USE_BUMPMAP\",\n\n\t\t\t\t\t\"if ( enableBump ) normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// point lights\n\n\t\t\t\t\"vec3 specularTotal = vec3( 0.0 );\",\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec3 pointTotal = vec3( 0.0 );\",\n\n\t\t\t\t\t\"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\n\n\t\t\t\t\t\t\"vec3 lVector = lPosition.xyz + vViewPosition.xyz;\",\n\n\t\t\t\t\t\t\"float lDistance = 1.0;\",\n\n\t\t\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\n\t\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\n\n\t\t\t\t\t\t\"lVector = normalize( lVector );\",\n\n\t\t\t\t\t\t\"float pointDiffuseWeightFull = max( dot( normal, lVector ), 0.0 );\",\n\t\t\t\t\t\t\"float pointDiffuseWeightHalf = max( 0.5 * dot( normal, lVector ) + 0.5, 0.0 );\",\n\t\t\t\t\t\t\"vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), uWrapRGB );\",\n\n\t\t\t\t\t\t\"float pointSpecularWeight = KS_Skin_Specular( normal, lVector, viewPosition, uRoughness, uSpecularBrightness );\",\n\n\t\t\t\t\t\t\"pointTotal += lDistance * diffuse * pointLightColor[ i ] * pointDiffuseWeight;\",\n\t\t\t\t\t\t\"specularTotal += lDistance * specular * pointLightColor[ i ] * pointSpecularWeight * specularStrength;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// directional lights\n\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec3 dirTotal = vec3( 0.0 );\",\n\n\t\t\t\t\t\"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\",\n\n\t\t\t\t\t\t\"vec3 dirVector = normalize( lDirection.xyz );\",\n\n\t\t\t\t\t\t\"float dirDiffuseWeightFull = max( dot( normal, dirVector ), 0.0 );\",\n\t\t\t\t\t\t\"float dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\",\n\t\t\t\t\t\t\"vec3 dirDiffuseWeight = mix( vec3 ( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), uWrapRGB );\",\n\n\t\t\t\t\t\t\"float dirSpecularWeight = KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );\",\n\n\t\t\t\t\t\t\"dirTotal \t += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\",\n\t\t\t\t\t\t\"specularTotal += specular * directionalLightColor[ i ] * dirSpecularWeight * specularStrength;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// hemisphere lights\n\n\t\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec3 hemiTotal = vec3( 0.0 );\",\n\n\t\t\t\t\t\"for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\",\n\t\t\t\t\t\t\"vec3 lVector = normalize( lDirection.xyz );\",\n\n\t\t\t\t\t\t\"float dotProduct = dot( normal, lVector );\",\n\t\t\t\t\t\t\"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\",\n\n\t\t\t\t\t\t\"hemiTotal += diffuse * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\",\n\n\t\t\t\t\t\t// specular (sky light)\n\n\t\t\t\t\t\t\"float hemiSpecularWeight = 0.0;\",\n\t\t\t\t\t\t\"hemiSpecularWeight += KS_Skin_Specular( normal, lVector, viewPosition, uRoughness, uSpecularBrightness );\",\n\n\t\t\t\t\t\t// specular (ground light)\n\n\t\t\t\t\t\t\"vec3 lVectorGround = -lVector;\",\n\t\t\t\t\t\t\"hemiSpecularWeight += KS_Skin_Specular( normal, lVectorGround, viewPosition, uRoughness, uSpecularBrightness );\",\n\n\t\t\t\t\t\t\"specularTotal += specular * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight ) * hemiSpecularWeight * specularStrength;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// all lights contribution summation\n\n\t\t\t\t\"vec3 totalLight = vec3( 0.0 );\",\n\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\t\t\t\t\t\"totalLight += dirTotal;\",\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\t\t\t\t\t\"totalLight += pointTotal;\",\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\n\t\t\t\t\t\"totalLight += hemiTotal;\",\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * ( totalLight + ambientLightColor * ambient ) + specularTotal;\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"linear_to_gamma_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader: [\n\n\t\t\t\"uniform vec4 offsetRepeat;\",\n\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\n\n\t\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\t\t\"vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\n\n\t\t\t\"}\"\n\n\t\t].join( \"\\n\" )\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------\n\t//\tSkin shader\n\t//\t\t- Blinn-Phong diffuse term (using normal + diffuse maps)\n\t//\t\t- subsurface scattering approximation by four blur layers\n\t//\t\t- physically based specular term (Kelemen/Szirmay-Kalos specular reflectance)\n\t//\n\t//\t\t- point and directional lights (use with \"lights: true\" material option)\n\t//\n\t//\t\t- based on Nvidia Advanced Skin Rendering GDC 2007 presentation\n\t//\t\t and GPU Gems 3 Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering\n\t//\n\t//\t\t\thttp://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Skin.pdf\n\t//\t\t\thttp://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html\n\t// ------------------------------------------------------------------------------------------ */\n\n\t'skin' : {\n\n\t\tuniforms: THREE.UniformsUtils.merge( [\n\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\n\t\t\tTHREE.UniformsLib[ \"lights\" ],\n\n\t\t\t{\n\n\t\t\t\"passID\": { type: \"i\", value: 0 },\n\n\t\t\t\"tDiffuse\"\t: { type: \"t\", value: null },\n\t\t\t\"tNormal\"\t: { type: \"t\", value: null },\n\n\t\t\t\"tBlur1\"\t: { type: \"t\", value: null },\n\t\t\t\"tBlur2\"\t: { type: \"t\", value: null },\n\t\t\t\"tBlur3\"\t: { type: \"t\", value: null },\n\t\t\t\"tBlur4\"\t: { type: \"t\", value: null },\n\n\t\t\t\"tBeckmann\"\t: { type: \"t\", value: null },\n\n\t\t\t\"uNormalScale\": { type: \"f\", value: 1.0 },\n\n\t\t\t\"diffuse\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\t\t\t\"specular\": { type: \"c\", value: new THREE.Color( 0x111111 ) },\n\t\t\t\"ambient\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\t\t\t\"opacity\": \t { type: \"f\", value: 1 },\n\n\t\t\t\"uRoughness\": \t \t\t{ type: \"f\", value: 0.15 },\n\t\t\t\"uSpecularBrightness\": \t{ type: \"f\", value: 0.75 }\n\n\t\t\t}\n\n\t\t] ),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 ambient;\",\n\t\t\t\"uniform vec3 diffuse;\",\n\t\t\t\"uniform vec3 specular;\",\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform float uRoughness;\",\n\t\t\t\"uniform float uSpecularBrightness;\",\n\n\t\t\t\"uniform int passID;\",\n\n\t\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\t\"uniform sampler2D tNormal;\",\n\n\t\t\t\"uniform sampler2D tBlur1;\",\n\t\t\t\"uniform sampler2D tBlur2;\",\n\t\t\t\"uniform sampler2D tBlur3;\",\n\t\t\t\"uniform sampler2D tBlur4;\",\n\n\t\t\t\"uniform sampler2D tBeckmann;\",\n\n\t\t\t\"uniform float uNormalScale;\",\n\n\t\t\t\"varying vec3 vTangent;\",\n\t\t\t\"varying vec3 vBinormal;\",\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"uniform vec3 ambientLightColor;\",\n\n\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\t\t\t\t\"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\",\n\t\t\t\"#endif\",\n\n\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\t\t\t\t\"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];\",\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\n\n\t\t\t\"float fresnelReflectance( vec3 H, vec3 V, float F0 ) {\",\n\n\t\t\t\t\"float base = 1.0 - dot( V, H );\",\n\t\t\t\t\"float exponential = pow( base, 5.0 );\",\n\n\t\t\t\t\"return exponential + F0 * ( 1.0 - exponential );\",\n\n\t\t\t\"}\",\n\n\t\t\t// Kelemen/Szirmay-Kalos specular BRDF\n\n\t\t\t\"float KS_Skin_Specular( vec3 N,\", \t\t// Bumped surface normal\n\t\t\t\t\t\t\t\t\t\"vec3 L,\", \t\t// Points to light\n\t\t\t\t\t\t\t\t\t\"vec3 V,\", \t\t// Points to eye\n\t\t\t\t\t\t\t\t\t\"float m,\", \t// Roughness\n\t\t\t\t\t\t\t\t\t\"float rho_s\", \t// Specular brightness\n\t\t\t\t\t\t\t\t\t\") {\",\n\n\t\t\t\t\"float result = 0.0;\",\n\t\t\t\t\"float ndotl = dot( N, L );\",\n\n\t\t\t\t\"if( ndotl > 0.0 ) {\",\n\n\t\t\t\t\t\"vec3 h = L + V;\", // Unnormalized half-way vector\n\t\t\t\t\t\"vec3 H = normalize( h );\",\n\n\t\t\t\t\t\"float ndoth = dot( N, H );\",\n\n\t\t\t\t\t\"float PH = pow( 2.0 * texture2D( tBeckmann, vec2( ndoth, m ) ).x, 10.0 );\",\n\t\t\t\t\t\"float F = fresnelReflectance( H, V, 0.028 );\",\n\t\t\t\t\t\"float frSpec = max( PH * F / dot( h, h ), 0.0 );\",\n\n\t\t\t\t\t\"result = ndotl * rho_s * frSpec;\", // BRDF * dot(N,L) * rho_s\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"return result;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( 1.0 );\",\n\n\t\t\t\t\"vec4 mColor = vec4( diffuse, opacity );\",\n\t\t\t\t\"vec4 mSpecular = vec4( specular, opacity );\",\n\n\t\t\t\t\"vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\",\n\t\t\t\t\"normalTex.xy *= uNormalScale;\",\n\t\t\t\t\"normalTex = normalize( normalTex );\",\n\n\t\t\t\t\"vec4 colDiffuse = texture2D( tDiffuse, vUv );\",\n\t\t\t\t\"colDiffuse *= colDiffuse;\",\n\n\t\t\t\t\"gl_FragColor = gl_FragColor * colDiffuse;\",\n\n\t\t\t\t\"mat3 tsb = mat3( vTangent, vBinormal, vNormal );\",\n\t\t\t\t\"vec3 finalNormal = tsb * normalTex;\",\n\n\t\t\t\t\"vec3 normal = normalize( finalNormal );\",\n\t\t\t\t\"vec3 viewPosition = normalize( vViewPosition );\",\n\n\t\t\t\t// point lights\n\n\t\t\t\t\"vec3 specularTotal = vec3( 0.0 );\",\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec4 pointTotal = vec4( vec3( 0.0 ), 1.0 );\",\n\n\t\t\t\t\t\"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\n\n\t\t\t\t\t\t\"vec3 pointVector = normalize( vPointLight[ i ].xyz );\",\n\t\t\t\t\t\t\"float pointDistance = vPointLight[ i ].w;\",\n\n\t\t\t\t\t\t\"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\",\n\n\t\t\t\t\t\t\"pointTotal += pointDistance * vec4( pointLightColor[ i ], 1.0 ) * ( mColor * pointDiffuseWeight );\",\n\n\t\t\t\t\t\t\"if ( passID == 1 )\",\n\t\t\t\t\t\t\t\"specularTotal += pointDistance * mSpecular.xyz * pointLightColor[ i ] * KS_Skin_Specular( normal, pointVector, viewPosition, uRoughness, uSpecularBrightness );\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// directional lights\n\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec4 dirTotal = vec4( vec3( 0.0 ), 1.0 );\",\n\n\t\t\t\t\t\"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\",\n\n\t\t\t\t\t\t\"vec3 dirVector = normalize( lDirection.xyz );\",\n\n\t\t\t\t\t\t\"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\",\n\n\t\t\t\t\t\t\"dirTotal += vec4( directionalLightColor[ i ], 1.0 ) * ( mColor * dirDiffuseWeight );\",\n\n\t\t\t\t\t\t\"if ( passID == 1 )\",\n\t\t\t\t\t\t\t\"specularTotal += mSpecular.xyz * directionalLightColor[ i ] * KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// all lights contribution summation\n\n\t\t\t\t\"vec4 totalLight = vec4( vec3( 0.0 ), opacity );\",\n\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\t\t\t\t\t\"totalLight += dirTotal;\",\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\t\t\t\t\t\"totalLight += pointTotal;\",\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"gl_FragColor = gl_FragColor * totalLight;\",\n\n\t\t\t\t\"if ( passID == 0 ) {\",\n\n\t\t\t\t\t\"gl_FragColor = vec4( sqrt( gl_FragColor.xyz ), gl_FragColor.w );\",\n\n\t\t\t\t\"} else if ( passID == 1 ) {\",\n\n\t\t\t\t\t//\"#define VERSION1\",\n\n\t\t\t\t\t\"#ifdef VERSION1\",\n\n\t\t\t\t\t\t\"vec3 nonblurColor = sqrt( gl_FragColor.xyz );\",\n\n\t\t\t\t\t\"#else\",\n\n\t\t\t\t\t\t\"vec3 nonblurColor = gl_FragColor.xyz;\",\n\n\t\t\t\t\t\"#endif\",\n\n\t\t\t\t\t\"vec3 blur1Color = texture2D( tBlur1, vUv ).xyz;\",\n\t\t\t\t\t\"vec3 blur2Color = texture2D( tBlur2, vUv ).xyz;\",\n\t\t\t\t\t\"vec3 blur3Color = texture2D( tBlur3, vUv ).xyz;\",\n\t\t\t\t\t\"vec3 blur4Color = texture2D( tBlur4, vUv ).xyz;\",\n\n\n\t\t\t\t\t//\"gl_FragColor = vec4( blur1Color, gl_FragColor.w );\",\n\n\t\t\t\t\t//\"gl_FragColor = vec4( vec3( 0.22, 0.5, 0.7 ) * nonblurColor + vec3( 0.2, 0.5, 0.3 ) * blur1Color + vec3( 0.58, 0.0, 0.0 ) * blur2Color, gl_FragColor.w );\",\n\n\t\t\t\t\t//\"gl_FragColor = vec4( vec3( 0.25, 0.6, 0.8 ) * nonblurColor + vec3( 0.15, 0.25, 0.2 ) * blur1Color + vec3( 0.15, 0.15, 0.0 ) * blur2Color + vec3( 0.45, 0.0, 0.0 ) * blur3Color, gl_FragColor.w );\",\n\n\n\t\t\t\t\t\"gl_FragColor = vec4( vec3( 0.22, 0.437, 0.635 ) * nonblurColor + \",\n\t\t\t\t\t\t\t\t\t\t \"vec3( 0.101, 0.355, 0.365 ) * blur1Color + \",\n\t\t\t\t\t\t\t\t\t\t \"vec3( 0.119, 0.208, 0.0 ) * blur2Color + \",\n\t\t\t\t\t\t\t\t\t\t \"vec3( 0.114, 0.0, 0.0 ) * blur3Color + \",\n\t\t\t\t\t\t\t\t\t\t \"vec3( 0.444, 0.0, 0.0 ) * blur4Color\",\n\t\t\t\t\t\t\t\t\t\t \", gl_FragColor.w );\",\n\n\t\t\t\t\t\"gl_FragColor.xyz *= pow( colDiffuse.xyz, vec3( 0.5 ) );\",\n\n\t\t\t\t\t\"gl_FragColor.xyz += ambientLightColor * ambient * colDiffuse.xyz + specularTotal;\",\n\n\t\t\t\t\t\"#ifndef VERSION1\",\n\n\t\t\t\t\t\t\"gl_FragColor.xyz = sqrt( gl_FragColor.xyz );\",\n\n\t\t\t\t\t\"#endif\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader: [\n\n\t\t\t\"attribute vec4 tangent;\",\n\n\t\t\t\"#ifdef VERTEX_TEXTURES\",\n\n\t\t\t\t\"uniform sampler2D tDisplacement;\",\n\t\t\t\t\"uniform float uDisplacementScale;\",\n\t\t\t\t\"uniform float uDisplacementBias;\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vTangent;\",\n\t\t\t\"varying vec3 vBinormal;\",\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\n\n\t\t\t\t\"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\n\n\t\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\t\t// tangent and binormal vectors\n\n\t\t\t\t\"vTangent = normalize( normalMatrix * tangent.xyz );\",\n\n\t\t\t\t\"vBinormal = cross( vNormal, vTangent ) * tangent.w;\",\n\t\t\t\t\"vBinormal = normalize( vBinormal );\",\n\n\t\t\t\t\"vUv = uv;\",\n\n\t\t\t\t// point lights\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\t\"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\n\n\t\t\t\t\t\t\"vec3 lVector = lPosition.xyz - mvPosition.xyz;\",\n\n\t\t\t\t\t\t\"float lDistance = 1.0;\",\n\n\t\t\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\n\t\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\n\n\t\t\t\t\t\t\"lVector = normalize( lVector );\",\n\n\t\t\t\t\t\t\"vPointLight[ i ] = vec4( lVector, lDistance );\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// displacement mapping\n\n\t\t\t\t\"#ifdef VERTEX_TEXTURES\",\n\n\t\t\t\t\t\"vec3 dv = texture2D( tDisplacement, uv ).xyz;\",\n\t\t\t\t\t\"float df = uDisplacementScale * dv.x + uDisplacementBias;\",\n\t\t\t\t\t\"vec4 displacedPosition = vec4( vNormal.xyz * df, 0.0 ) + mvPosition;\",\n\t\t\t\t\t\"gl_Position = projectionMatrix * displacedPosition;\",\n\n\t\t\t\t\"#else\",\n\n\t\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShaderUV: [\n\n\t\t\t\"attribute vec4 tangent;\",\n\n\t\t\t\"#ifdef VERTEX_TEXTURES\",\n\n\t\t\t\t\"uniform sampler2D tDisplacement;\",\n\t\t\t\t\"uniform float uDisplacementScale;\",\n\t\t\t\t\"uniform float uDisplacementBias;\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vTangent;\",\n\t\t\t\"varying vec3 vBinormal;\",\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\n\n\t\t\t\t\"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\n\n\t\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\t\t// tangent and binormal vectors\n\n\t\t\t\t\"vTangent = normalize( normalMatrix * tangent.xyz );\",\n\n\t\t\t\t\"vBinormal = cross( vNormal, vTangent ) * tangent.w;\",\n\t\t\t\t\"vBinormal = normalize( vBinormal );\",\n\n\t\t\t\t\"vUv = uv;\",\n\n\t\t\t\t// point lights\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\t\"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\n\n\t\t\t\t\t\t\"vec3 lVector = lPosition.xyz - mvPosition.xyz;\",\n\n\t\t\t\t\t\t\"float lDistance = 1.0;\",\n\n\t\t\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\n\t\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\n\n\t\t\t\t\t\t\"lVector = normalize( lVector );\",\n\n\t\t\t\t\t\t\"vPointLight[ i ] = vec4( lVector, lDistance );\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"gl_Position = vec4( uv.x * 2.0 - 1.0, uv.y * 2.0 - 1.0, 0.0, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/* ------------------------------------------------------------------------------------------\n\t// Beckmann distribution function\n\t//\t- to be used in specular term of skin shader\n\t//\t- render a screen-aligned quad to precompute a 512 x 512 texture\n\t//\n\t//\t\t- from http://developer.nvidia.com/node/171\n\t ------------------------------------------------------------------------------------------ */\n\n\t\"beckmann\" : {\n\n\t\tuniforms: {},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"float PHBeckmann( float ndoth, float m ) {\",\n\n\t\t\t\t\"float alpha = acos( ndoth );\",\n\t\t\t\t\"float ta = tan( alpha );\",\n\n\t\t\t\t\"float val = 1.0 / ( m * m * pow( ndoth, 4.0 ) ) * exp( -( ta * ta ) / ( m * m ) );\",\n\t\t\t\t\"return val;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float KSTextureCompute( vec2 tex ) {\",\n\n\t\t\t\t// Scale the value to fit within [0,1] invert upon lookup.\n\n\t\t\t\t\"return 0.5 * pow( PHBeckmann( tex.x, tex.y ), 0.1 );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"float x = KSTextureCompute( vUv );\",\n\n\t\t\t\t\"gl_FragColor = vec4( x, x, x, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/ParametricGeometries.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ParametricGeometries.js",
"module-type": "library",
"text": "/*\n * @author zz85\n *\n * Experimenting of primitive geometry creation using Surface Parametric equations\n *\n */\n\n\nTHREE.ParametricGeometries = {\n\n\tklein: function (v, u) {\n\t\tu *= Math.PI;\n\t\tv *= 2 * Math.PI;\n\n\t\tu = u * 2;\n\t\tvar x, y, z;\n\t\tif (u < Math.PI) {\n\t\t\tx = 3 * Math.cos(u) * (1 + Math.sin(u)) + (2 * (1 - Math.cos(u) / 2)) * Math.cos(u) * Math.cos(v);\n\t\t\tz = -8 * Math.sin(u) - 2 * (1 - Math.cos(u) / 2) * Math.sin(u) * Math.cos(v);\n\t\t} else {\n\t\t\tx = 3 * Math.cos(u) * (1 + Math.sin(u)) + (2 * (1 - Math.cos(u) / 2)) * Math.cos(v + Math.PI);\n\t\t\tz = -8 * Math.sin(u);\n\t\t}\n\n\t\ty = -2 * (1 - Math.cos(u) / 2) * Math.sin(v);\n\n\t\treturn new THREE.Vector3(x, y, z);\n\t},\n\n\tplane: function (width, height) {\n\n\t\treturn function(u, v) {\n\t\t\tvar x = u * width;\n\t\t\tvar y = 0;\n\t\t\tvar z = v * height;\n\n\t\t\treturn new THREE.Vector3(x, y, z);\n\t\t};\n\t},\n\n\tmobius: function(u, t) {\n\n\t\t// flat mobius strip\n\t\t// http://www.wolframalpha.com/input/?i=M%C3%B6bius+strip+parametric+equations&lk=1&a=ClashPrefs_*Surface.MoebiusStrip.SurfaceProperty.ParametricEquations-\n\t\tu = u - 0.5;\n\t\tvar v = 2 * Math.PI * t;\n\n\t\tvar x, y, z;\n\n\t\tvar a = 2;\n\t\tx = Math.cos(v) * (a + u * Math.cos(v/2));\n\t\ty = Math.sin(v) * (a + u * Math.cos(v/2));\n\t\tz = u * Math.sin(v/2);\n\t\treturn new THREE.Vector3(x, y, z);\n\n\t},\n\n\tmobius3d: function(u, t) {\n\n\t\t// volumetric mobius strip\n\t\tu *= Math.PI;\n\t\tt *= 2 * Math.PI;\n\n\t\tu = u * 2;\n\t\tvar phi = u / 2;\n\t\tvar major = 2.25, a = 0.125, b = 0.65;\n\t\tvar x, y, z;\n\t\tx = a * Math.cos(t) * Math.cos(phi) - b * Math.sin(t) * Math.sin(phi);\n\t\tz = a * Math.cos(t) * Math.sin(phi) + b * Math.sin(t) * Math.cos(phi);\n\t\ty = (major + x) * Math.sin(u);\n\t\tx = (major + x) * Math.cos(u);\n\t\treturn new THREE.Vector3(x, y, z);\n\t}\n\n};\n\n\n/*********************************************\n *\n * Parametric Replacement for TubeGeometry\n *\n *********************************************/\n\nTHREE.ParametricGeometries.TubeGeometry = function(path, segments, radius, segmentsRadius, closed, debug) {\n\n\tthis.path = path;\n\tthis.segments = segments || 64;\n\tthis.radius = radius || 1;\n\tthis.segmentsRadius = segmentsRadius || 8;\n\tthis.closed = closed || false;\n\tif (debug) this.debug = new THREE.Object3D();\n\n\n\tvar scope = this,\n\n\t\ttangent, normal, binormal,\n\n\t\tnumpoints = this.segments + 1,\n\n\t\tx, y, z, tx, ty, tz, u, v,\n\n\t\tcx, cy, pos, pos2 = new THREE.Vector3(),\n\t\ti, j, ip, jp, a, b, c, d, uva, uvb, uvc, uvd;\n\n\tvar frames = new THREE.TubeGeometry.FrenetFrames(path, segments, closed),\n\t\ttangents = frames.tangents,\n\t\tnormals = frames.normals,\n\t\tbinormals = frames.binormals;\n\n\t\t// proxy internals\n\t\tthis.tangents = tangents;\n\t\tthis.normals = normals;\n\t\tthis.binormals = binormals;\n\n\n\n\tvar ParametricTube = function(u, v) {\n\t\tv *= 2 * Math.PI;\n\n\t\ti = u * (numpoints - 1);\n\t\ti = Math.floor(i);\n\n\t\tpos = path.getPointAt(u);\n\n\t\ttangent = tangents[i];\n\t\tnormal = normals[i];\n\t\tbinormal = binormals[i];\n\n\t\tif (scope.debug) {\n\n\t\t\tscope.debug.add(new THREE.ArrowHelper(tangent, pos, radius, 0x0000ff));\n\t\t\tscope.debug.add(new THREE.ArrowHelper(normal, pos, radius, 0xff0000));\n\t\t\tscope.debug.add(new THREE.ArrowHelper(binormal, pos, radius, 0x00ff00));\n\n\t\t}\n\n\t\tcx = -scope.radius * Math.cos(v); // TODO: Hack: Negating it so it faces outside.\n\t\tcy = scope.radius * Math.sin(v);\n\n\t\tpos2.copy(pos);\n\t\tpos2.x += cx * normal.x + cy * binormal.x;\n\t\tpos2.y += cx * normal.y + cy * binormal.y;\n\t\tpos2.z += cx * normal.z + cy * binormal.z;\n\n\t\treturn pos2.clone();\n\t};\n\n\tTHREE.ParametricGeometry.call(this, ParametricTube, segments, segmentsRadius);\n\n};\n\nTHREE.ParametricGeometries.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype );\n\n\n /*********************************************\n *\n * Parametric Replacement for TorusKnotGeometry\n *\n *********************************************/\nTHREE.ParametricGeometries.TorusKnotGeometry = function ( radius, tube, segmentsR, segmentsT, p, q, heightScale ) {\n\n\tvar scope = this;\n\n\tthis.radius = radius || 200;\n\tthis.tube = tube || 40;\n\tthis.segmentsR = segmentsR || 64;\n\tthis.segmentsT = segmentsT || 8;\n\tthis.p = p || 2;\n\tthis.q = q || 3;\n\tthis.heightScale = heightScale || 1;\n\n\n\tvar TorusKnotCurve = THREE.Curve.create(\n\n\t\tfunction() {\n\t\t},\n\n\t\tfunction(t) {\n\n\t\t\tt *= Math.PI * 2;\n\n\t\t\tvar r = 0.5;\n\n\t\t\tvar tx = (1 + r * Math.cos(q * t)) * Math.cos(p * t),\n\t\t\t\tty = (1 + r * Math.cos(q * t)) * Math.sin(p * t),\n\t\t\t\ttz = r * Math.sin(q * t);\n\n\t\t\treturn new THREE.Vector3(tx, ty * heightScale, tz).multiplyScalar(radius);\n\n\t\t}\n\n\t);\n\tvar segments = segmentsR;\n\tvar radiusSegments = segmentsT;\n\tvar extrudePath = new TorusKnotCurve();\n\n\tTHREE.ParametricGeometries.TubeGeometry.call( this, extrudePath, segments, tube, radiusSegments, true, false );\n\n\n};\n\nTHREE.ParametricGeometries.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype );\n\n\n /*********************************************\n *\n * Parametric Replacement for SphereGeometry\n *\n *********************************************/\nTHREE.ParametricGeometries.SphereGeometry = function(size, u, v) {\n\n\tfunction sphere(u, v) {\n\t\tu *= Math.PI;\n\t\tv *= 2 * Math.PI;\n\n\t\tvar x = size * Math.sin(u) * Math.cos(v);\n\t\tvar y = size * Math.sin(u) * Math.sin(v);\n\t\tvar z = size * Math.cos(u);\n\n\n\t\treturn new THREE.Vector3(x, y, z);\n\t}\n\n\tTHREE.ParametricGeometry.call(this, sphere, u, v, !true);\n\n};\n\nTHREE.ParametricGeometries.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype );\n\n\n /*********************************************\n *\n * Parametric Replacement for PlaneGeometry\n *\n *********************************************/\n\nTHREE.ParametricGeometries.PlaneGeometry = function(width, depth, segmentsWidth, segmentsDepth) {\n\n\tfunction plane(u, v) {\n\n\t\tvar x = u * width;\n\t\tvar y = 0;\n\t\tvar z = v * depth;\n\n\t\treturn new THREE.Vector3(x, y, z);\n\t}\n\n\tTHREE.ParametricGeometry.call(this, plane, segmentsWidth, segmentsDepth);\n\n};\n\nTHREE.ParametricGeometries.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Ocean.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Ocean.js",
"module-type": "library",
"text": "THREE.Ocean = function (renderer, camera, scene, options) {\n\t// flag used to trigger parameter changes\n\tthis.changed = true;\n\tthis.initial = true;\n\t\n\t// Assign required parameters as object properties\n\tthis.oceanCamera = new THREE.OrthographicCamera(); //camera.clone();\n\tthis.oceanCamera.position.z = 1;\n\tthis.renderer = renderer;\n\tthis.renderer.clearColor( 0xffffff );\n\t\n\tthis.scene = new THREE.Scene();\n\t\n\t// Enable necessary extensions\n\tthis.renderer.context.getExtension('OES_texture_float');\n\tthis.renderer.context.getExtension('OES_texture_float_linear');\n\t\n\t// Assign optional parameters as variables and object properties\n\tfunction optionalParameter(value, defaultValue) {\n\t\treturn value !== undefined ? value : defaultValue;\n\t};\n\toptions = options || {};\n\tthis.clearColor = optionalParameter(options.CLEAR_COLOR, [1.0, 1.0, 1.0, 0.0]);\n\tthis.geometryOrigin = optionalParameter(options.GEOMETRY_ORIGIN, [-1000.0, -1000.0]);\n\tthis.sunDirectionX = optionalParameter(options.SUN_DIRECTION[0], -1.0);\n\tthis.sunDirectionY = optionalParameter(options.SUN_DIRECTION[1], 1.0);\n\tthis.sunDirectionZ = optionalParameter(options.SUN_DIRECTION[2], 1.0);\n\tthis.oceanColor = optionalParameter(options.OCEAN_COLOR, new THREE.Vector3(0.004, 0.016, 0.047));\n\tthis.skyColor = optionalParameter(options.SKY_COLOR, new THREE.Vector3(3.2, 9.6, 12.8));\n\tthis.exposure = optionalParameter(options.EXPOSURE, 0.35);\n\tthis.geometryResolution = optionalParameter(options.GEOMETRY_RESOLUTION, 32);\n\tthis.geometrySize = optionalParameter(options.GEOMETRY_SIZE, 2000);\n\tthis.resolution = optionalParameter(options.RESOLUTION, 64);\n\tthis.floatSize = optionalParameter(options.SIZE_OF_FLOAT, 4);\n\tthis.windX = optionalParameter(options.INITIAL_WIND[0], 10.0),\n\tthis.windY = optionalParameter(options.INITIAL_WIND[1], 10.0),\n\tthis.size = optionalParameter(options.INITIAL_SIZE, 250.0),\n\tthis.choppiness = optionalParameter(options.INITIAL_CHOPPINESS, 1.5);\n\t\n\t// \n\tthis.matrixNeedsUpdate = false;\n\t\n\t// Setup framebuffer pipeline\n\tvar LinearClampParams = {\n\t\tminFilter: THREE.LinearFilter,\n\t\tmagFilter: THREE.LinearFilter,\n\t\twrapS: THREE.ClampToEdgeWrapping,\n\t\twrapT: THREE.ClampToEdgeWrapping,\n\t\tformat: THREE.RGBAFormat,\n\t\tstencilBuffer: false,\n\t\tdepthBuffer: false,\n\t\tpremultiplyAlpha: false,\n\t\ttype: THREE.FloatType\n\t};\n\tvar NearestClampParams = {\n\t\tminFilter: THREE.NearestFilter,\n\t\tmagFilter: THREE.NearestFilter,\n\t\twrapS: THREE.ClampToEdgeWrapping,\n\t\twrapT: THREE.ClampToEdgeWrapping,\n\t\tformat: THREE.RGBAFormat,\n\t\tstencilBuffer: false,\n\t\tdepthBuffer: false,\n\t\tpremultiplyAlpha:false,\n\t\ttype: THREE.FloatType\n\t};\n\tvar NearestRepeatParams = {\n\t\tminFilter: THREE.NearestFilter,\n\t\tmagFilter: THREE.NearestFilter,\n\t\twrapS: THREE.RepeatWrapping,\n\t\twrapT: THREE.RepeatWrapping,\n\t\tformat: THREE.RGBAFormat,\n\t\tstencilBuffer: false,\n\t\tdepthBuffer: false,\n\t\tpremultiplyAlpha: false,\n\t\ttype: THREE.FloatType\n\t};\n\tthis.initialSpectrumFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, NearestRepeatParams);\n\tthis.spectrumFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, NearestClampParams);\n\tthis.pingPhaseFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, NearestClampParams);\n\tthis.pongPhaseFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, NearestClampParams);\n\tthis.pingTransformFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, NearestClampParams);\n\tthis.pongTransformFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, NearestClampParams);\n\tthis.displacementMapFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, LinearClampParams);\n\tthis.normalMapFramebuffer = new THREE.WebGLRenderTarget(this.resolution, this.resolution, LinearClampParams);\n\t\n\t// Define shaders and constant uniforms\n\t////////////////////////////////////////\n\t\n\t// 0 - The vertex shader used in all of the simulation steps\n\tvar fullscreeenVertexShader = THREE.ShaderLib[\"ocean_sim_vertex\"];\n\t\t\n\t// 1 - Horizontal wave vertices used for FFT\n\tvar oceanHorizontalShader = THREE.ShaderLib[\"ocean_subtransform\"];\n\tvar oceanHorizontalUniforms = THREE.UniformsUtils.clone(oceanHorizontalShader.uniforms);\n\tthis.materialOceanHorizontal = new THREE.ShaderMaterial({\n\t\tuniforms: oceanHorizontalUniforms,\n\t\tvertexShader: fullscreeenVertexShader.vertexShader,\n\t\tfragmentShader: \"#define HORIZONTAL \\n\" + oceanHorizontalShader.fragmentShader\n\t});\n\tthis.materialOceanHorizontal.uniforms.u_transformSize = { type: \"f\", value: this.resolution };\n\tthis.materialOceanHorizontal.uniforms.u_subtransformSize = { type: \"f\", value: null };\n\tthis.materialOceanHorizontal.uniforms.u_input = { type: \"t\", value: null };\n\tthis.materialOceanHorizontal.depthTest = false;\n\t\n\t// 2 - Vertical wave vertices used for FFT\n\tvar oceanVerticalShader = THREE.ShaderLib[\"ocean_subtransform\"];\n\tvar oceanVerticalUniforms = THREE.UniformsUtils.clone(oceanVerticalShader.uniforms);\n\tthis.materialOceanVertical = new THREE.ShaderMaterial({\n\t\tuniforms: oceanVerticalUniforms,\n\t\tvertexShader: fullscreeenVertexShader.vertexShader,\n\t\tfragmentShader: oceanVerticalShader.fragmentShader\n\t});\n\tthis.materialOceanVertical.uniforms.u_transformSize = { type: \"f\", value: this.resolution };\n\tthis.materialOceanVertical.uniforms.u_subtransformSize = { type: \"f\", value: null };\n\tthis.materialOceanVertical.uniforms.u_input = { type: \"t\", value: null };\n\tthis.materialOceanVertical.depthTest = false;\n\t\n\t// 3 - Initial spectrum used to generate height map\n\tvar initialSpectrumShader = THREE.ShaderLib[\"ocean_initial_spectrum\"];\n\tvar initialSpectrumUniforms = THREE.UniformsUtils.clone(initialSpectrumShader.uniforms);\n\tthis.materialInitialSpectrum = new THREE.ShaderMaterial({\n\t\tuniforms: initialSpectrumUniforms,\n\t\tvertexShader: fullscreeenVertexShader.vertexShader,\n\t\tfragmentShader:initialSpectrumShader.fragmentShader\n\t});\n\tthis.materialInitialSpectrum.uniforms.u_wind = { type: \"v2\", value: new THREE.Vector2() };\n\tthis.materialInitialSpectrum.uniforms.u_resolution = { type: \"f\", value: this.resolution };\n\tthis.materialInitialSpectrum.depthTest = false;\n\t\n\t// 4 - Phases used to animate heightmap\n\tvar phaseShader = THREE.ShaderLib[\"ocean_phase\"];\n\tvar phaseUniforms = THREE.UniformsUtils.clone(phaseShader.uniforms);\n\tthis.materialPhase = new THREE.ShaderMaterial({\n\t\tuniforms: phaseUniforms,\n\t\tvertexShader: fullscreeenVertexShader.vertexShader,\n\t\tfragmentShader: phaseShader.fragmentShader\n\t});\n\tthis.materialPhase.uniforms.u_resolution = { type: \"f\", value: this.resolution };\n\tthis.materialPhase.depthTest = false;\n\t\n\t// 5 - Shader used to update spectrum\n\tvar spectrumShader = THREE.ShaderLib[\"ocean_spectrum\"];\n\tvar spectrumUniforms = THREE.UniformsUtils.clone(spectrumShader.uniforms);\n\tthis.materialSpectrum = new THREE.ShaderMaterial({\n\t\tuniforms: spectrumUniforms,\n\t\tvertexShader: fullscreeenVertexShader.vertexShader,\n\t\tfragmentShader: spectrumShader.fragmentShader\n\t});\n\tthis.materialSpectrum.uniforms.u_initialSpectrum = { type: \"t\", value: null };\n\tthis.materialSpectrum.uniforms.u_resolution = { type: \"f\", value: this.resolution };\n\tthis.materialSpectrum.depthTest = false;\n\n\t// 6 - Shader used to update spectrum normals\n\tvar normalShader = THREE.ShaderLib[\"ocean_normals\"];\n\tvar normalUniforms = THREE.UniformsUtils.clone(normalShader.uniforms);\n\tthis.materialNormal = new THREE.ShaderMaterial({\n\t\tuniforms: normalUniforms,\n\t\tvertexShader: fullscreeenVertexShader.vertexShader,\n\t\tfragmentShader: normalShader.fragmentShader\n\t});\n\tthis.materialNormal.uniforms.u_displacementMap = { type: \"t\", value: null };\n\tthis.materialNormal.uniforms.u_resolution = { type: \"f\", value: this.resolution };\n\tthis.materialNormal.depthTest = false;\n\n\t// 7 - Shader used to update normals\n\tvar oceanShader = THREE.ShaderLib[\"ocean_main\"];\n\tvar oceanUniforms = THREE.UniformsUtils.clone(oceanShader.uniforms);\n\tvar oceanAttributes = THREE.UniformsUtils.clone(oceanShader.attributes);\n\tthis.materialOcean = new THREE.ShaderMaterial({\n\t\tattributes: oceanAttributes,\n\t\tuniforms: oceanUniforms,\n\t\tvertexShader: oceanShader.vertexShader,\n\t\tfragmentShader: oceanShader.fragmentShader\n\t});\n\t// this.materialOcean.wireframe = true;\n\tthis.materialOcean.uniforms.u_geometrySize = { type: \"f\", value: this.resolution };\n\tthis.materialOcean.uniforms.u_displacementMap = { type: \"t\", value: this.displacementMapFramebuffer };\n\tthis.materialOcean.uniforms.u_normalMap = { type: \"t\", value: this.normalMapFramebuffer }; \n\tthis.materialOcean.uniforms.u_oceanColor = { type: \"v3\", value: this.oceanColor }; \n\tthis.materialOcean.uniforms.u_skyColor = { type: \"v3\", value: this.skyColor };\n\tthis.materialOcean.uniforms.u_sunDirection = { type: \"v3\", value: new THREE.Vector3( this.sunDirectionX, this.sunDirectionY, this.sunDirectionZ ) };\n\tthis.materialOcean.uniforms.u_exposure = { type: \"f\", value: this.exposure };\n\n\t// Disable blending to prevent default premultiplied alpha values\n\tthis.materialOceanHorizontal.blending = 0;\n\tthis.materialOceanVertical.blending = 0;\n\tthis.materialInitialSpectrum.blending = 0;\n\tthis.materialPhase.blending = 0;\n\tthis.materialSpectrum.blending = 0;\n\tthis.materialNormal.blending = 0;\n\tthis.materialOcean.blending = 0;\n\n\t// Create the simulation plane\n\tthis.screenQuad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ) );\n\tthis.scene.add(this.screenQuad);\n\n\t// Initialise spectrum data\n\tthis.generateSeedPhaseTexture();\n\n\t// Generate the ocean mesh\n\tthis.generateMesh();\n};\n\nTHREE.Ocean.prototype.generateMesh = function () {\n\n\tvar geometry = new THREE.PlaneGeometry( this.geometrySize, this.geometrySize, this.geometryResolution, this.geometryResolution );\n\n\tgeometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );\n\n\tthis.oceanMesh = new THREE.Mesh( geometry, this.materialOcean );\n};\n\nTHREE.Ocean.prototype.render = function () {\n\tthis.scene.overrideMaterial = null;\n\t\n\tif (this.changed)\n\t\tthis.renderInitialSpectrum();\n\t\n\tthis.renderWavePhase();\n\tthis.renderSpectrum();\n\tthis.renderSpectrumFFT();\n\tthis.renderNormalMap();\n\tthis.scene.overrideMaterial = null;\n};\n\nTHREE.Ocean.prototype.generateSeedPhaseTexture = function() {\n\t// Setup the seed texture\n\tthis.pingPhase = true;\n\tvar phaseArray = new window.Float32Array(this.resolution * this.resolution * 4);\n\tfor (var i = 0; i < this.resolution; i++) {\n\t\tfor (var j = 0; j < this.resolution; j++) {\n\t\t\tphaseArray[i * this.resolution * 4 + j * 4] = Math.random() * 2.0 * Math.PI;\n\t\t\tphaseArray[i * this.resolution * 4 + j * 4 + 1] = 0.0;\n\t\t\tphaseArray[i * this.resolution * 4 + j * 4 + 2] = 0.0;\n\t\t\tphaseArray[i * this.resolution * 4 + j * 4 + 3] = 0.0;\n\t\t}\n\t}\n\t\n\tthis.pingPhaseTexture = new THREE.DataTexture(phaseArray, this.resolution, this.resolution, THREE.RGBAFormat);\n\tthis.pingPhaseTexture.minFilter = THREE.NearestFilter;\n\tthis.pingPhaseTexture.magFilter = THREE.NearestFilter;\n\tthis.pingPhaseTexture.wrapS = THREE.ClampToEdgeWrapping;\n\tthis.pingPhaseTexture.wrapT = THREE.ClampToEdgeWrapping;\n\tthis.pingPhaseTexture.type = THREE.FloatType;\n\tthis.pingPhaseTexture.needsUpdate = true;\n};\n\nTHREE.Ocean.prototype.renderInitialSpectrum = function () {\n\tthis.scene.overrideMaterial = this.materialInitialSpectrum;\n\tthis.materialInitialSpectrum.uniforms.u_wind.value.set( this.windX, this.windY );\n\tthis.materialInitialSpectrum.uniforms.u_size.value = this.size;\n\tthis.renderer.render(this.scene, this.oceanCamera, this.initialSpectrumFramebuffer, true);\n};\n\nTHREE.Ocean.prototype.renderWavePhase = function () {\n\tthis.scene.overrideMaterial = this.materialPhase;\n\tthis.screenQuad.material = this.materialPhase;\n\tif (this.initial) {\n\t\tthis.materialPhase.uniforms.u_phases.value = this.pingPhaseTexture;\n\t\tthis.initial = false;\n\t}else {\n\t\tthis.materialPhase.uniforms.u_phases.value = this.pingPhase ? this.pingPhaseFramebuffer : this.pongPhaseFramebuffer;\n\t}\n\tthis.materialPhase.uniforms.u_deltaTime.value = this.deltaTime;\n\tthis.materialPhase.uniforms.u_size.value = this.size;\n\tthis.renderer.render(this.scene, this.oceanCamera, this.pingPhase ? this.pongPhaseFramebuffer : this.pingPhaseFramebuffer);\n\tthis.pingPhase = !this.pingPhase;\n};\n\nTHREE.Ocean.prototype.renderSpectrum = function () {\n\tthis.scene.overrideMaterial = this.materialSpectrum;\n\tthis.materialSpectrum.uniforms.u_initialSpectrum.value = this.initialSpectrumFramebuffer;\n\tthis.materialSpectrum.uniforms.u_phases.value = this.pingPhase ? this.pingPhaseFramebuffer : this.pongPhaseFramebuffer;\n\tthis.materialSpectrum.uniforms.u_choppiness.value = this.choppiness ;\n\tthis.materialSpectrum.uniforms.u_size.value = this.size ;\n\tthis.renderer.render(this.scene, this.oceanCamera, this.spectrumFramebuffer);\n};\n\nTHREE.Ocean.prototype.renderSpectrumFFT = function() {\n\t// GPU FFT using Stockham formulation\n\tvar iterations = Math.log( this.resolution ) / Math.log(2); // log2\n\t\n\tthis.scene.overrideMaterial = this.materialOceanHorizontal;\n\n\tfor (var i = 0; i < iterations; i++) {\n\t\tif (i === 0) {\n\t\t\tthis.materialOceanHorizontal.uniforms.u_input.value = this.spectrumFramebuffer;\n\t\t\tthis.materialOceanHorizontal.uniforms.u_subtransformSize.value = Math.pow(2, (i % (iterations)) + 1);\n\t\t\tthis.renderer.render(this.scene, this.oceanCamera, this.pingTransformFramebuffer);\n\t\t} \n\t\telse if (i % 2 === 1) {\n\t\t\tthis.materialOceanHorizontal.uniforms.u_input.value = this.pingTransformFramebuffer;\n\t\t\tthis.materialOceanHorizontal.uniforms.u_subtransformSize.value = Math.pow(2, (i % (iterations)) + 1);\n\t\t\tthis.renderer.render(this.scene, this.oceanCamera, this.pongTransformFramebuffer);\n\t\t}\n\t\telse {\n\t\t\tthis.materialOceanHorizontal.uniforms.u_input.value = this.pongTransformFramebuffer;\n\t\t\tthis.materialOceanHorizontal.uniforms.u_subtransformSize.value = Math.pow(2, (i % (iterations)) + 1);\n\t\t\tthis.renderer.render(this.scene, this.oceanCamera, this.pingTransformFramebuffer);\n\t\t}\n\t}\n\tthis.scene.overrideMaterial = this.materialOceanVertical;\n\tfor (var i = iterations; i < iterations*2; i++) {\n\t\tif (i === iterations * 2 - 1) {\n\t\t\tthis.materialOceanVertical.uniforms.u_input.value = (iterations % 2 === 0) ? this.pingTransformFramebuffer : this.pongTransformFramebuffer;\n\t\t\tthis.materialOceanVertical.uniforms.u_subtransformSize.value = Math.pow(2, (i % (iterations)) + 1);\n\t\t\tthis.renderer.render(this.scene, this.oceanCamera, this.displacementMapFramebuffer);\n\t\t}\n\t\telse if (i % 2 === 1) {\n\t\t\tthis.materialOceanVertical.uniforms.u_input.value = this.pingTransformFramebuffer;\n\t\t\tthis.materialOceanVertical.uniforms.u_subtransformSize.value = Math.pow(2, (i % (iterations)) + 1);\n\t\t\tthis.renderer.render(this.scene, this.oceanCamera, this.pongTransformFramebuffer);\n\t\t}\n\t\telse {\n\t\t\tthis.materialOceanVertical.uniforms.u_input.value = this.pongTransformFramebuffer;\n\t\t\tthis.materialOceanVertical.uniforms.u_subtransformSize.value = Math.pow(2, (i % (iterations)) + 1);\n\t\t\tthis.renderer.render(this.scene, this.oceanCamera, this.pingTransformFramebuffer);\n\t\t}\n\t}\n};\n\nTHREE.Ocean.prototype.renderNormalMap = function () {\n\tthis.scene.overrideMaterial = this.materialNormal;\n\tif (this.changed) this.materialNormal.uniforms.u_size.value = this.size;\n\tthis.materialNormal.uniforms.u_displacementMap.value = this.displacementMapFramebuffer;\n\tthis.renderer.render(this.scene, this.oceanCamera, this.normalMapFramebuffer, true);\n};"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/BlendShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/BlendShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Blend two textures\n */\n\nTHREE.BlendShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse1\": { type: \"t\", value: null },\n\t\t\"tDiffuse2\": { type: \"t\", value: null },\n\t\t\"mixRatio\": { type: \"f\", value: 0.5 },\n\t\t\"opacity\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\t\t\"uniform float mixRatio;\",\n\n\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\"uniform sampler2D tDiffuse2;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 texel1 = texture2D( tDiffuse1, vUv );\",\n\t\t\t\"vec4 texel2 = texture2D( tDiffuse2, vUv );\",\n\t\t\t\"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/RGBShiftShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/RGBShiftShader.js",
"module-type": "library",
"text": "/**\n * @author felixturner / http://airtight.cc/\n *\n * RGB Shift Shader\n * Shifts red and blue channels from center in opposite directions\n * Ported from http://kriss.cx/tom/2009/05/rgb-shift/\n * by Tom Butterworth / http://kriss.cx/tom/\n *\n * amount: shift distance (1 is width of input)\n * angle: shift angle in radians\n */\n\nTHREE.RGBShiftShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"amount\": { type: \"f\", value: 0.005 },\n\t\t\"angle\": { type: \"f\", value: 0.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float amount;\",\n\t\t\"uniform float angle;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec2 offset = amount * vec2( cos(angle), sin(angle));\",\n\t\t\t\"vec4 cr = texture2D(tDiffuse, vUv + offset);\",\n\t\t\t\"vec4 cga = texture2D(tDiffuse, vUv);\",\n\t\t\t\"vec4 cb = texture2D(tDiffuse, vUv - offset);\",\n\t\t\t\"gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/OceanShaders.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/OceanShaders.js",
"module-type": "library",
"text": "// Author: Aleksandr Albert\n// Website: www.routter.co.tt\n\n// Description: A deep water ocean shader set\n// based on an implementation of a Tessendorf Waves\n// originally presented by David Li ( www.david.li/waves )\n\n// The general method is to apply shaders to simulation Framebuffers\n// and then sample these framebuffers when rendering the ocean mesh\n\n// The set uses 7 shaders:\n\n// -- Simulation shaders\n// [1] ocean_sim_vertex -> Vertex shader used to set up a 2x2 simulation plane centered at (0,0)\n// [2] ocean_subtransform -> Fragment shader used to subtransform the mesh (generates the displacement map)\n// [3] ocean_initial_spectrum -> Fragment shader used to set intitial wave frequency at a texel coordinate\n// [4] ocean_phase -> Fragment shader used to set wave phase at a texel coordinate\n// [5] ocean_spectrum -> Fragment shader used to set current wave frequency at a texel coordinate\n// [6] ocean_normal -> Fragment shader used to set face normals at a texel coordinate\n\n// -- Rendering Shader\n// [7] ocean_main -> Vertex and Fragment shader used to create the final render\n\n\nTHREE.ShaderLib['ocean_sim_vertex'] = {\n\tvarying: {\n\t\t\"vUV\": { type: \"v2\" }\n\t},\n\tvertexShader: [\n\t\t'varying vec2 vUV;',\n\n\t\t'void main (void) {',\n\t\t\t'vUV = position.xy * 0.5 + 0.5;',\n\t\t\t'gl_Position = vec4(position, 1.0 );',\n\t\t'}'\n\t].join('\\n')\n};\nTHREE.ShaderLib['ocean_subtransform'] = {\n\tuniforms: {\n\t\t\"u_input\": { type: \"t\", value: null },\n\t\t\"u_transformSize\": { type: \"f\", value: 512.0 },\n\t\t\"u_subtransformSize\": { type: \"f\", value: 250.0 }\n\t},\n\tvarying: {\n\t\t\"vUV\": { type: \"v2\" }\n\t},\n\tfragmentShader: [\n\t\t//GPU FFT using a Stockham formulation\n\t\t'precision highp float;',\n\n\t\t'const float PI = 3.14159265359;',\n\n\t\t'uniform sampler2D u_input;',\n\t\t'uniform float u_transformSize;',\n\t\t'uniform float u_subtransformSize;',\n\n\t\t'varying vec2 vUV;',\n\t\t\n\t\t'vec2 multiplyComplex (vec2 a, vec2 b) {',\n\t\t\t'return vec2(a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]);',\n\t\t'}',\n\n\t\t'void main (void) {',\n\t\t\t'#ifdef HORIZONTAL',\n\t\t\t'float index = vUV.x * u_transformSize - 0.5;',\n\t\t\t'#else',\n\t\t\t'float index = vUV.y * u_transformSize - 0.5;',\n\t\t\t'#endif',\n\n\t\t\t'float evenIndex = floor(index / u_subtransformSize) * (u_subtransformSize * 0.5) + mod(index, u_subtransformSize * 0.5);',\n\n\t\t\t//transform two complex sequences simultaneously\n\t\t\t'#ifdef HORIZONTAL',\n\t\t\t'vec4 even = texture2D(u_input, vec2(evenIndex + 0.5, gl_FragCoord.y) / u_transformSize).rgba;',\n\t\t\t'vec4 odd = texture2D(u_input, vec2(evenIndex + u_transformSize * 0.5 + 0.5, gl_FragCoord.y) / u_transformSize).rgba;',\n\t\t\t'#else',\n\t\t\t'vec4 even = texture2D(u_input, vec2(gl_FragCoord.x, evenIndex + 0.5) / u_transformSize).rgba;',\n\t\t\t'vec4 odd = texture2D(u_input, vec2(gl_FragCoord.x, evenIndex + u_transformSize * 0.5 + 0.5) / u_transformSize).rgba;',\n\t\t\t'#endif',\n\n\t\t\t'float twiddleArgument = -2.0 * PI * (index / u_subtransformSize);',\n\t\t\t'vec2 twiddle = vec2(cos(twiddleArgument), sin(twiddleArgument));',\n\n\t\t\t'vec2 outputA = even.xy + multiplyComplex(twiddle, odd.xy);',\n\t\t\t'vec2 outputB = even.zw + multiplyComplex(twiddle, odd.zw);',\n\n\t\t\t'gl_FragColor = vec4(outputA, outputB);',\n\t\t'}'\n\t].join('\\n')\n};\nTHREE.ShaderLib['ocean_initial_spectrum'] = {\n\tuniforms: {\n\t\t\"u_wind\": { type: \"v2\", value: new THREE.Vector2(10.0, 10.0) },\n\t\t\"u_resolution\": { type: \"f\", value: 512.0 },\n\t\t\"u_size\": { type: \"f\", value: 250.0 },\n\t},\n\tfragmentShader: [\n\t\t'precision highp float;',\n\n\t\t'const float PI = 3.14159265359;',\n\t\t'const float G = 9.81;',\n\t\t'const float KM = 370.0;',\n\t\t'const float CM = 0.23;',\n\n\t\t'uniform vec2 u_wind;',\n\t\t'uniform float u_resolution;',\n\t\t'uniform float u_size;',\n\t\t\n\t\t'float square (float x) {',\n\t\t\t'return x * x;',\n\t\t'}',\n\n\t\t'float omega (float k) {',\n\t\t\t'return sqrt(G * k * (1.0 + square(k / KM)));',\n\t\t'}',\n\n\t\t'float tanh (float x) {',\n\t\t\t'return (1.0 - exp(-2.0 * x)) / (1.0 + exp(-2.0 * x));',\n\t\t'}',\n\n\t\t'void main (void) {',\n\t\t\t'vec2 coordinates = gl_FragCoord.xy - 0.5;',\n\t\t\t\n\t\t\t'float n = (coordinates.x < u_resolution * 0.5) ? coordinates.x : coordinates.x - u_resolution;',\n\t\t\t'float m = (coordinates.y < u_resolution * 0.5) ? coordinates.y : coordinates.y - u_resolution;',\n\t\t\t\n\t\t\t'vec2 K = (2.0 * PI * vec2(n, m)) / u_size;',\n\t\t\t'float k = length(K);',\n\t\t\t\n\t\t\t'float l_wind = length(u_wind);',\n\n\t\t\t'float Omega = 0.84;',\n\t\t\t'float kp = G * square(Omega / l_wind);',\n\n\t\t\t'float c = omega(k) / k;',\n\t\t\t'float cp = omega(kp) / kp;',\n\n\t\t\t'float Lpm = exp(-1.25 * square(kp / k));',\n\t\t\t'float gamma = 1.7;',\n\t\t\t'float sigma = 0.08 * (1.0 + 4.0 * pow(Omega, -3.0));',\n\t\t\t'float Gamma = exp(-square(sqrt(k / kp) - 1.0) / 2.0 * square(sigma));',\n\t\t\t'float Jp = pow(gamma, Gamma);',\n\t\t\t'float Fp = Lpm * Jp * exp(-Omega / sqrt(10.0) * (sqrt(k / kp) - 1.0));',\n\t\t\t'float alphap = 0.006 * sqrt(Omega);',\n\t\t\t'float Bl = 0.5 * alphap * cp / c * Fp;',\n\n\t\t\t'float z0 = 0.000037 * square(l_wind) / G * pow(l_wind / cp, 0.9);',\n\t\t\t'float uStar = 0.41 * l_wind / log(10.0 / z0);',\n\t\t\t'float alpham = 0.01 * ((uStar < CM) ? (1.0 + log(uStar / CM)) : (1.0 + 3.0 * log(uStar / CM)));',\n\t\t\t'float Fm = exp(-0.25 * square(k / KM - 1.0));',\n\t\t\t'float Bh = 0.5 * alpham * CM / c * Fm * Lpm;',\n\n\t\t\t'float a0 = log(2.0) / 4.0;',\n\t\t\t'float am = 0.13 * uStar / CM;',\n\t\t\t'float Delta = tanh(a0 + 4.0 * pow(c / cp, 2.5) + am * pow(CM / c, 2.5));',\n\n\t\t\t'float cosPhi = dot(normalize(u_wind), normalize(K));',\n\n\t\t\t'float S = (1.0 / (2.0 * PI)) * pow(k, -4.0) * (Bl + Bh) * (1.0 + Delta * (2.0 * cosPhi * cosPhi - 1.0));',\n\n\t\t\t'float dk = 2.0 * PI / u_size;',\n\t\t\t'float h = sqrt(S / 2.0) * dk;',\n\n\t\t\t'if (K.x == 0.0 && K.y == 0.0) {',\n\t\t\t\t'h = 0.0;', //no DC term\n\t\t\t'}',\n\t\t\t'gl_FragColor = vec4(h, 0.0, 0.0, 0.0);',\n\t\t'}'\n\t].join('\\n')\n};\nTHREE.ShaderLib['ocean_phase'] = {\n\tuniforms: {\n\t\t\"u_phases\": { type: \"t\", value: null },\n\t\t\"u_deltaTime\": { type: \"f\", value: null },\n\t\t\"u_resolution\": { type: \"f\", value: null },\n\t\t\"u_size\": { type: \"f\", value: null },\n\t},\n\tvarying: {\n\t\t\"vUV\": { type: \"v2\" }\n\t},\n\tfragmentShader: [\n\t\t'precision highp float;',\n\n\t\t'const float PI = 3.14159265359;',\n\t\t'const float G = 9.81;',\n\t\t'const float KM = 370.0;',\n\n\t\t'varying vec2 vUV;',\n\n\t\t'uniform sampler2D u_phases;',\n\t\t'uniform float u_deltaTime;',\n\t\t'uniform float u_resolution;',\n\t\t'uniform float u_size;',\n\n\t\t'float omega (float k) {',\n\t\t\t'return sqrt(G * k * (1.0 + k * k / KM * KM));',\n\t\t'}',\n\n\t\t'void main (void) {',\n\t\t\t'float deltaTime = 1.0 / 60.0;',\n\t\t\t'vec2 coordinates = gl_FragCoord.xy - 0.5;',\n\t\t\t'float n = (coordinates.x < u_resolution * 0.5) ? coordinates.x : coordinates.x - u_resolution;',\n\t\t\t'float m = (coordinates.y < u_resolution * 0.5) ? coordinates.y : coordinates.y - u_resolution;',\n\t\t\t'vec2 waveVector = (2.0 * PI * vec2(n, m)) / u_size;',\n\n\t\t\t'float phase = texture2D(u_phases, vUV).r;',\n\t\t\t'float deltaPhase = omega(length(waveVector)) * u_deltaTime;',\n\t\t\t'phase = mod(phase + deltaPhase, 2.0 * PI);',\n\t\t\n\t\t\t'gl_FragColor = vec4(phase, 0.0, 0.0, 0.0);',\n\t\t'}'\n\t].join('\\n')\n};\nTHREE.ShaderLib['ocean_spectrum'] = {\n\tuniforms: {\n\t\t\"u_size\": { type: \"f\", value: null },\n\t\t\"u_resolution\": { type: \"f\", value: null },\n\t\t\"u_choppiness\": { type: \"f\", value: null },\n\t\t\"u_phases\": { type: \"t\", value: null },\n\t\t\"u_initialSpectrum\": { type: \"t\", value: null },\n\t},\n\tvarying: {\n\t\t\"vUV\": { type: \"v2\" }\n\t},\n\tfragmentShader: [\n\t\t'precision highp float;',\n\n\t\t'const float PI = 3.14159265359;',\n\t\t'const float G = 9.81;',\n\t\t'const float KM = 370.0;',\n\n\t\t'varying vec2 vUV;',\n\n\t\t'uniform float u_size;',\n\t\t'uniform float u_resolution;',\n\t\t'uniform float u_choppiness;',\n\t\t'uniform sampler2D u_phases;',\n\t\t'uniform sampler2D u_initialSpectrum;',\n\n\t\t'vec2 multiplyComplex (vec2 a, vec2 b) {',\n\t\t\t'return vec2(a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]);',\n\t\t'}',\n\n\t\t'vec2 multiplyByI (vec2 z) {',\n\t\t\t'return vec2(-z[1], z[0]);',\n\t\t'}',\n\n\t\t'float omega (float k) {',\n\t\t\t'return sqrt(G * k * (1.0 + k * k / KM * KM));',\n\t\t'}',\n\n\t\t'void main (void) {',\n\t\t\t'vec2 coordinates = gl_FragCoord.xy - 0.5;',\n\t\t\t'float n = (coordinates.x < u_resolution * 0.5) ? coordinates.x : coordinates.x - u_resolution;',\n\t\t\t'float m = (coordinates.y < u_resolution * 0.5) ? coordinates.y : coordinates.y - u_resolution;',\n\t\t\t'vec2 waveVector = (2.0 * PI * vec2(n, m)) / u_size;',\n\n\t\t\t'float phase = texture2D(u_phases, vUV).r;',\n\t\t\t'vec2 phaseVector = vec2(cos(phase), sin(phase));',\n\n\t\t\t'vec2 h0 = texture2D(u_initialSpectrum, vUV).rg;',\n\t\t\t'vec2 h0Star = texture2D(u_initialSpectrum, vec2(1.0 - vUV + 1.0 / u_resolution)).rg;',\n\t\t\t'h0Star.y *= -1.0;',\n\n\t\t\t'vec2 h = multiplyComplex(h0, phaseVector) + multiplyComplex(h0Star, vec2(phaseVector.x, -phaseVector.y));',\n\n\t\t\t'vec2 hX = -multiplyByI(h * (waveVector.x / length(waveVector))) * u_choppiness;',\n\t\t\t'vec2 hZ = -multiplyByI(h * (waveVector.y / length(waveVector))) * u_choppiness;',\n\n\t\t\t//no DC term\n\t\t\t'if (waveVector.x == 0.0 && waveVector.y == 0.0) {',\n\t\t\t\t'h = vec2(0.0);',\n\t\t\t\t'hX = vec2(0.0);',\n\t\t\t\t'hZ = vec2(0.0);',\n\t\t\t'}',\n\t\t\n\t\t\t'gl_FragColor = vec4(hX + multiplyByI(h), hZ);',\n\t\t'}'\n\t].join('\\n')\n};\nTHREE.ShaderLib['ocean_normals'] = {\n\tuniforms: {\n\t\t\"u_displacementMap\": { type: \"t\", value: null },\n\t\t\"u_resolution\": { type: \"f\", value: null },\n\t\t\"u_size\": { type: \"f\", value: null },\n\t},\n\tvarying: {\n\t\t\"vUV\": { type: \"v2\" }\n\t},\n\tfragmentShader: [\n\t\t'precision highp float;',\n\n\t\t'varying vec2 vUV;',\n\t\t\n\t\t'uniform sampler2D u_displacementMap;',\n\t\t'uniform float u_resolution;',\n\t\t'uniform float u_size;',\n\n\t\t'void main (void) {',\n\t\t\t'float texel = 1.0 / u_resolution;',\n\t\t\t'float texelSize = u_size / u_resolution;',\n\n\t\t\t'vec3 center = texture2D(u_displacementMap, vUV).rgb;',\n\t\t\t'vec3 right = vec3(texelSize, 0.0, 0.0) + texture2D(u_displacementMap, vUV + vec2(texel, 0.0)).rgb - center;',\n\t\t\t'vec3 left = vec3(-texelSize, 0.0, 0.0) + texture2D(u_displacementMap, vUV + vec2(-texel, 0.0)).rgb - center;',\n\t\t\t'vec3 top = vec3(0.0, 0.0, -texelSize) + texture2D(u_displacementMap, vUV + vec2(0.0, -texel)).rgb - center;',\n\t\t\t'vec3 bottom = vec3(0.0, 0.0, texelSize) + texture2D(u_displacementMap, vUV + vec2(0.0, texel)).rgb - center;',\n\n\t\t\t'vec3 topRight = cross(right, top);',\n\t\t\t'vec3 topLeft = cross(top, left);',\n\t\t\t'vec3 bottomLeft = cross(left, bottom);',\n\t\t\t'vec3 bottomRight = cross(bottom, right);',\n\t\t\n\t\t\t'gl_FragColor = vec4(normalize(topRight + topLeft + bottomLeft + bottomRight), 1.0);',\n\t\t'}'\n\t].join('\\n')\n};\nTHREE.ShaderLib['ocean_main'] = {\n\tuniforms: {\n\t\t\"u_displacementMap\": { type: \"t\", value: null },\n\t\t\"u_normalMap\": { type: \"t\", value: null },\n\t\t\"u_geometrySize\": { type: \"f\", value: null },\n\t\t\"u_size\": { type: \"f\", value: null },\n\t\t\"u_projectionMatrix\": { type: \"m4\", value: null },\n\t\t\"u_viewMatrix\": { type: \"m4\", value: null },\n\t\t\"u_cameraPosition\": { type: \"v3\", value: null },\n\t\t\"u_skyColor\": { type: \"v3\", value: null },\n\t\t\"u_oceanColor\": { type: \"v3\", value: null },\n\t\t\"u_sunDirection\": { type: \"v3\", value: null },\n\t\t\"u_exposure\": { type: \"f\", value: null },\n\t},\n\tvarying: {\n\t\t\"vPos\": { type: \"v3\" },\n\t\t\"vUV\": { type: \"v2\" }\n\t},\n\tvertexShader: [\n\t\t'precision highp float;',\n\t\t\n\t\t'varying vec3 vPos;',\n\t\t'varying vec2 vUV;',\n\n\t\t'uniform mat4 u_projectionMatrix;',\n\t\t'uniform mat4 u_viewMatrix;',\n\t\t'uniform float u_size;',\n\t\t'uniform float u_geometrySize;',\n\t\t'uniform sampler2D u_displacementMap;',\n\n\t\t'void main (void) {',\n\t\t\t'vec3 newPos = position + texture2D(u_displacementMap, uv).rgb * (u_geometrySize / u_size);',\n\t\t\t'vPos = newPos;',\n\t\t\t'vUV = uv;',\n\t\t\t'gl_Position = u_projectionMatrix * u_viewMatrix * vec4(newPos, 1.0);',\n\t\t'}'\n\t].join('\\n'),\n\tfragmentShader: [\n\t\t'precision highp float;',\n\n\t\t'varying vec3 vPos;',\n\t\t'varying vec2 vUV;',\n\n\t\t'uniform sampler2D u_displacementMap;',\n\t\t'uniform sampler2D u_normalMap;',\n\t\t'uniform vec3 u_cameraPosition;',\n\t\t'uniform vec3 u_oceanColor;',\n\t\t'uniform vec3 u_skyColor;',\n\t\t'uniform vec3 u_sunDirection;',\n\t\t'uniform float u_exposure;',\n\n\t\t'vec3 hdr (vec3 color, float exposure) {',\n\t\t\t'return 1.0 - exp(-color * exposure);',\n\t\t'}',\n\n\t\t'void main (void) {',\n\t\t\t'vec3 normal = texture2D(u_normalMap, vUV).rgb;',\n\n\t\t\t'vec3 view = normalize(u_cameraPosition - vPos);',\n\t\t\t'float fresnel = 0.02 + 0.98 * pow(1.0 - dot(normal, view), 5.0);',\n\t\t\t'vec3 sky = fresnel * u_skyColor;',\n\n\t\t\t'float diffuse = clamp(dot(normal, normalize(u_sunDirection)), 0.0, 1.0);',\n\t\t\t'vec3 water = (1.0 - fresnel) * u_oceanColor * u_skyColor * diffuse;',\n\n\t\t\t'vec3 color = sky + water;',\n\n\t\t\t'gl_FragColor = vec4(hdr(color, u_exposure), 1.0);',\n\t\t'}'\n\t].join('\\n')\n};"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/BokehShader2.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/BokehShader2.js",
"module-type": "library",
"text": "/**\n * @author zz85 / https://github.com/zz85 | twitter.com/blurspline\n *\n * Depth-of-field shader with bokeh\n * ported from GLSL shader by Martins Upitis\n * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update)\n *\n * Requires #define RINGS and SAMPLES integers\n */\n\n\n\nTHREE.BokehShader = {\n\n\tuniforms: {\n\n\t\t\"textureWidth\": { type: \"f\", value: 1.0 },\n\t\t\"textureHeight\": { type: \"f\", value: 1.0 },\n\n\t\t\"focalDepth\": { type: \"f\", value: 1.0 },\n\t\t\"focalLength\": { type: \"f\", value: 24.0 },\n\t\t\"fstop\": { type: \"f\", value: 0.9 },\n\n\t\t\"tColor\": { type: \"t\", value: null },\n\t\t\"tDepth\": { type: \"t\", value: null },\n\n\t\t\"maxblur\": { type: \"f\", value: 1.0 },\n\n\t\t\"showFocus\": { type: \"i\", value: 0 },\n\t\t\"manualdof\": { type: \"i\", value: 0 },\n\t\t\"vignetting\": { type: \"i\", value: 0 },\n\t\t\"depthblur\": { type: \"i\", value: 0 },\n\n\t\t\"threshold\": { type: \"f\", value: 0.5 },\n\t\t\"gain\": { type: \"f\", value: 2.0 },\n\t\t\"bias\": { type: \"f\", value: 0.5 },\n\t\t\"fringe\": { type: \"f\", value: 0.7 },\n\n\t\t\"znear\": { type: \"f\", value: 0.1 },\n\t\t\"zfar\": { type: \"f\", value: 100 },\n\n\t\t\"noise\": { type: \"i\", value: 1 },\n\t\t\"dithering\": { type: \"f\", value: 0.0001 },\n\t\t\"pentagon\": { type: \"i\", value: 0 },\n\n\t\t\"shaderFocus\": { type: \"i\", value: 1 },\n\t\t\"focusCoords\": { type: \"v2\", value: new THREE.Vector2()},\n\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"uniform sampler2D tColor;\",\n\t\t\"uniform sampler2D tDepth;\",\n\t\t\"uniform float textureWidth;\",\n\t\t\"uniform float textureHeight;\",\n\n\t\t\"const float PI = 3.14159265;\",\n\n\t\t\"float width = textureWidth; //texture width\",\n\t\t\"float height = textureHeight; //texture height\",\n\n\t\t\"vec2 texel = vec2(1.0/width,1.0/height);\",\n\n\t\t\"uniform float focalDepth; //focal distance value in meters, but you may use autofocus option below\",\n\t\t\"uniform float focalLength; //focal length in mm\",\n\t\t\"uniform float fstop; //f-stop value\",\n\t\t\"uniform bool showFocus; //show debug focus point and focal range (red = focal point, green = focal range)\",\n\n\t\t\"/*\",\n\t\t\"make sure that these two values are the same for your camera, otherwise distances will be wrong.\",\n\t\t\"*/\",\n\n\t\t\"uniform float znear; // camera clipping start\",\n\t\t\"uniform float zfar; // camera clipping end\",\n\n\t\t\"//------------------------------------------\",\n\t\t\"//user variables\",\n\n\t\t\"const int samples = SAMPLES; //samples on the first ring\",\n\t\t\"const int rings = RINGS; //ring count\",\n\n\t\t\"const int maxringsamples = rings * samples;\",\n\n\t\t\"uniform bool manualdof; // manual dof calculation\",\n\t\t\"float ndofstart = 1.0; // near dof blur start\",\n\t\t\"float ndofdist = 2.0; // near dof blur falloff distance\",\n\t\t\"float fdofstart = 1.0; // far dof blur start\",\n\t\t\"float fdofdist = 3.0; // far dof blur falloff distance\",\n\n\t\t\"float CoC = 0.03; //circle of confusion size in mm (35mm film = 0.03mm)\",\n\n\t\t\"uniform bool vignetting; // use optical lens vignetting\",\n\n\t\t\"float vignout = 1.3; // vignetting outer border\",\n\t\t\"float vignin = 0.0; // vignetting inner border\",\n\t\t\"float vignfade = 22.0; // f-stops till vignete fades\",\n\n\t\t\"uniform bool shaderFocus;\",\n\n\t\t\"bool autofocus = shaderFocus;\",\n\t\t\"//use autofocus in shader - use with focusCoords\",\n\t\t\"// disable if you use external focalDepth value\",\n\n\t\t\"uniform vec2 focusCoords;\",\n\t\t\"// autofocus point on screen (0.0,0.0 - left lower corner, 1.0,1.0 - upper right)\",\n\t\t\"// if center of screen use vec2(0.5, 0.5);\",\n\n\t\t\"uniform float maxblur;\",\n\t\t\"//clamp value of max blur (0.0 = no blur, 1.0 default)\",\n\n\t\t\"uniform float threshold; // highlight threshold;\",\n\t\t\"uniform float gain; // highlight gain;\",\n\n\t\t\"uniform float bias; // bokeh edge bias\",\n\t\t\"uniform float fringe; // bokeh chromatic aberration / fringing\",\n\n\t\t\"uniform bool noise; //use noise instead of pattern for sample dithering\",\n\n\t\t\"uniform float dithering;\",\n\t\t\"float namount = dithering; //dither amount\",\n\n\t\t\"uniform bool depthblur; // blur the depth buffer\",\n\t\t\"float dbsize = 1.25; // depth blur size\",\n\n\t\t\"/*\",\n\t\t\"next part is experimental\",\n\t\t\"not looking good with small sample and ring count\",\n\t\t\"looks okay starting from samples = 4, rings = 4\",\n\t\t\"*/\",\n\n\t\t\"uniform bool pentagon; //use pentagon as bokeh shape?\",\n\t\t\"float feather = 0.4; //pentagon shape feather\",\n\n\t\t\"//------------------------------------------\",\n\n\t\t\"float penta(vec2 coords) {\",\n\t\t\t\"//pentagonal shape\",\n\t\t\t\"float scale = float(rings) - 1.3;\",\n\t\t\t\"vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\",\n\t\t\t\"vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\",\n\t\t\t\"vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\",\n\t\t\t\"vec4 HS3 = vec4(-0.809016994,-0.587785252, 0.0, 1.0);\",\n\t\t\t\"vec4 HS4 = vec4( 0.309016994,-0.951056516, 0.0, 1.0);\",\n\t\t\t\"vec4 HS5 = vec4( 0.0 ,0.0 , 1.0, 1.0);\",\n\n\t\t\t\"vec4 one = vec4( 1.0 );\",\n\n\t\t\t\"vec4 P = vec4((coords),vec2(scale, scale));\",\n\n\t\t\t\"vec4 dist = vec4(0.0);\",\n\t\t\t\"float inorout = -4.0;\",\n\n\t\t\t\"dist.x = dot( P, HS0 );\",\n\t\t\t\"dist.y = dot( P, HS1 );\",\n\t\t\t\"dist.z = dot( P, HS2 );\",\n\t\t\t\"dist.w = dot( P, HS3 );\",\n\n\t\t\t\"dist = smoothstep( -feather, feather, dist );\",\n\n\t\t\t\"inorout += dot( dist, one );\",\n\n\t\t\t\"dist.x = dot( P, HS4 );\",\n\t\t\t\"dist.y = HS5.w - abs( P.z );\",\n\n\t\t\t\"dist = smoothstep( -feather, feather, dist );\",\n\t\t\t\"inorout += dist.x;\",\n\n\t\t\t\"return clamp( inorout, 0.0, 1.0 );\",\n\t\t\"}\",\n\n\t\t\"float bdepth(vec2 coords) {\",\n\t\t\t\"// Depth buffer blur\",\n\t\t\t\"float d = 0.0;\",\n\t\t\t\"float kernel[9];\",\n\t\t\t\"vec2 offset[9];\",\n\n\t\t\t\"vec2 wh = vec2(texel.x, texel.y) * dbsize;\",\n\n\t\t\t\"offset[0] = vec2(-wh.x,-wh.y);\",\n\t\t\t\"offset[1] = vec2( 0.0, -wh.y);\",\n\t\t\t\"offset[2] = vec2( wh.x -wh.y);\",\n\n\t\t\t\"offset[3] = vec2(-wh.x, 0.0);\",\n\t\t\t\"offset[4] = vec2( 0.0, 0.0);\",\n\t\t\t\"offset[5] = vec2( wh.x, 0.0);\",\n\n\t\t\t\"offset[6] = vec2(-wh.x, wh.y);\",\n\t\t\t\"offset[7] = vec2( 0.0, wh.y);\",\n\t\t\t\"offset[8] = vec2( wh.x, wh.y);\",\n\n\t\t\t\"kernel[0] = 1.0/16.0; kernel[1] = 2.0/16.0; kernel[2] = 1.0/16.0;\",\n\t\t\t\"kernel[3] = 2.0/16.0; kernel[4] = 4.0/16.0; kernel[5] = 2.0/16.0;\",\n\t\t\t\"kernel[6] = 1.0/16.0; kernel[7] = 2.0/16.0; kernel[8] = 1.0/16.0;\",\n\n\n\t\t\t\"for( int i=0; i<9; i++ ) {\",\n\t\t\t\t\"float tmp = texture2D(tDepth, coords + offset[i]).r;\",\n\t\t\t\t\"d += tmp * kernel[i];\",\n\t\t\t\"}\",\n\n\t\t\t\"return d;\",\n\t\t\"}\",\n\n\n\t\t\"vec3 color(vec2 coords,float blur) {\",\n\t\t\t\"//processing the sample\",\n\n\t\t\t\"vec3 col = vec3(0.0);\",\n\n\t\t\t\"col.r = texture2D(tColor,coords + vec2(0.0,1.0)*texel*fringe*blur).r;\",\n\t\t\t\"col.g = texture2D(tColor,coords + vec2(-0.866,-0.5)*texel*fringe*blur).g;\",\n\t\t\t\"col.b = texture2D(tColor,coords + vec2(0.866,-0.5)*texel*fringe*blur).b;\",\n\n\t\t\t\"vec3 lumcoeff = vec3(0.299,0.587,0.114);\",\n\t\t\t\"float lum = dot(col.rgb, lumcoeff);\",\n\t\t\t\"float thresh = max((lum-threshold)*gain, 0.0);\",\n\t\t\t\"return col+mix(vec3(0.0),col,thresh*blur);\",\n\t\t\"}\",\n\n\t\t\"vec2 rand(vec2 coord) {\",\n\t\t\t\"// generating noise / pattern texture for dithering\",\n\n\t\t\t\"float noiseX = ((fract(1.0-coord.s*(width/2.0))*0.25)+(fract(coord.t*(height/2.0))*0.75))*2.0-1.0;\",\n\t\t\t\"float noiseY = ((fract(1.0-coord.s*(width/2.0))*0.75)+(fract(coord.t*(height/2.0))*0.25))*2.0-1.0;\",\n\n\t\t\t\"if (noise) {\",\n\t\t\t\t\"noiseX = clamp(fract(sin(dot(coord ,vec2(12.9898,78.233))) * 43758.5453),0.0,1.0)*2.0-1.0;\",\n\t\t\t\t\"noiseY = clamp(fract(sin(dot(coord ,vec2(12.9898,78.233)*2.0)) * 43758.5453),0.0,1.0)*2.0-1.0;\",\n\t\t\t\"}\",\n\n\t\t\t\"return vec2(noiseX,noiseY);\",\n\t\t\"}\",\n\n\t\t\"vec3 debugFocus(vec3 col, float blur, float depth) {\",\n\t\t\t\"float edge = 0.002*depth; //distance based edge smoothing\",\n\t\t\t\"float m = clamp(smoothstep(0.0,edge,blur),0.0,1.0);\",\n\t\t\t\"float e = clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);\",\n\n\t\t\t\"col = mix(col,vec3(1.0,0.5,0.0),(1.0-m)*0.6);\",\n\t\t\t\"col = mix(col,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);\",\n\n\t\t\t\"return col;\",\n\t\t\"}\",\n\n\t\t\"float linearize(float depth) {\",\n\t\t\t\"return -zfar * znear / (depth * (zfar - znear) - zfar);\",\n\t\t\"}\",\n\n\n\t\t\"float vignette() {\",\n\t\t\t\"float dist = distance(vUv.xy, vec2(0.5,0.5));\",\n\t\t\t\"dist = smoothstep(vignout+(fstop/vignfade), vignin+(fstop/vignfade), dist);\",\n\t\t\t\"return clamp(dist,0.0,1.0);\",\n\t\t\"}\",\n\n\t\t\"float gather(float i, float j, int ringsamples, inout vec3 col, float w, float h, float blur) {\",\n\t\t\t\"float rings2 = float(rings);\",\n\t\t\t\"float step = PI*2.0 / float(ringsamples);\",\n\t\t\t\"float pw = cos(j*step)*i;\",\n\t\t\t\"float ph = sin(j*step)*i;\",\n\t\t\t\"float p = 1.0;\",\n\t\t\t\"if (pentagon) {\",\n\t\t\t\t\"p = penta(vec2(pw,ph));\",\n\t\t\t\"}\",\n\t\t\t\"col += color(vUv.xy + vec2(pw*w,ph*h), blur) * mix(1.0, i/rings2, bias) * p;\",\n\t\t\t\"return 1.0 * mix(1.0, i /rings2, bias) * p;\",\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\t\t\t\"//scene depth calculation\",\n\n\t\t\t\"float depth = linearize(texture2D(tDepth,vUv.xy).x);\",\n\n\t\t\t\"// Blur depth?\",\n\t\t\t\"if (depthblur) {\",\n\t\t\t\t\"depth = linearize(bdepth(vUv.xy));\",\n\t\t\t\"}\",\n\n\t\t\t\"//focal plane calculation\",\n\n\t\t\t\"float fDepth = focalDepth;\",\n\n\t\t\t\"if (autofocus) {\",\n\n\t\t\t\t\"fDepth = linearize(texture2D(tDepth,focusCoords).x);\",\n\n\t\t\t\"}\",\n\n\t\t\t\"// dof blur factor calculation\",\n\n\t\t\t\"float blur = 0.0;\",\n\n\t\t\t\"if (manualdof) {\",\n\t\t\t\t\"float a = depth-fDepth; // Focal plane\",\n\t\t\t\t\"float b = (a-fdofstart)/fdofdist; // Far DoF\",\n\t\t\t\t\"float c = (-a-ndofstart)/ndofdist; // Near Dof\",\n\t\t\t\t\"blur = (a>0.0) ? b : c;\",\n\t\t\t\"} else {\",\n\t\t\t\t\"float f = focalLength; // focal length in mm\",\n\t\t\t\t\"float d = fDepth*1000.0; // focal plane in mm\",\n\t\t\t\t\"float o = depth*1000.0; // depth in mm\",\n\n\t\t\t\t\"float a = (o*f)/(o-f);\",\n\t\t\t\t\"float b = (d*f)/(d-f);\",\n\t\t\t\t\"float c = (d-f)/(d*fstop*CoC);\",\n\n\t\t\t\t\"blur = abs(a-b)*c;\",\n\t\t\t\"}\",\n\n\t\t\t\"blur = clamp(blur,0.0,1.0);\",\n\n\t\t\t\"// calculation of pattern for dithering\",\n\n\t\t\t\"vec2 noise = rand(vUv.xy)*namount*blur;\",\n\n\t\t\t\"// getting blur x and y step factor\",\n\n\t\t\t\"float w = (1.0/width)*blur*maxblur+noise.x;\",\n\t\t\t\"float h = (1.0/height)*blur*maxblur+noise.y;\",\n\n\t\t\t\"// calculation of final color\",\n\n\t\t\t\"vec3 col = vec3(0.0);\",\n\n\t\t\t\"if(blur < 0.05) {\",\n\t\t\t\t\"//some optimization thingy\",\n\t\t\t\t\"col = texture2D(tColor, vUv.xy).rgb;\",\n\t\t\t\"} else {\",\n\t\t\t\t\"col = texture2D(tColor, vUv.xy).rgb;\",\n\t\t\t\t\"float s = 1.0;\",\n\t\t\t\t\"int ringsamples;\",\n\n\t\t\t\t\"for (int i = 1; i <= rings; i++) {\",\n\t\t\t\t\t\"/*unboxstart*/\",\n\t\t\t\t\t\"ringsamples = i * samples;\",\n\n\t\t\t\t\t\"for (int j = 0 ; j < maxringsamples ; j++) {\",\n\t\t\t\t\t\t\"if (j >= ringsamples) break;\",\n\t\t\t\t\t\t\"s += gather(float(i), float(j), ringsamples, col, w, h, blur);\",\n\t\t\t\t\t\"}\",\n\t\t\t\t\t\"/*unboxend*/\",\n\t\t\t\t\"}\",\n\n\t\t\t\t\"col /= s; //divide by sample count\",\n\t\t\t\"}\",\n\n\t\t\t\"if (showFocus) {\",\n\t\t\t\t\"col = debugFocus(col, blur, depth);\",\n\t\t\t\"}\",\n\n\t\t\t\"if (vignetting) {\",\n\t\t\t\t\"col *= vignette();\",\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor.rgb = col;\",\n\t\t\t\"gl_FragColor.a = 1.0;\",\n\t\t\"} \"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/EdgeShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/EdgeShader.js",
"module-type": "library",
"text": "/**\n * @author zz85 / https://github.com/zz85 | https://www.lab4games.net/zz85/blog\n *\n * Edge Detection Shader using Frei-Chen filter\n * Based on http://rastergrid.com/blog/2011/01/frei-chen-edge-detector\n *\n * aspect: vec2 of (1/width, 1/height)\n */\n\nTHREE.EdgeShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"aspect\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"uniform vec2 aspect;\",\n\n\t\t\"vec2 texel = vec2(1.0 / aspect.x, 1.0 / aspect.y);\",\n\n\n\t\t\"mat3 G[9];\",\n\n\t\t// hard coded matrix values!!!! as suggested in https://github.com/neilmendoza/ofxPostProcessing/blob/master/src/EdgePass.cpp#L45\n\n\t\t\"const mat3 g0 = mat3( 0.3535533845424652, 0, -0.3535533845424652, 0.5, 0, -0.5, 0.3535533845424652, 0, -0.3535533845424652 );\",\n\t\t\"const mat3 g1 = mat3( 0.3535533845424652, 0.5, 0.3535533845424652, 0, 0, 0, -0.3535533845424652, -0.5, -0.3535533845424652 );\",\n\t\t\"const mat3 g2 = mat3( 0, 0.3535533845424652, -0.5, -0.3535533845424652, 0, 0.3535533845424652, 0.5, -0.3535533845424652, 0 );\",\n\t\t\"const mat3 g3 = mat3( 0.5, -0.3535533845424652, 0, -0.3535533845424652, 0, 0.3535533845424652, 0, 0.3535533845424652, -0.5 );\",\n\t\t\"const mat3 g4 = mat3( 0, -0.5, 0, 0.5, 0, 0.5, 0, -0.5, 0 );\",\n\t\t\"const mat3 g5 = mat3( -0.5, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5 );\",\n\t\t\"const mat3 g6 = mat3( 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.6666666865348816, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204 );\",\n\t\t\"const mat3 g7 = mat3( -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, 0.6666666865348816, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408 );\",\n\t\t\"const mat3 g8 = mat3( 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408 );\",\n\n\t\t\"void main(void)\",\n\t\t\"{\",\n\n\t\t\t\"G[0] = g0,\",\n\t\t\t\"G[1] = g1,\",\n\t\t\t\"G[2] = g2,\",\n\t\t\t\"G[3] = g3,\",\n\t\t\t\"G[4] = g4,\",\n\t\t\t\"G[5] = g5,\",\n\t\t\t\"G[6] = g6,\",\n\t\t\t\"G[7] = g7,\",\n\t\t\t\"G[8] = g8;\",\n\n\t\t\t\"mat3 I;\",\n\t\t\t\"float cnv[9];\",\n\t\t\t\"vec3 sample;\",\n\n\t\t\t/* fetch the 3x3 neighbourhood and use the RGB vector's length as intensity value */\n\t\t\t\"for (float i=0.0; i<3.0; i++) {\",\n\t\t\t\t\"for (float j=0.0; j<3.0; j++) {\",\n\t\t\t\t\t\"sample = texture2D(tDiffuse, vUv + texel * vec2(i-1.0,j-1.0) ).rgb;\",\n\t\t\t\t\t\"I[int(i)][int(j)] = length(sample);\",\n\t\t\t\t\"}\",\n\t\t\t\"}\",\n\n\t\t\t/* calculate the convolution values for all the masks */\n\t\t\t\"for (int i=0; i<9; i++) {\",\n\t\t\t\t\"float dp3 = dot(G[i][0], I[0]) + dot(G[i][1], I[1]) + dot(G[i][2], I[2]);\",\n\t\t\t\t\"cnv[i] = dp3 * dp3;\",\n\t\t\t\"}\",\n\n\t\t\t\"float M = (cnv[0] + cnv[1]) + (cnv[2] + cnv[3]);\",\n\t\t\t\"float S = (cnv[4] + cnv[5]) + (cnv[6] + cnv[7]) + (cnv[8] + M);\",\n\n\t\t\t\"gl_FragColor = vec4(vec3(sqrt(M/S)), 1.0);\",\n\t\t\"}\",\n\n\t].join(\"\\n\")\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/EdgeShader2.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/EdgeShader2.js",
"module-type": "library",
"text": "/**\n * @author zz85 / https://github.com/zz85 | https://www.lab4games.net/zz85/blog\n *\n * Edge Detection Shader using Sobel filter\n * Based on http://rastergrid.com/blog/2011/01/frei-chen-edge-detector\n *\n * aspect: vec2 of (1/width, 1/height)\n */\n\nTHREE.EdgeShader2 = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"aspect\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"varying vec2 vUv;\",\n\t\t\"uniform vec2 aspect;\",\n\n\n\t\t\"vec2 texel = vec2(1.0 / aspect.x, 1.0 / aspect.y);\",\n\n\t\t\"mat3 G[2];\",\n\n\t\t\"const mat3 g0 = mat3( 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, -1.0, -2.0, -1.0 );\",\n\t\t\"const mat3 g1 = mat3( 1.0, 0.0, -1.0, 2.0, 0.0, -2.0, 1.0, 0.0, -1.0 );\",\n\n\n\t\t\"void main(void)\",\n\t\t\"{\",\n\t\t\t\"mat3 I;\",\n\t\t\t\"float cnv[2];\",\n\t\t\t\"vec3 sample;\",\n\n\t\t\t\"G[0] = g0;\",\n\t\t\t\"G[1] = g1;\",\n\n\t\t\t/* fetch the 3x3 neighbourhood and use the RGB vector's length as intensity value */\n\t\t\t\"for (float i=0.0; i<3.0; i++)\",\n\t\t\t\"for (float j=0.0; j<3.0; j++) {\",\n\t\t\t\t\"sample = texture2D( tDiffuse, vUv + texel * vec2(i-1.0,j-1.0) ).rgb;\",\n\t\t\t\t\"I[int(i)][int(j)] = length(sample);\",\n\t\t\t\"}\",\n\n\t\t\t/* calculate the convolution values for all the masks */\n\t\t\t\"for (int i=0; i<2; i++) {\",\n\t\t\t\t\"float dp3 = dot(G[i][0], I[0]) + dot(G[i][1], I[1]) + dot(G[i][2], I[2]);\",\n\t\t\t\t\"cnv[i] = dp3 * dp3; \",\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = vec4(0.5 * sqrt(cnv[0]*cnv[0]+cnv[1]*cnv[1]));\",\n\t\t\"} \",\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/ConvolutionShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/ConvolutionShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Convolution shader\n * ported from o3d sample to WebGL / GLSL\n * http://o3d.googlecode.com/svn/trunk/samples/convolution.html\n */\n\nTHREE.ConvolutionShader = {\n\n\tdefines: {\n\n\t\t\"KERNEL_SIZE_FLOAT\": \"25.0\",\n\t\t\"KERNEL_SIZE_INT\": \"25\",\n\n\t},\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"uImageIncrement\": { type: \"v2\", value: new THREE.Vector2( 0.001953125, 0.0 ) },\n\t\t\"cKernel\": { type: \"fv1\", value: [] }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float cKernel[ KERNEL_SIZE_INT ];\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform vec2 uImageIncrement;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec2 imageCoord = vUv;\",\n\t\t\t\"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\"for( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {\",\n\n\t\t\t\t\"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\",\n\t\t\t\t\"imageCoord += uImageIncrement;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\"}\"\n\n\n\t].join(\"\\n\"),\n\n\tbuildKernel: function ( sigma ) {\n\n\t\t// We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\t\tfunction gauss( x, sigma ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n\t\t}\n\n\t\tvar i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\t\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\t\thalfWidth = ( kernelSize - 1 ) * 0.5;\n\n\t\tvalues = new Array( kernelSize );\n\t\tsum = 0.0;\n\t\tfor ( i = 0; i < kernelSize; ++i ) {\n\n\t\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\t\tsum += values[ i ];\n\n\t\t}\n\n\t\t// normalize the kernel\n\n\t\tfor ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum;\n\n\t\treturn values;\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/UnpackDepthRGBAShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/UnpackDepthRGBAShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Unpack RGBA depth shader\n * - show RGBA encoded depth as monochrome color\n */\n\nTHREE.UnpackDepthRGBAShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"opacity\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t// RGBA depth\n\n\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\"return depth;\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\t\"gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/BokehShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/BokehShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Depth-of-field shader with bokeh\n * ported from GLSL shader by Martins Upitis\n * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\n */\n\nTHREE.BokehShader = {\n\n\tuniforms: {\n\n\t\t\"tColor\": { type: \"t\", value: null },\n\t\t\"tDepth\": { type: \"t\", value: null },\n\t\t\"focus\": { type: \"f\", value: 1.0 },\n\t\t\"aspect\": { type: \"f\", value: 1.0 },\n\t\t\"aperture\": { type: \"f\", value: 0.025 },\n\t\t\"maxblur\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"uniform sampler2D tColor;\",\n\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\"uniform float maxblur;\", // max blur amount\n\t\t\"uniform float aperture;\", // aperture - bigger values for shallower depth of field\n\n\t\t\"uniform float focus;\",\n\t\t\"uniform float aspect;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec2 aspectcorrect = vec2( 1.0, aspect );\",\n\n\t\t\t\"vec4 depth1 = texture2D( tDepth, vUv );\",\n\n\t\t\t\"float factor = depth1.x - focus;\",\n\n\t\t\t\"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\",\n\n\t\t\t\"vec2 dofblur9 = dofblur * 0.9;\",\n\t\t\t\"vec2 dofblur7 = dofblur * 0.7;\",\n\t\t\t\"vec2 dofblur4 = dofblur * 0.4;\",\n\n\t\t\t\"vec4 col = vec4( 0.0 );\",\n\n\t\t\t\"col += texture2D( tColor, vUv.xy );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.15, 0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, 0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.40, 0.0 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, 0.37 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.37, 0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.15, -0.37 ) * aspectcorrect ) * dofblur );\",\n\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.15, 0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, 0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, 0.37 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.37, 0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\",\n\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.40, 0.0 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur7 );\",\n\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.4, 0.0 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\",\n\t\t\t\"col += texture2D( tColor, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur4 );\",\n\n\t\t\t\"gl_FragColor = col / 41.0;\",\n\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/HorizontalTiltShiftShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/HorizontalTiltShiftShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Simple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n * - \"r\" parameter control where \"focused\" horizontal line lies\n */\n\nTHREE.HorizontalTiltShiftShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"h\": { type: \"f\", value: 1.0 / 512.0 },\n\t\t\"r\": { type: \"f\", value: 0.35 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float h;\",\n\t\t\"uniform float r;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\"float hh = h * abs( r - vUv.y );\",\n\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\",\n\n\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/BrightnessContrastShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/BrightnessContrastShader.js",
"module-type": "library",
"text": "/**\n * @author tapio / http://tapio.github.com/\n *\n * Brightness and contrast adjustment\n * https://github.com/evanw/glfx.js\n * brightness: -1 to 1 (-1 is solid black, 0 is no change, and 1 is solid white)\n * contrast: -1 to 1 (-1 is solid gray, 0 is no change, and 1 is maximum contrast)\n */\n\nTHREE.BrightnessContrastShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"brightness\": { type: \"f\", value: 0 },\n\t\t\"contrast\": { type: \"f\", value: 0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float brightness;\",\n\t\t\"uniform float contrast;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\"gl_FragColor.rgb += brightness;\",\n\n\t\t\t\"if (contrast > 0.0) {\",\n\t\t\t\t\"gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5;\",\n\t\t\t\"} else {\",\n\t\t\t\t\"gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;\",\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/DigitalGlitch.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/DigitalGlitch.js",
"module-type": "library",
"text": "/**\n * @author felixturner / http://airtight.cc/\n *\n * RGB Shift Shader\n * Shifts red and blue channels from center in opposite directions\n * Ported from http://kriss.cx/tom/2009/05/rgb-shift/\n * by Tom Butterworth / http://kriss.cx/tom/\n *\n * amount: shift distance (1 is width of input)\n * angle: shift angle in radians\n */\n\nTHREE.DigitalGlitch = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\":\t\t{ type: \"t\", value: null },//diffuse texture\n\t\t\"tDisp\":\t\t{ type: \"t\", value: null },//displacement texture for digital glitch squares\n\t\t\"byp\":\t\t\t{ type: \"i\", value: 0 },//apply the glitch ?\n\t\t\"amount\":\t\t{ type: \"f\", value: 0.08 },\n\t\t\"angle\":\t\t{ type: \"f\", value: 0.02 },\n\t\t\"seed\":\t\t\t{ type: \"f\", value: 0.02 },\n\t\t\"seed_x\":\t\t{ type: \"f\", value: 0.02 },//-1,1\n\t\t\"seed_y\":\t\t{ type: \"f\", value: 0.02 },//-1,1\n\t\t\"distortion_x\":\t{ type: \"f\", value: 0.5 },\n\t\t\"distortion_y\":\t{ type: \"f\", value: 0.6 },\n\t\t\"col_s\":\t\t{ type: \"f\", value: 0.05 }\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"void main() {\",\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"}\"\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\t\t\"uniform int byp;\",//should we apply the glitch ?\n\t\t\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform sampler2D tDisp;\",\n\t\t\n\t\t\"uniform float amount;\",\n\t\t\"uniform float angle;\",\n\t\t\"uniform float seed;\",\n\t\t\"uniform float seed_x;\",\n\t\t\"uniform float seed_y;\",\n\t\t\"uniform float distortion_x;\",\n\t\t\"uniform float distortion_y;\",\n\t\t\"uniform float col_s;\",\n\t\t\t\n\t\t\"varying vec2 vUv;\",\n\t\t\n\t\t\n\t\t\"float rand(vec2 co){\",\n\t\t\t\"return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\",\n\t\t\"}\",\n\t\t\t\t\n\t\t\"void main() {\",\n\t\t\t\"if(byp<1) {\",\n\t\t\t\t\"vec2 p = vUv;\",\n\t\t\t\t\"float xs = floor(gl_FragCoord.x / 0.5);\",\n\t\t\t\t\"float ys = floor(gl_FragCoord.y / 0.5);\",\n\t\t\t\t//based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch\n\t\t\t\t\"vec4 normal = texture2D (tDisp, p*seed*seed);\",\n\t\t\t\t\"if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {\",\n\t\t\t\t\t\"if(seed_x>0.){\",\n\t\t\t\t\t\t\"p.y = 1. - (p.y + distortion_y);\",\n\t\t\t\t\t\"}\",\n\t\t\t\t\t\"else {\",\n\t\t\t\t\t\t\"p.y = distortion_y;\",\n\t\t\t\t\t\"}\",\n\t\t\t\t\"}\",\n\t\t\t\t\"if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {\",\n\t\t\t\t\t\"if(seed_y>0.){\",\n\t\t\t\t\t\t\"p.x=distortion_x;\",\n\t\t\t\t\t\"}\",\n\t\t\t\t\t\"else {\",\n\t\t\t\t\t\t\"p.x = 1. - (p.x + distortion_x);\",\n\t\t\t\t\t\"}\",\n\t\t\t\t\"}\",\n\t\t\t\t\"p.x+=normal.x*seed_x*(seed/5.);\",\n\t\t\t\t\"p.y+=normal.y*seed_y*(seed/5.);\",\n\t\t\t\t//base from RGB shift shader\n\t\t\t\t\"vec2 offset = amount * vec2( cos(angle), sin(angle));\",\n\t\t\t\t\"vec4 cr = texture2D(tDiffuse, p + offset);\",\n\t\t\t\t\"vec4 cga = texture2D(tDiffuse, p);\",\n\t\t\t\t\"vec4 cb = texture2D(tDiffuse, p - offset);\",\n\t\t\t\t\"gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);\",\n\t\t\t\t//add noise\n\t\t\t\t\"vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);\",\n\t\t\t\t\"gl_FragColor = gl_FragColor+ snow;\",\n\t\t\t\"}\",\n\t\t\t\"else {\",\n\t\t\t\t\"gl_FragColor=texture2D (tDiffuse, vUv);\",\n\t\t\t\"}\",\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/KaleidoShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/KaleidoShader.js",
"module-type": "library",
"text": "/**\n * @author felixturner / http://airtight.cc/\n *\n * Kaleidoscope Shader\n * Radial reflection around center point\n * Ported from: http://pixelshaders.com/editor/\n * by Toby Schachman / http://tobyschachman.com/\n *\n * sides: number of reflections\n * angle: initial angle in radians\n */\n\nTHREE.KaleidoShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"sides\": { type: \"f\", value: 6.0 },\n\t\t\"angle\": { type: \"f\", value: 0.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float sides;\",\n\t\t\"uniform float angle;\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec2 p = vUv - 0.5;\",\n\t\t\t\"float r = length(p);\",\n\t\t\t\"float a = atan(p.y, p.x) + angle;\",\n\t\t\t\"float tau = 2. * 3.1416 ;\",\n\t\t\t\"a = mod(a, tau/sides);\",\n\t\t\t\"a = abs(a - tau/sides/2.) ;\",\n\t\t\t\"p = r * vec2(cos(a), sin(a));\",\n\t\t\t\"vec4 color = texture2D(tDiffuse, p + 0.5);\",\n\t\t\t\"gl_FragColor = color;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/VerticalBlurShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/VerticalBlurShader.js",
"module-type": "library",
"text": "/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n * and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nTHREE.VerticalBlurShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"v\": { type: \"f\", value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float v;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\",\n\n\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/NormalMapShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/NormalMapShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Normal map shader\n * - compute normals from heightmap\n */\n\nTHREE.NormalMapShader = {\n\n\tuniforms: {\n\n\t\t\"heightMap\": { type: \"t\", value: null },\n\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\"scale\": { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\"height\": { type: \"f\", value: 0.05 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float height;\",\n\t\t\"uniform vec2 resolution;\",\n\t\t\"uniform sampler2D heightMap;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"float val = texture2D( heightMap, vUv ).x;\",\n\n\t\t\t\"float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\",\n\t\t\t\"float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\",\n\n\t\t\t\"gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height ) ) + 0.5 ), 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/ColorifyShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/ColorifyShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Colorify shader\n */\n\nTHREE.ColorifyShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"color\": { type: \"c\", value: new THREE.Color( 0xffffff ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform vec3 color;\",\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\"gl_FragColor = vec4( v * color, texel.w );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/TechnicolorShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/TechnicolorShader.js",
"module-type": "library",
"text": "/**\n * @author flimshaw / http://charliehoey.com\n *\n * Technicolor Shader\n * Simulates the look of the two-strip technicolor process popular in early 20th century films.\n * More historical info here: http://www.widescreenmuseum.com/oldcolor/technicolor1.htm\n * Demo here: http://charliehoey.com/technicolor_shader/shader_test.html\n */\n\nTHREE.TechnicolorShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 tex = texture2D( tDiffuse, vec2( vUv.x, vUv.y ) );\",\n\t\t\t\"vec4 newTex = vec4(tex.r, (tex.g + tex.b) * .5, (tex.g + tex.b) * .5, 1.0);\",\n\n\t\t\t\"gl_FragColor = newTex;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/DotScreenShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/DotScreenShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Dot screen shader\n * based on glfx.js sepia shader\n * https://github.com/evanw/glfx.js\n */\n\nTHREE.DotScreenShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"tSize\": { type: \"v2\", value: new THREE.Vector2( 256, 256 ) },\n\t\t\"center\": { type: \"v2\", value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\"angle\": { type: \"f\", value: 1.57 },\n\t\t\"scale\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform vec2 center;\",\n\t\t\"uniform float angle;\",\n\t\t\"uniform float scale;\",\n\t\t\"uniform vec2 tSize;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float pattern() {\",\n\n\t\t\t\"float s = sin( angle ), c = cos( angle );\",\n\n\t\t\t\"vec2 tex = vUv * tSize - center;\",\n\t\t\t\"vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\",\n\n\t\t\t\"return ( sin( point.x ) * sin( point.y ) ) * 4.0;\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\"float average = ( color.r + color.g + color.b ) / 3.0;\",\n\n\t\t\t\"gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/LuminosityShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/LuminosityShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Luminosity\n * http://en.wikipedia.org/wiki/Luminosity\n */\n\nTHREE.LuminosityShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\"float v = dot( texel.xyz, luma );\",\n\n\t\t\t\"gl_FragColor = vec4( v, v, v, texel.w );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/HorizontalBlurShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/HorizontalBlurShader.js",
"module-type": "library",
"text": "/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/\n * and used in http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nTHREE.HorizontalBlurShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"h\": { type: \"f\", value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float h;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\",\n\n\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/FilmShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/FilmShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Film grain & scanlines shader\n *\n * - ported from HLSL to WebGL / GLSL\n * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\n *\n * Screen Space Static Postprocessor\n *\n * Produces an analogue noise overlay similar to a film grain / TV static\n *\n * Original implementation and noise algorithm\n * Pat 'Hawthorne' Shearon\n *\n * Optimized scanlines + noise version with intensity scaling\n * Georg 'Leviathan' Steinrohder\n *\n * This version is provided under a Creative Commons Attribution 3.0 License\n * http://creativecommons.org/licenses/by/3.0/\n */\n\nTHREE.FilmShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"time\": { type: \"f\", value: 0.0 },\n\t\t\"nIntensity\": { type: \"f\", value: 0.5 },\n\t\t\"sIntensity\": { type: \"f\", value: 0.05 },\n\t\t\"sCount\": { type: \"f\", value: 4096 },\n\t\t\"grayscale\": { type: \"i\", value: 1 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t// control parameter\n\t\t\"uniform float time;\",\n\n\t\t\"uniform bool grayscale;\",\n\n\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\t\"uniform float nIntensity;\",\n\n\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\t\"uniform float sIntensity;\",\n\n\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\t\"uniform float sCount;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t// sample the source\n\t\t\t\"vec4 cTextureScreen = texture2D( tDiffuse, vUv );\",\n\n\t\t\t// make some noise\n\t\t\t\"float x = vUv.x * vUv.y * time * 1000.0;\",\n\t\t\t\"x = mod( x, 13.0 ) * mod( x, 123.0 );\",\n\t\t\t\"float dx = mod( x, 0.01 );\",\n\n\t\t\t// add noise\n\t\t\t\"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\",\n\n\t\t\t// get us a sine and cosine\n\t\t\t\"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\",\n\n\t\t\t// add scanlines\n\t\t\t\"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\",\n\n\t\t\t// interpolate between source and result by intensity\n\t\t\t\"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\",\n\n\t\t\t// convert to grayscale if desired\n\t\t\t\"if( grayscale ) {\",\n\n\t\t\t\t\"cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = vec4( cResult, cTextureScreen.a );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/FresnelShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/FresnelShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Based on Nvidia Cg tutorial\n */\n\nTHREE.FresnelShader = {\n\n\tuniforms: {\n\n\t\t\"mRefractionRatio\": { type: \"f\", value: 1.02 },\n\t\t\"mFresnelBias\": { type: \"f\", value: 0.1 },\n\t\t\"mFresnelPower\": { type: \"f\", value: 2.0 },\n\t\t\"mFresnelScale\": { type: \"f\", value: 1.0 },\n\t\t\"tCube\": { type: \"t\", value: null }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"uniform float mRefractionRatio;\",\n\t\t\"uniform float mFresnelBias;\",\n\t\t\"uniform float mFresnelScale;\",\n\t\t\"uniform float mFresnelPower;\",\n\n\t\t\"varying vec3 vReflect;\",\n\t\t\"varying vec3 vRefract[3];\",\n\t\t\"varying float vReflectionFactor;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"vec3 worldNormal = normalize( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );\",\n\n\t\t\t\"vec3 I = worldPosition.xyz - cameraPosition;\",\n\n\t\t\t\"vReflect = reflect( I, worldNormal );\",\n\t\t\t\"vRefract[0] = refract( normalize( I ), worldNormal, mRefractionRatio );\",\n\t\t\t\"vRefract[1] = refract( normalize( I ), worldNormal, mRefractionRatio * 0.99 );\",\n\t\t\t\"vRefract[2] = refract( normalize( I ), worldNormal, mRefractionRatio * 0.98 );\",\n\t\t\t\"vReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), worldNormal ), mFresnelPower );\",\n\n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform samplerCube tCube;\",\n\n\t\t\"varying vec3 vReflect;\",\n\t\t\"varying vec3 vRefract[3];\",\n\t\t\"varying float vReflectionFactor;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\",\n\t\t\t\"vec4 refractedColor = vec4( 1.0 );\",\n\n\t\t\t\"refractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\",\n\t\t\t\"refractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\",\n\t\t\t\"refractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\",\n\n\t\t\t\"gl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/MirrorShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/MirrorShader.js",
"module-type": "library",
"text": "/**\n * @author felixturner / http://airtight.cc/\n *\n * Mirror Shader\n * Copies half the input to the other half\n *\n * side: side of input to mirror (0 = left, 1 = right, 2 = top, 3 = bottom)\n */\n\nTHREE.MirrorShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"side\": { type: \"i\", value: 1 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform int side;\",\n\t\t\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec2 p = vUv;\",\n\t\t\t\"if (side == 0){\",\n\t\t\t\t\"if (p.x > 0.5) p.x = 1.0 - p.x;\",\n\t\t\t\"}else if (side == 1){\",\n\t\t\t\t\"if (p.x < 0.5) p.x = 1.0 - p.x;\",\n\t\t\t\"}else if (side == 2){\",\n\t\t\t\t\"if (p.y < 0.5) p.y = 1.0 - p.y;\",\n\t\t\t\"}else if (side == 3){\",\n\t\t\t\t\"if (p.y > 0.5) p.y = 1.0 - p.y;\",\n\t\t\t\"} \",\n\t\t\t\"vec4 color = texture2D(tDiffuse, p);\",\n\t\t\t\"gl_FragColor = color;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/DOFMipMapShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/DOFMipMapShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Depth-of-field shader using mipmaps\n * - from Matt Handley @applmak\n * - requires power-of-2 sized render target with enabled mipmaps\n */\n\nTHREE.DOFMipMapShader = {\n\n\tuniforms: {\n\n\t\t\"tColor\": { type: \"t\", value: null },\n\t\t\"tDepth\": { type: \"t\", value: null },\n\t\t\"focus\": { type: \"f\", value: 1.0 },\n\t\t\"maxblur\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float focus;\",\n\t\t\"uniform float maxblur;\",\n\n\t\t\"uniform sampler2D tColor;\",\n\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 depth = texture2D( tDepth, vUv );\",\n\n\t\t\t\"float factor = depth.x - focus;\",\n\n\t\t\t\"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\",\n\n\t\t\t\"gl_FragColor = col;\",\n\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/HueSaturationShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/HueSaturationShader.js",
"module-type": "library",
"text": "/**\n * @author tapio / http://tapio.github.com/\n *\n * Hue and saturation adjustment\n * https://github.com/evanw/glfx.js\n * hue: -1 to 1 (-1 is 180 degrees in the negative direction, 0 is no change, etc.\n * saturation: -1 to 1 (-1 is solid gray, 0 is no change, and 1 is maximum contrast)\n */\n\nTHREE.HueSaturationShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"hue\": { type: \"f\", value: 0 },\n\t\t\"saturation\": { type: \"f\", value: 0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float hue;\",\n\t\t\"uniform float saturation;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\n\t\t\t// hue\n\t\t\t\"float angle = hue * 3.14159265;\",\n\t\t\t\"float s = sin(angle), c = cos(angle);\",\n\t\t\t\"vec3 weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c) + 1.0) / 3.0;\",\n\t\t\t\"float len = length(gl_FragColor.rgb);\",\n\t\t\t\"gl_FragColor.rgb = vec3(\",\n\t\t\t\t\"dot(gl_FragColor.rgb, weights.xyz),\",\n\t\t\t\t\"dot(gl_FragColor.rgb, weights.zxy),\",\n\t\t\t\t\"dot(gl_FragColor.rgb, weights.yzx)\",\n\t\t\t\");\",\n\n\t\t\t// saturation\n\t\t\t\"float average = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / 3.0;\",\n\t\t\t\"if (saturation > 0.0) {\",\n\t\t\t\t\"gl_FragColor.rgb += (average - gl_FragColor.rgb) * (1.0 - 1.0 / (1.001 - saturation));\",\n\t\t\t\"} else {\",\n\t\t\t\t\"gl_FragColor.rgb += (average - gl_FragColor.rgb) * (-saturation);\",\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/FXAAShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/FXAAShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author davidedc / http://www.sketchpatch.net/\n *\n * NVIDIA FXAA by Timothy Lottes\n * http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n * - WebGL port by @supereggbert\n * http://www.glge.org/demos/fxaa/\n */\n\nTHREE.FXAAShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"resolution\": { type: \"v2\", value: new THREE.Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform vec2 resolution;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"#define FXAA_REDUCE_MIN (1.0/128.0)\",\n\t\t\"#define FXAA_REDUCE_MUL (1.0/8.0)\",\n\t\t\"#define FXAA_SPAN_MAX 8.0\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\"vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;\",\n\t\t\t\"vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\"vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;\",\n\t\t\t\"vec4 rgbaM = texture2D( tDiffuse, gl_FragCoord.xy * resolution );\",\n\t\t\t\"vec3 rgbM = rgbaM.xyz;\",\n\t\t\t\"vec3 luma = vec3( 0.299, 0.587, 0.114 );\",\n\n\t\t\t\"float lumaNW = dot( rgbNW, luma );\",\n\t\t\t\"float lumaNE = dot( rgbNE, luma );\",\n\t\t\t\"float lumaSW = dot( rgbSW, luma );\",\n\t\t\t\"float lumaSE = dot( rgbSE, luma );\",\n\t\t\t\"float lumaM = dot( rgbM, luma );\",\n\t\t\t\"float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\",\n\t\t\t\"float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\",\n\n\t\t\t\"vec2 dir;\",\n\t\t\t\"dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\",\n\t\t\t\"dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\",\n\n\t\t\t\"float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\",\n\n\t\t\t\"float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\",\n\t\t\t\"dir = min( vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX),\",\n\t\t\t\t \"max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\",\n\t\t\t\t\t\t\"dir * rcpDirMin)) * resolution;\",\n\t\t\t\"vec4 rgbA = (1.0/2.0) * (\",\n \t\"texture2D(tDiffuse, gl_FragCoord.xy * resolution + dir * (1.0/3.0 - 0.5)) +\",\n\t\t\t\"texture2D(tDiffuse, gl_FragCoord.xy * resolution + dir * (2.0/3.0 - 0.5)));\",\n \t\t\"vec4 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (\",\n\t\t\t\"texture2D(tDiffuse, gl_FragCoord.xy * resolution + dir * (0.0/3.0 - 0.5)) +\",\n \t\t\"texture2D(tDiffuse, gl_FragCoord.xy * resolution + dir * (3.0/3.0 - 0.5)));\",\n \t\t\"float lumaB = dot(rgbB, vec4(luma, 0.0));\",\n\n\t\t\t\"if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {\",\n\n\t\t\t\t\"gl_FragColor = rgbA;\",\n\n\t\t\t\"} else {\",\n\t\t\t\t\"gl_FragColor = rgbB;\",\n\n\t\t\t\"}\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/BasicShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/BasicShader.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://www.mrdoob.com\n *\n * Simple test shader\n */\n\nTHREE.BasicShader = {\n\n\tuniforms: {},\n\n\tvertexShader: [\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/FocusShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/FocusShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Focus shader\n * based on PaintEffect postprocess from ro.me\n * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n */\n\nTHREE.FocusShader = {\n\n\tuniforms : {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"screenWidth\": { type: \"f\", value: 1024 },\n\t\t\"screenHeight\": { type: \"f\", value: 1024 },\n\t\t\"sampleDistance\": { type: \"f\", value: 0.94 },\n\t\t\"waveFactor\": { type: \"f\", value: 0.00125 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float screenWidth;\",\n\t\t\"uniform float screenHeight;\",\n\t\t\"uniform float sampleDistance;\",\n\t\t\"uniform float waveFactor;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color, org, tmp, add;\",\n\t\t\t\"float sample_dist, f;\",\n\t\t\t\"vec2 vin;\",\n\t\t\t\"vec2 uv = vUv;\",\n\n\t\t\t\"add = color = org = texture2D( tDiffuse, uv );\",\n\n\t\t\t\"vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\",\n\t\t\t\"sample_dist = dot( vin, vin ) * 2.0;\",\n\n\t\t\t\"f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\",\n\n\t\t\t\"vec2 sampleSize = vec2( 1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\",\n\t\t\t\"if( tmp.b < color.b ) color = tmp;\",\n\n\t\t\t\"color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\",\n\t\t\t\"color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\",\n\n\t\t\t\"gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\",\n\n\t\t\"}\"\n\n\n\t].join(\"\\n\")\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/VerticalTiltShiftShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/VerticalTiltShiftShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Simple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n * - \"r\" parameter control where \"focused\" horizontal line lies\n */\n\nTHREE.VerticalTiltShiftShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"v\": { type: \"f\", value: 1.0 / 512.0 },\n\t\t\"r\": { type: \"f\", value: 0.35 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform float v;\",\n\t\t\"uniform float r;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 sum = vec4( 0.0 );\",\n\n\t\t\t\"float vv = v * abs( r - vUv.y );\",\n\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\",\n\t\t\t\"sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\",\n\n\t\t\t\"gl_FragColor = sum;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/SepiaShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/SepiaShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Sepia tone shader\n * based on glfx.js sepia shader\n * https://github.com/evanw/glfx.js\n */\n\nTHREE.SepiaShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"amount\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float amount;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\"vec3 c = color.rgb;\",\n\n\t\t\t\"color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\",\n\t\t\t\"color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\",\n\t\t\t\"color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\",\n\n\t\t\t\"gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/CopyShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/CopyShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nTHREE.CopyShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"opacity\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/ColorCorrectionShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/ColorCorrectionShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Color correction\n */\n\nTHREE.ColorCorrectionShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"powRGB\": { type: \"v3\", value: new THREE.Vector3( 2, 2, 2 ) },\n\t\t\"mulRGB\": { type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform vec3 powRGB;\",\n\t\t\"uniform vec3 mulRGB;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = texture2D( tDiffuse, vUv );\",\n\t\t\t\"gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/SSAOShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/SSAOShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Screen-space ambient occlusion shader\n * - ported from\n * SSAO GLSL shader v1.2\n * assembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com)\n * original technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/)\n * - modifications\n * - modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass)\n * - refactoring and optimizations\n */\n\nTHREE.SSAOShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"tDepth\": { type: \"t\", value: null },\n\t\t\"size\": { type: \"v2\", value: new THREE.Vector2( 512, 512 ) },\n\t\t\"cameraNear\": { type: \"f\", value: 1 },\n\t\t\"cameraFar\": { type: \"f\", value: 100 },\n\t\t\"onlyAO\": { type: \"i\", value: 0 },\n\t\t\"aoClamp\": { type: \"f\", value: 0.5 },\n\t\t\"lumInfluence\": { type: \"f\", value: 0.5 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float cameraNear;\",\n\t\t\"uniform float cameraFar;\",\n\n\t\t\"uniform bool onlyAO;\", // use only ambient occlusion pass?\n\n\t\t\"uniform vec2 size;\", // texture width, height\n\t\t\"uniform float aoClamp;\", // depth clamp - reduces haloing at screen edges\n\n\t\t\"uniform float lumInfluence;\", // how much luminance affects occlusion\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t// \"#define PI 3.14159265\",\n\t\t\"#define DL 2.399963229728653\", // PI * ( 3.0 - sqrt( 5.0 ) )\n\t\t\"#define EULER 2.718281828459045\",\n\n\t\t// helpers\n\n\t\t\"float width = size.x;\", // texture width\n\t\t\"float height = size.y;\", // texture height\n\n\t\t\"float cameraFarPlusNear = cameraFar + cameraNear;\",\n\t\t\"float cameraFarMinusNear = cameraFar - cameraNear;\",\n\t\t\"float cameraCoef = 2.0 * cameraNear;\",\n\n\t\t// user variables\n\n\t\t\"const int samples = 8;\", // ao sample count\n\t\t\"const float radius = 5.0;\", // ao radius\n\n\t\t\"const bool useNoise = false;\", // use noise instead of pattern for sample dithering\n\t\t\"const float noiseAmount = 0.0003;\", // dithering amount\n\n\t\t\"const float diffArea = 0.4;\", // self-shadowing reduction\n\t\t\"const float gDisplace = 0.4;\", // gauss bell center\n\n\n\t\t// RGBA depth\n\n\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\n\n\t\t\t\"const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\",\n\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\n\t\t\t\"return depth;\",\n\n\t\t\"}\",\n\n\t\t// generating noise / pattern texture for dithering\n\n\t\t\"vec2 rand( const vec2 coord ) {\",\n\n\t\t\t\"vec2 noise;\",\n\n\t\t\t\"if ( useNoise ) {\",\n\n\t\t\t\t\"float nx = dot ( coord, vec2( 12.9898, 78.233 ) );\",\n\t\t\t\t\"float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );\",\n\n\t\t\t\t\"noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );\",\n\n\t\t\t\"} else {\",\n\n\t\t\t\t\"float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );\",\n\t\t\t\t\"float gg = fract( coord.t * ( height / 2.0 ) );\",\n\n\t\t\t\t\"noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"return ( noise * 2.0 - 1.0 ) * noiseAmount;\",\n\n\t\t\"}\",\n\n\t\t\"float readDepth( const in vec2 coord ) {\",\n\n\t\t\t// \"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );\",\n\t\t\t\"return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );\",\n\n\n\t\t\"}\",\n\n\t\t\"float compareDepths( const in float depth1, const in float depth2, inout int far ) {\",\n\n\t\t\t\"float garea = 2.0;\", // gauss bell width\n\t\t\t\"float diff = ( depth1 - depth2 ) * 100.0;\", // depth difference (0-100)\n\n\t\t\t// reduce left bell width to avoid self-shadowing\n\n\t\t\t\"if ( diff < gDisplace ) {\",\n\n\t\t\t\t\"garea = diffArea;\",\n\n\t\t\t\"} else {\",\n\n\t\t\t\t\"far = 1;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float dd = diff - gDisplace;\",\n\t\t\t\"float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );\",\n\t\t\t\"return gauss;\",\n\n\t\t\"}\",\n\n\t\t\"float calcAO( float depth, float dw, float dh ) {\",\n\n\t\t\t\"float dd = radius - depth * radius;\",\n\t\t\t\"vec2 vv = vec2( dw, dh );\",\n\n\t\t\t\"vec2 coord1 = vUv + dd * vv;\",\n\t\t\t\"vec2 coord2 = vUv - dd * vv;\",\n\n\t\t\t\"float temp1 = 0.0;\",\n\t\t\t\"float temp2 = 0.0;\",\n\n\t\t\t\"int far = 0;\",\n\t\t\t\"temp1 = compareDepths( depth, readDepth( coord1 ), far );\",\n\n\t\t\t// DEPTH EXTRAPOLATION\n\n\t\t\t\"if ( far > 0 ) {\",\n\n\t\t\t\t\"temp2 = compareDepths( readDepth( coord2 ), depth, far );\",\n\t\t\t\t\"temp1 += ( 1.0 - temp1 ) * temp2;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"return temp1;\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec2 noise = rand( vUv );\",\n\t\t\t\"float depth = readDepth( vUv );\",\n\n\t\t\t\"float tt = clamp( depth, aoClamp, 1.0 );\",\n\n\t\t\t\"float w = ( 1.0 / width ) / tt + ( noise.x * ( 1.0 - noise.x ) );\",\n\t\t\t\"float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );\",\n\n\t\t\t\"float ao = 0.0;\",\n\n\t\t\t\"float dz = 1.0 / float( samples );\",\n\t\t\t\"float z = 1.0 - dz / 2.0;\",\n\t\t\t\"float l = 0.0;\",\n\n\t\t\t\"for ( int i = 0; i <= samples; i ++ ) {\",\n\n\t\t\t\t\"float r = sqrt( 1.0 - z );\",\n\n\t\t\t\t\"float pw = cos( l ) * r;\",\n\t\t\t\t\"float ph = sin( l ) * r;\",\n\t\t\t\t\"ao += calcAO( depth, pw * w, ph * h );\",\n\t\t\t\t\"z = z - dz;\",\n\t\t\t\t\"l = l + DL;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"ao /= float( samples );\",\n\t\t\t\"ao = 1.0 - ao;\",\n\n\t\t\t\"vec3 color = texture2D( tDiffuse, vUv ).rgb;\",\n\n\t\t\t\"vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );\",\n\t\t\t\"float lum = dot( color.rgb, lumcoeff );\",\n\t\t\t\"vec3 luminance = vec3( lum );\",\n\n\t\t\t\"vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // mix( color * ao, white, luminance )\n\n\t\t\t\"if ( onlyAO ) {\",\n\n\t\t\t\t\"final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );\", // ambient occlusion only\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = vec4( final, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/VignetteShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/VignetteShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Vignette shader\n * based on PaintEffect postprocess from ro.me\n * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\n */\n\nTHREE.VignetteShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"offset\": { type: \"f\", value: 1.0 },\n\t\t\"darkness\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float offset;\",\n\t\t\"uniform float darkness;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t// Eskil's vignette\n\n\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\",\n\t\t\t\"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\",\n\n\t\t\t/*\n\t\t\t// alternative version from glfx.js\n\t\t\t// this one makes more \"dusty\" look (as opposed to \"burned\")\n\n\t\t\t\"vec4 color = texture2D( tDiffuse, vUv );\",\n\t\t\t\"float dist = distance( vUv, vec2( 0.5 ) );\",\n\t\t\t\"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );\",\n\t\t\t\"gl_FragColor = color;\",\n\t\t\t*/\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/TriangleBlurShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/TriangleBlurShader.js",
"module-type": "library",
"text": "/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Triangle blur shader\n * based on glfx.js triangle blur shader\n * https://github.com/evanw/glfx.js\n *\n * A basic blur filter, which convolves the image with a\n * pyramid filter. The pyramid filter is separable and is applied as two\n * perpendicular triangle filters.\n */\n\nTHREE.TriangleBlurShader = {\n\n\tuniforms : {\n\n\t\t\"texture\": { type: \"t\", value: null },\n\t\t\"delta\": { type: \"v2\", value:new THREE.Vector2( 1, 1 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"#define ITERATIONS 10.0\",\n\n\t\t\"uniform sampler2D texture;\",\n\t\t\"uniform vec2 delta;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"float random( vec3 scale, float seed ) {\",\n\n\t\t\t// use the fragment position for a different seed per-pixel\n\n\t\t\t\"return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 color = vec4( 0.0 );\",\n\n\t\t\t\"float total = 0.0;\",\n\n\t\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\t\"float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );\",\n\n\t\t\t\"for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\",\n\n\t\t\t\t\"float percent = ( t + offset - 0.5 ) / ITERATIONS;\",\n\t\t\t\t\"float weight = 1.0 - abs( percent );\",\n\n\t\t\t\t\"color += texture2D( texture, vUv + delta * percent ) * weight;\",\n\t\t\t\t\"total += weight;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"gl_FragColor = color / total;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Shaders/BleachBypassShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Shaders/BleachBypassShader.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Bleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass]\n * - based on Nvidia example\n * http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass\n */\n\nTHREE.BleachBypassShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { type: \"t\", value: null },\n\t\t\"opacity\": { type: \"f\", value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 base = texture2D( tDiffuse, vUv );\",\n\n\t\t\t\"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );\",\n\t\t\t\"float lum = dot( lumCoeff, base.rgb );\",\n\t\t\t\"vec3 blend = vec3( lum );\",\n\n\t\t\t\"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\",\n\n\t\t\t\"vec3 result1 = 2.0 * base.rgb * blend;\",\n\t\t\t\"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\",\n\n\t\t\t\"vec3 newColor = mix( result1, result2, L );\",\n\n\t\t\t\"float A2 = opacity * base.a;\",\n\t\t\t\"vec3 mixRGB = A2 * newColor.rgb;\",\n\t\t\t\"mixRGB += ( ( 1.0 - A2 ) * base.rgb );\",\n\n\t\t\t\"gl_FragColor = vec4( mixRGB, base.a );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/BlendCharacterGui.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/BlendCharacterGui.js",
"module-type": "library",
"text": "/**\n * @author Michael Guerrero / http://realitymeltdown.com\n */\n\nfunction BlendCharacterGui(animations) {\n\n\tvar controls = {\n\n\t\tgui: null,\n\t\t\"Lock Camera\": false,\n\t\t\"Show Model\": true,\n\t\t\"Show Skeleton\": false,\n\t\t\"Time Scale\": 1.0,\n\t\t\"Step Size\": 0.016,\n\t\t\"Crossfade Time\": 3.5,\n\t\t\"idle\": 0.33,\n\t\t\"walk\": 0.33,\n\t\t\"run\": 0.33\n\n\t};\n\n\tvar animations = animations;\n\n\tthis.showModel = function() {\n\n\t\treturn controls['Show Model'];\n\n\t};\n\n\tthis.showSkeleton = function() {\n\n\t\treturn controls['Show Skeleton'];\n\n\t};\n\n\tthis.getTimeScale = function() {\n\n\t\treturn controls['Time Scale'];\n\n\t};\n\n\tthis.update = function() {\n\n\t\tcontrols[ 'idle'] = animations[ 'idle' ].weight;\n\t\tcontrols[ 'walk'] = animations[ 'walk' ].weight;\n\t\tcontrols[ 'run'] = animations[ 'run' ].weight;\n\n\t};\n\n\tvar init = function() {\n\n\t\tcontrols.gui = new dat.GUI();\n\n\t\tvar settings = controls.gui.addFolder( 'Settings' );\n\t\tvar playback = controls.gui.addFolder( 'Playback' );\n\t\tvar blending = controls.gui.addFolder( 'Blend Tuning' );\n\n\t\tsettings.add( controls, \"Lock Camera\" ).onChange( controls.lockCameraChanged );\n\t\tsettings.add( controls, \"Show Model\" ).onChange( controls.showModelChanged );\n\t\tsettings.add( controls, \"Show Skeleton\" ).onChange( controls.showSkeletonChanged );\n\t\tsettings.add( controls, \"Time Scale\", 0, 1, 0.01 );\n\t\tsettings.add( controls, \"Step Size\", 0.01, 0.1, 0.01 );\n\t\tsettings.add( controls, \"Crossfade Time\", 0.1, 6.0, 0.05 );\n\n\t\t// These controls execute functions\n\t\tplayback.add( controls, \"start\" );\n\t\tplayback.add( controls, \"pause\" );\n\t\tplayback.add( controls, \"step\" );\n\t\tplayback.add( controls, \"idle to walk\" );\n\t\tplayback.add( controls, \"walk to run\" );\n\t\tplayback.add( controls, \"warp walk to run\" );\n\n\t\tblending.add( controls, \"idle\", 0, 1, 0.01).listen().onChange( controls.weight );\n\t\tblending.add( controls, \"walk\", 0, 1, 0.01).listen().onChange( controls.weight );\n\t\tblending.add( controls, \"run\", 0, 1, 0.01).listen().onChange( controls.weight );\n\n\t\tsettings.open();\n\t\tplayback.open();\n\t\tblending.open();\n\n\t}\n\n\tvar getAnimationData = function() {\n\n\t\treturn {\n\n\t\t\tdetail: {\n\n\t\t\t\tanims: [ \"idle\", \"walk\", \"run\" ],\n\n\t\t\t\tweights: [ controls['idle'],\n\t\t\t\t\t\t controls['walk'],\n\t\t\t\t\t\t controls['run'] ]\n\t\t\t}\n\n\t\t};\n\t}\n\n\tcontrols.start = function() {\n\n\t\tvar startEvent = new CustomEvent( 'start-animation', getAnimationData() );\n\t\twindow.dispatchEvent(startEvent);\n\n\t};\n\n\tcontrols.stop = function() {\n\n\t\tvar stopEvent = new CustomEvent( 'stop-animation' );\n\t\twindow.dispatchEvent( stopEvent );\n\n\t};\n\n\tcontrols.pause = function() {\n\n\t\tvar pauseEvent = new CustomEvent( 'pause-animation' );\n\t\twindow.dispatchEvent( pauseEvent );\n\n\t};\n\n\tcontrols.step = function() {\n\n\t\tvar stepData = { detail: { stepSize: controls['Step Size'] } };\n\t\twindow.dispatchEvent( new CustomEvent('step-animation', stepData ));\n\n\t};\n\n\tcontrols.weight = function() {\n\n\t\t// renormalize\n\t\tvar sum = controls['idle'] + controls['walk'] + controls['run'];\n\t\tcontrols['idle'] /= sum;\n\t\tcontrols['walk'] /= sum;\n\t\tcontrols['run'] /= sum;\n\n\t\tvar weightEvent = new CustomEvent( 'weight-animation', getAnimationData() );\n\t\twindow.dispatchEvent(weightEvent);\n\t};\n\n\tcontrols.crossfade = function( from, to ) {\n\n\t\tvar fadeData = getAnimationData();\n\t\tfadeData.detail.from = from;\n\t\tfadeData.detail.to = to;\n\t\tfadeData.detail.time = controls[ \"Crossfade Time\" ];\n\n\t\twindow.dispatchEvent( new CustomEvent( 'crossfade', fadeData ) );\n\t}\n\n\tcontrols.warp = function( from, to ) {\n\n\t\tvar warpData = getAnimationData();\n\t\twarpData.detail.from = 'walk';\n\t\twarpData.detail.to = 'run';\n\t\twarpData.detail.time = controls[ \"Crossfade Time\" ];\n\n\t\twindow.dispatchEvent( new CustomEvent( 'warp', warpData ) );\n\t}\n\n\tcontrols['idle to walk'] = function() {\n\n\t\tcontrols.crossfade( 'idle', 'walk' );\n\n\t};\n\n\tcontrols['walk to run'] = function() {\n\n\t\tcontrols.crossfade( 'walk', 'run' );\n\n\t};\n\n\tcontrols['warp walk to run'] = function() {\n\n\t\tcontrols.warp( 'walk', 'run' );\n\n\t};\n\n\tcontrols.lockCameraChanged = function() {\n\n\t\tvar data = {\n\t\t\tdetail: {\n\t\t\t\tshouldLock: controls['Lock Camera']\n\t\t\t}\n\t\t}\n\n\t\twindow.dispatchEvent( new CustomEvent( 'toggle-lock-camera', data ) );\n\t}\n\n\tcontrols.showSkeletonChanged = function() {\n\n\t\tvar data = {\n\t\t\tdetail: {\n\t\t\t\tshouldShow: controls['Show Skeleton']\n\t\t\t}\n\t\t}\n\n\t\twindow.dispatchEvent( new CustomEvent( 'toggle-show-skeleton', data ) );\n\t}\n\n\n\tcontrols.showModelChanged = function() {\n\n\t\tvar data = {\n\t\t\tdetail: {\n\t\t\t\tshouldShow: controls['Show Model']\n\t\t\t}\n\t\t}\n\n\t\twindow.dispatchEvent( new CustomEvent( 'toggle-show-model', data ) );\n\t}\n\n\n\tinit.call(this);\n\n}"
},
"$:/plugins/rboue/Three.js/Lib/Curves/NURBSCurve.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Curves/NURBSCurve.js",
"module-type": "library",
"text": "/**\n * @author renej\n * NURBS curve object\n *\n * Derives from Curve, overriding getPoint and getTangent.\n *\n * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.\n *\n **/\n\n\n/**************************************************************\n *\tNURBS curve\n **************************************************************/\n\nTHREE.NURBSCurve = function ( degree, knots /* array of reals */, controlPoints /* array of Vector(2|3|4) */) {\n\n\tthis.degree = degree;\n\tthis.knots = knots;\n\tthis.controlPoints = [];\n\tfor (var i = 0; i < controlPoints.length; ++i) { // ensure Vector4 for control points\n\t\tvar point = controlPoints[i];\n\t\tthis.controlPoints[i] = new THREE.Vector4(point.x, point.y, point.z, point.w);\n\t}\n\n};\n\n\nTHREE.NURBSCurve.prototype = Object.create( THREE.Curve.prototype );\n\n\nTHREE.NURBSCurve.prototype.getPoint = function ( t ) {\n\n\tvar u = this.knots[0] + t * (this.knots[this.knots.length - 1] - this.knots[0]); // linear mapping t->u\n\n\t// following results in (wx, wy, wz, w) homogeneous point\n\tvar hpoint = THREE.NURBSUtils.calcBSplinePoint(this.degree, this.knots, this.controlPoints, u);\n\n\tif (hpoint.w != 1.0) { // project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\thpoint.divideScalar(hpoint.w);\n\t}\n\n\treturn new THREE.Vector3(hpoint.x, hpoint.y, hpoint.z);\n};\n\n\nTHREE.NURBSCurve.prototype.getTangent = function ( t ) {\n\n\tvar u = this.knots[0] + t * (this.knots[this.knots.length - 1] - this.knots[0]);\n\tvar ders = THREE.NURBSUtils.calcNURBSDerivatives(this.degree, this.knots, this.controlPoints, u, 1);\n\tvar tangent = ders[1].clone();\n\ttangent.normalize();\n\n\treturn tangent;\n};\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Curves/NURBSSurface.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Curves/NURBSSurface.js",
"module-type": "library",
"text": "/**\n * @author renej\n * NURBS surface object\n *\n * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.\n *\n **/\n\n\n/**************************************************************\n *\tNURBS surface\n **************************************************************/\n\nTHREE.NURBSSurface = function ( degree1, degree2, knots1, knots2 /* arrays of reals */, controlPoints /* array^2 of Vector(2|3|4) */) {\n\n\tthis.degree1 = degree1;\n\tthis.degree2 = degree2;\n\tthis.knots1 = knots1;\n\tthis.knots2 = knots2;\n\tthis.controlPoints = [];\n\n\tvar len1 = knots1.length - degree1 - 1;\n\tvar len2 = knots2.length - degree2 - 1;\n\n\t// ensure Vector4 for control points\n\tfor (var i = 0; i < len1; ++i) {\n\t\tthis.controlPoints[i] = []\n\t\tfor (var j = 0; j < len2; ++j) {\n\t\t\tvar point = controlPoints[i][j];\n\t\t\tthis.controlPoints[i][j] = new THREE.Vector4(point.x, point.y, point.z, point.w);\n\t\t}\n\t}\n};\n\n\nTHREE.NURBSSurface.prototype = {\n\n\tconstructor: THREE.NURBSSurface,\n\n\tgetPoint: function ( t1, t2 ) {\n\n\t\tvar u = this.knots1[0] + t1 * (this.knots1[this.knots1.length - 1] - this.knots1[0]); // linear mapping t1->u\n\t\tvar v = this.knots2[0] + t2 * (this.knots2[this.knots2.length - 1] - this.knots2[0]); // linear mapping t2->u\n\n\t\treturn THREE.NURBSUtils.calcSurfacePoint(this.degree1, this.degree2, this.knots1, this.knots2, this.controlPoints, u, v);\n\t}\n};\n\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Curves/NURBSUtils.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Curves/NURBSUtils.js",
"module-type": "library",
"text": "/**\n * @author renej\n * NURBS utils\n *\n * See NURBSCurve and NURBSSurface.\n *\n **/\n\n\n/**************************************************************\n *\tNURBS Utils\n **************************************************************/\n\nTHREE.NURBSUtils = {\n\n\t/*\n\tFinds knot vector span.\n\n\tp : degree\n\tu : parametric value\n\tU : knot vector\n\t\n\treturns the span\n\t*/\n\tfindSpan: function( p, u, U ) {\n\t\tvar n = U.length - p - 1;\n\n\t\tif (u >= U[n]) {\n\t\t\treturn n - 1;\n\t\t}\n\n\t\tif (u <= U[p]) {\n\t\t\treturn p;\n\t\t}\n\n\t\tvar low = p;\n\t\tvar high = n;\n\t\tvar mid = Math.floor((low + high) / 2);\n\n\t\twhile (u < U[mid] || u >= U[mid + 1]) {\n\t\t \n\t\t\tif (u < U[mid]) {\n\t\t\t\thigh = mid;\n\t\t\t} else {\n\t\t\t\tlow = mid;\n\t\t\t}\n\n\t\t\tmid = Math.floor((low + high) / 2);\n\t\t}\n\n\t\treturn mid;\n\t},\n \n\t\t\n\t/*\n\tCalculate basis functions. See The NURBS Book, page 70, algorithm A2.2\n \n\tspan : span in which u lies\n\tu : parametric point\n\tp : degree\n\tU : knot vector\n\t\n\treturns array[p+1] with basis functions values.\n\t*/\n\tcalcBasisFunctions: function( span, u, p, U ) {\n\t\tvar N = [];\n\t\tvar left = [];\n\t\tvar right = [];\n\t\tN[0] = 1.0;\n\n\t\tfor (var j = 1; j <= p; ++j) {\n\t \n\t\t\tleft[j] = u - U[span + 1 - j];\n\t\t\tright[j] = U[span + j] - u;\n\n\t\t\tvar saved = 0.0;\n\n\t\t\tfor (var r = 0; r < j; ++r) {\n\n\t\t\t\tvar rv = right[r + 1];\n\t\t\t\tvar lv = left[j - r];\n\t\t\t\tvar temp = N[r] / (rv + lv);\n\t\t\t\tN[r] = saved + rv * temp;\n\t\t\t\tsaved = lv * temp;\n\t\t\t }\n\n\t\t\t N[j] = saved;\n\t\t }\n\n\t\t return N;\n\t},\n\n\n\t/*\n\tCalculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n \n\tp : degree of B-Spline\n\tU : knot vector\n\tP : control points (x, y, z, w)\n\tu : parametric point\n\n\treturns point for given u\n\t*/\n\tcalcBSplinePoint: function( p, U, P, u ) {\n\t\tvar span = this.findSpan(p, u, U);\n\t\tvar N = this.calcBasisFunctions(span, u, p, U);\n\t\tvar C = new THREE.Vector4(0, 0, 0, 0);\n\n\t\tfor (var j = 0; j <= p; ++j) {\n\t\t\tvar point = P[span - p + j];\n\t\t\tvar Nj = N[j];\n\t\t\tvar wNj = point.w * Nj;\n\t\t\tC.x += point.x * wNj;\n\t\t\tC.y += point.y * wNj;\n\t\t\tC.z += point.z * wNj;\n\t\t\tC.w += point.w * Nj;\n\t\t}\n\n\t\treturn C;\n\t},\n\n\n\t/*\n\tCalculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n\n\tspan : span in which u lies\n\tu : parametric point\n\tp : degree\n\tn : number of derivatives to calculate\n\tU : knot vector\n\n\treturns array[n+1][p+1] with basis functions derivatives\n\t*/\n\tcalcBasisFunctionDerivatives: function( span, u, p, n, U ) {\n\n\t\tvar zeroArr = [];\n\t\tfor (var i = 0; i <= p; ++i)\n\t\t\tzeroArr[i] = 0.0;\n\n\t\tvar ders = [];\n\t\tfor (var i = 0; i <= n; ++i)\n\t\t\tders[i] = zeroArr.slice(0);\n\n\t\tvar ndu = [];\n\t\tfor (var i = 0; i <= p; ++i)\n\t\t\tndu[i] = zeroArr.slice(0);\n\n\t\tndu[0][0] = 1.0;\n\n\t\tvar left = zeroArr.slice(0);\n\t\tvar right = zeroArr.slice(0);\n\n\t\tfor (var j = 1; j <= p; ++j) {\n\t\t\tleft[j] = u - U[span + 1 - j];\n\t\t\tright[j] = U[span + j] - u;\n\n\t\t\tvar saved = 0.0;\n\n\t\t\tfor (var r = 0; r < j; ++r) {\n\t\t\t\tvar rv = right[r + 1];\n\t\t\t\tvar lv = left[j - r];\n\t\t\t\tndu[j][r] = rv + lv;\n\n\t\t\t\tvar temp = ndu[r][j - 1] / ndu[j][r];\n\t\t\t\tndu[r][j] = saved + rv * temp;\n\t\t\t\tsaved = lv * temp;\n\t\t\t}\n\n\t\t\tndu[j][j] = saved;\n\t\t}\n\n\t\tfor (var j = 0; j <= p; ++j) {\n\t\t\tders[0][j] = ndu[j][p];\n\t\t}\n\n\t\tfor (var r = 0; r <= p; ++r) {\n\t\t\tvar s1 = 0;\n\t\t\tvar s2 = 1;\n\n\t\t\tvar a = [];\n\t\t\tfor (var i = 0; i <= p; ++i) {\n\t\t\t\ta[i] = zeroArr.slice(0);\n\t\t\t}\n\t\t\ta[0][0] = 1.0;\n\n\t\t\tfor (var k = 1; k <= n; ++k) {\n\t\t\t\tvar d = 0.0;\n\t\t\t\tvar rk = r - k;\n\t\t\t\tvar pk = p - k;\n\n\t\t\t\tif (r >= k) {\n\t\t\t\t\ta[s2][0] = a[s1][0] / ndu[pk + 1][rk];\n\t\t\t\t\td = a[s2][0] * ndu[rk][pk];\n\t\t\t\t}\n\n\t\t\t\tvar j1 = (rk >= -1) ? 1 : -rk;\n\t\t\t\tvar j2 = (r - 1 <= pk) ? k - 1 : p - r;\n\n\t\t\t\tfor (var j = j1; j <= j2; ++j) {\n\t\t\t\t\ta[s2][j] = (a[s1][j] - a[s1][j - 1]) / ndu[pk + 1][rk + j];\n\t\t\t\t\td += a[s2][j] * ndu[rk + j][pk];\n\t\t\t\t}\n\n\t\t\t\tif (r <= pk) {\n\t\t\t\t\ta[s2][k] = -a[s1][k - 1] / ndu[pk + 1][r];\n\t\t\t\t\td += a[s2][k] * ndu[r][pk];\n\t\t\t\t}\n\n\t\t\t\tders[k][r] = d;\n\n\t\t\t\tvar j = s1;\n\t\t\t\ts1 = s2;\n\t\t\t\ts2 = j;\n\t\t\t}\n\t\t}\n\n\t\tvar r = p;\n\n\t\tfor (var k = 1; k <= n; ++k) {\n\t\t\tfor (var j = 0; j <= p; ++j) {\n\t\t\t\tders[k][j] *= r;\n\t\t\t}\n\t\t\tr *= p - k;\n\t\t}\n\n\t\treturn ders;\n\t},\n\n\n \t/*\n\tCalculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n\n\tp : degree\n\tU : knot vector\n\tP : control points\n\tu : Parametric points\n\tnd : number of derivatives\n\n\treturns array[d+1] with derivatives\n\t*/\n\tcalcBSplineDerivatives: function( p, U, P, u, nd ) {\n\t\tvar du = nd < p ? nd : p;\n\t\tvar CK = [];\n\t\tvar span = this.findSpan(p, u, U);\n\t\tvar nders = this.calcBasisFunctionDerivatives(span, u, p, du, U);\n\t\tvar Pw = [];\n\n\t\tfor (var i = 0; i < P.length; ++i) {\n\t\t\tvar point = P[i].clone();\n\t\t\tvar w = point.w;\n\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\n\t\t\tPw[i] = point;\n\t\t}\n\t\tfor (var k = 0; k <= du; ++k) {\n\t\t\tvar point = Pw[span - p].clone().multiplyScalar(nders[k][0]);\n\n\t\t\tfor (var j = 1; j <= p; ++j) {\n\t\t\t\tpoint.add(Pw[span - p + j].clone().multiplyScalar(nders[k][j]));\n\t\t\t}\n\n\t\t\tCK[k] = point;\n\t\t}\n\n\t\tfor (var k = du + 1; k <= nd + 1; ++k) {\n\t\t\tCK[k] = new THREE.Vector4(0, 0, 0);\n\t\t}\n\n\t\treturn CK;\n\t},\n\n\n\t/*\n\tCalculate \"K over I\"\n\n\treturns k!/(i!(k-i)!)\n\t*/\n\tcalcKoverI: function( k, i ) {\n\t\tvar nom = 1;\n\n\t\tfor (var j = 2; j <= k; ++j) {\n\t\t\tnom *= j;\n\t\t}\n\n\t\tvar denom = 1;\n\n\t\tfor (var j = 2; j <= i; ++j) {\n\t\t\tdenom *= j;\n\t\t}\n\n\t\tfor (var j = 2; j <= k - i; ++j) {\n\t\t\tdenom *= j;\n\t\t}\n\n\t\treturn nom / denom;\n\t},\n\n\n\t/*\n\tCalculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n\n\tPders : result of function calcBSplineDerivatives\n\n\treturns array with derivatives for rational curve.\n\t*/\n\tcalcRationalCurveDerivatives: function ( Pders ) {\n\t\tvar nd = Pders.length;\n\t\tvar Aders = [];\n\t\tvar wders = [];\n\n\t\tfor (var i = 0; i < nd; ++i) {\n\t\t\tvar point = Pders[i];\n\t\t\tAders[i] = new THREE.Vector3(point.x, point.y, point.z);\n\t\t\twders[i] = point.w;\n\t\t}\n\n\t\tvar CK = [];\n\n\t\tfor (var k = 0; k < nd; ++k) {\n\t\t\tvar v = Aders[k].clone();\n\n\t\t\tfor (var i = 1; i <= k; ++i) {\n\t\t\t\tv.sub(CK[k - i].clone().multiplyScalar(this.calcKoverI(k,i) * wders[i]));\n\t\t\t}\n\n\t\t\tCK[k] = v.divideScalar(wders[0]);\n\t\t}\n\n\t\treturn CK;\n\t},\n\n\n\t/*\n\tCalculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n\n\tp : degree\n\tU : knot vector\n\tP : control points in homogeneous space\n\tu : parametric points\n\tnd : number of derivatives\n\n\treturns array with derivatives.\n\t*/\n\tcalcNURBSDerivatives: function( p, U, P, u, nd ) {\n\t\tvar Pders = this.calcBSplineDerivatives(p, U, P, u, nd);\n\t\treturn this.calcRationalCurveDerivatives(Pders);\n\t},\n\n\n\t/*\n\tCalculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n \n\tp1, p2 : degrees of B-Spline surface\n\tU1, U2 : knot vectors\n\tP : control points (x, y, z, w)\n\tu, v : parametric values\n\n\treturns point for given (u, v)\n\t*/\n\tcalcSurfacePoint: function( p, q, U, V, P, u, v ) {\n\t\tvar uspan = this.findSpan(p, u, U);\n\t\tvar vspan = this.findSpan(q, v, V);\n\t\tvar Nu = this.calcBasisFunctions(uspan, u, p, U);\n\t\tvar Nv = this.calcBasisFunctions(vspan, v, q, V);\n\t\tvar temp = [];\n\n\t\tfor (var l = 0; l <= q; ++l) {\n\t\t\ttemp[l] = new THREE.Vector4(0, 0, 0, 0);\n\t\t\tfor (var k = 0; k <= p; ++k) {\n\t\t\t\tvar point = P[uspan - p + k][vspan - q + l].clone();\n\t\t\t\tvar w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[l].add(point.multiplyScalar(Nu[k]));\n\t\t\t}\n\t\t}\n\n\t\tvar Sw = new THREE.Vector4(0, 0, 0, 0);\n\t\tfor (var l = 0; l <= q; ++l) {\n\t\t\tSw.add(temp[l].multiplyScalar(Nv[l]));\n\t\t}\n\n\t\tSw.divideScalar(Sw.w);\n\t\treturn new THREE.Vector3(Sw.x, Sw.y, Sw.z);\n\t}\n\n};\n\n\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Geometries/ConvexGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Geometries/ConvexGeometry.js",
"module-type": "library",
"text": "/**\n * @author qiao / https://github.com/qiao\n * @fileoverview This is a convex hull generator using the incremental method. \n * The complexity is O(n^2) where n is the number of vertices.\n * O(nlogn) algorithms do exist, but they are much more complicated.\n *\n * Benchmark: \n *\n * Platform: CPU: P7350 @2.00GHz Engine: V8\n *\n * Num Vertices\tTime(ms)\n *\n * 10 1\n * 20 3\n * 30 19\n * 40 48\n * 50 107\n */\n\nTHREE.ConvexGeometry = function( vertices ) {\n\n\tTHREE.Geometry.call( this );\n\n\tvar faces = [ [ 0, 1, 2 ], [ 0, 2, 1 ] ]; \n\n\tfor ( var i = 3; i < vertices.length; i++ ) {\n\n\t\taddPoint( i );\n\n\t}\n\n\n\tfunction addPoint( vertexId ) {\n\n\t\tvar vertex = vertices[ vertexId ].clone();\n\n\t\tvar mag = vertex.length();\n\t\tvertex.x += mag * randomOffset();\n\t\tvertex.y += mag * randomOffset();\n\t\tvertex.z += mag * randomOffset();\n\n\t\tvar hole = [];\n\n\t\tfor ( var f = 0; f < faces.length; ) {\n\n\t\t\tvar face = faces[ f ];\n\n\t\t\t// for each face, if the vertex can see it,\n\t\t\t// then we try to add the face's edges into the hole.\n\t\t\tif ( visible( face, vertex ) ) {\n\n\t\t\t\tfor ( var e = 0; e < 3; e++ ) {\n\n\t\t\t\t\tvar edge = [ face[ e ], face[ ( e + 1 ) % 3 ] ];\n\t\t\t\t\tvar boundary = true;\n\n\t\t\t\t\t// remove duplicated edges.\n\t\t\t\t\tfor ( var h = 0; h < hole.length; h++ ) {\n\n\t\t\t\t\t\tif ( equalEdge( hole[ h ], edge ) ) {\n\n\t\t\t\t\t\t\thole[ h ] = hole[ hole.length - 1 ];\n\t\t\t\t\t\t\thole.pop();\n\t\t\t\t\t\t\tboundary = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( boundary ) {\n\n\t\t\t\t\t\thole.push( edge );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// remove faces[ f ]\n\t\t\t\tfaces[ f ] = faces[ faces.length - 1 ];\n\t\t\t\tfaces.pop();\n\n\t\t\t} else { // not visible\n\n\t\t\t\tf++;\n\n\t\t\t}\n\t\t}\n\n\t\t// construct the new faces formed by the edges of the hole and the vertex\n\t\tfor ( var h = 0; h < hole.length; h++ ) {\n\n\t\t\tfaces.push( [ \n\t\t\t\thole[ h ][ 0 ],\n\t\t\t\thole[ h ][ 1 ],\n\t\t\t\tvertexId\n\t\t\t] );\n\n\t\t}\n\t}\n\n\t/**\n\t * Whether the face is visible from the vertex\n\t */\n\tfunction visible( face, vertex ) {\n\n\t\tvar va = vertices[ face[ 0 ] ];\n\t\tvar vb = vertices[ face[ 1 ] ];\n\t\tvar vc = vertices[ face[ 2 ] ];\n\n\t\tvar n = normal( va, vb, vc );\n\n\t\t// distance from face to origin\n\t\tvar dist = n.dot( va );\n\n\t\treturn n.dot( vertex ) >= dist; \n\n\t}\n\n\t/**\n\t * Face normal\n\t */\n\tfunction normal( va, vb, vc ) {\n\n\t\tvar cb = new THREE.Vector3();\n\t\tvar ab = new THREE.Vector3();\n\n\t\tcb.subVectors( vc, vb );\n\t\tab.subVectors( va, vb );\n\t\tcb.cross( ab );\n\n\t\tcb.normalize();\n\n\t\treturn cb;\n\n\t}\n\n\t/**\n\t * Detect whether two edges are equal.\n\t * Note that when constructing the convex hull, two same edges can only\n\t * be of the negative direction.\n\t */\n\tfunction equalEdge( ea, eb ) {\n\n\t\treturn ea[ 0 ] === eb[ 1 ] && ea[ 1 ] === eb[ 0 ]; \n\n\t}\n\n\t/**\n\t * Create a random offset between -1e-6 and 1e-6.\n\t */\n\tfunction randomOffset() {\n\n\t\treturn ( Math.random() - 0.5 ) * 2 * 1e-6;\n\n\t}\n\n\n\t/**\n\t * XXX: Not sure if this is the correct approach. Need someone to review.\n\t */\n\tfunction vertexUv( vertex ) {\n\n\t\tvar mag = vertex.length();\n\t\treturn new THREE.Vector2( vertex.x / mag, vertex.y / mag );\n\n\t}\n\n\t// Push vertices into `this.vertices`, skipping those inside the hull\n\tvar id = 0;\n\tvar newId = new Array( vertices.length ); // map from old vertex id to new id\n\n\tfor ( var i = 0; i < faces.length; i++ ) {\n\n\t\t var face = faces[ i ];\n\n\t\t for ( var j = 0; j < 3; j++ ) {\n\n\t\t\t\tif ( newId[ face[ j ] ] === undefined ) {\n\n\t\t\t\t\t\tnewId[ face[ j ] ] = id++;\n\t\t\t\t\t\tthis.vertices.push( vertices[ face[ j ] ] );\n\n\t\t\t\t}\n\n\t\t\t\tface[ j ] = newId[ face[ j ] ];\n\n\t\t }\n\n\t}\n\n\t// Convert faces into instances of THREE.Face3\n\tfor ( var i = 0; i < faces.length; i++ ) {\n\n\t\tthis.faces.push( new THREE.Face3( \n\t\t\t\tfaces[ i ][ 0 ],\n\t\t\t\tfaces[ i ][ 1 ],\n\t\t\t\tfaces[ i ][ 2 ]\n\t\t) );\n\n\t}\n\n\t// Compute UVs\n\tfor ( var i = 0; i < this.faces.length; i++ ) {\n\n\t\tvar face = this.faces[ i ];\n\n\t\tthis.faceVertexUvs[ 0 ].push( [\n\t\t\tvertexUv( this.vertices[ face.a ] ),\n\t\t\tvertexUv( this.vertices[ face.b ] ),\n\t\t\tvertexUv( this.vertices[ face.c ])\n\t\t] );\n\n\t}\n\n\tthis.computeFaceNormals();\n\tthis.computeVertexNormals();\n\n};\n\nTHREE.ConvexGeometry.prototype = Object.create( THREE.Geometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Geometries/hilbert2D.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Geometries/hilbert2D.js",
"module-type": "library",
"text": "/**\n * Hilbert Curve: Generates 2D-Coordinates in a very fast way.\n *\n * @author Dylan Grafmyre\n *\n * Based on work by:\n * @author Thomas Diewald\n * @link http://www.openprocessing.org/sketch/15493\n *\n * @param center Center of Hilbert curve.\n * @param size Total width of Hilbert curve.\n * @param iterations Number of subdivisions.\n * @param v0 Corner index -X, -Z.\n * @param v1 Corner index -X, +Z.\n * @param v2 Corner index +X, +Z.\n * @param v3 Corner index +X, -Z.\n */\nfunction hilbert2D (center, size, iterations, v0, v1, v2, v3) {\n\t// Default Vars\n\tvar center = undefined !== center ? center : new THREE.Vector3(0, 0, 0),\n\t\tsize = undefined !== size ? size : 10,\n\t\thalf = size / 2,\n\t\titerations = undefined !== iterations ? iterations : 1,\n\t\tv0 = undefined !== v0 ? v0 : 0,\n\t\tv1 = undefined !== v1 ? v1 : 1,\n\t\tv2 = undefined !== v2 ? v2 : 2,\n\t\tv3 = undefined !== v3 ? v3 : 3\n\t;\n\n\tvar vec_s = [\n\t\tnew THREE.Vector3( center.x - half, center.y, center.z - half ),\n\t\tnew THREE.Vector3( center.x - half, center.y, center.z + half ),\n\t\tnew THREE.Vector3( center.x + half, center.y, center.z + half ),\n\t\tnew THREE.Vector3( center.x + half, center.y, center.z - half )\n\t];\n\n\tvar vec = [\n\t\tvec_s[ v0 ],\n\t\tvec_s[ v1 ],\n\t\tvec_s[ v2 ],\n\t\tvec_s[ v3 ]\n\t];\n\n\t// Recurse iterations\n\tif (0 <= --iterations) {\n\t\tvar tmp = [];\n\n\t\tArray.prototype.push.apply( tmp, hilbert2D ( vec[ 0 ], half, iterations, v0, v3, v2, v1 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert2D ( vec[ 1 ], half, iterations, v0, v1, v2, v3 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert2D ( vec[ 2 ], half, iterations, v0, v1, v2, v3 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert2D ( vec[ 3 ], half, iterations, v2, v1, v0, v3 ) );\n\n\t\t// Return recursive call\n\t\treturn tmp;\n\t}\n\n\t// Return complete Hilbert Curve.\n\treturn vec;\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Geometries/hilbert3D.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Geometries/hilbert3D.js",
"module-type": "library",
"text": "/**\n * Hilbert Curve: Generates 2D-Coordinates in a very fast way.\n *\n * @author Dylan Grafmyre\n *\n * Based on work by:\n * @author Thomas Diewald\n * @link http://www.openprocessing.org/visuals/?visualID=15599\n *\n * Based on `examples/canvas_lines_colors.html`:\n * @author OpenShift guest\n * @link https://github.com/mrdoob/three.js/blob/8413a860aa95ed29c79cbb7f857c97d7880d260f/examples/canvas_lines_colors.html\n * @see Line 149 - 186\n *\n * @param center Center of Hilbert curve.\n * @param size Total width of Hilbert curve.\n * @param iterations Number of subdivisions.\n * @param v0 Corner index -X, +Y, -Z.\n * @param v1 Corner index -X, +Y, +Z.\n * @param v2 Corner index -X, -Y, +Z.\n * @param v3 Corner index -X, -Y, -Z.\n * @param v4 Corner index +X, -Y, -Z.\n * @param v5 Corner index +X, -Y, +Z.\n * @param v6 Corner index +X, +Y, +Z.\n * @param v7 Corner index +X, +Y, -Z.\n */\nfunction hilbert3D(center, size, iterations, v0, v1, v2, v3, v4, v5, v6, v7) {\n\t// Default Vars\n\tvar center = undefined !== center ? center : new THREE.Vector3(0, 0, 0),\n\t\tsize = undefined !== size ? size : 10,\n\t\thalf = size / 2,\n\t\titerations = undefined !== iterations ? iterations : 1,\n\t\tv0 = undefined !== v0 ? v0 : 0,\n\t\tv1 = undefined !== v1 ? v1 : 1,\n\t\tv2 = undefined !== v2 ? v2 : 2,\n\t\tv3 = undefined !== v3 ? v3 : 3,\n\t\tv4 = undefined !== v4 ? v4 : 4,\n\t\tv5 = undefined !== v5 ? v5 : 5,\n\t\tv6 = undefined !== v6 ? v6 : 6,\n\t\tv7 = undefined !== v7 ? v7 : 7\n\t;\n\n\tvar vec_s = [\n\t\tnew THREE.Vector3( center.x - half, center.y + half, center.z - half ),\n\t\tnew THREE.Vector3( center.x - half, center.y + half, center.z + half ),\n\t\tnew THREE.Vector3( center.x - half, center.y - half, center.z + half ),\n\t\tnew THREE.Vector3( center.x - half, center.y - half, center.z - half ),\n\t\tnew THREE.Vector3( center.x + half, center.y - half, center.z - half ),\n\t\tnew THREE.Vector3( center.x + half, center.y - half, center.z + half ),\n\t\tnew THREE.Vector3( center.x + half, center.y + half, center.z + half ),\n\t\tnew THREE.Vector3( center.x + half, center.y + half, center.z - half )\n\t];\n\n\tvar vec = [\n\t\tvec_s[ v0 ],\n\t\tvec_s[ v1 ],\n\t\tvec_s[ v2 ],\n\t\tvec_s[ v3 ],\n\t\tvec_s[ v4 ],\n\t\tvec_s[ v5 ],\n\t\tvec_s[ v6 ],\n\t\tvec_s[ v7 ]\n\t];\n\n\t// Recurse iterations\n\tif( --iterations >= 0 ) {\n\t\tvar tmp = [];\n\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 0 ], half, iterations, v0, v3, v4, v7, v6, v5, v2, v1 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 1 ], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 2 ], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 3 ], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 4 ], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 5 ], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 6 ], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7 ) );\n\t\tArray.prototype.push.apply( tmp, hilbert3D ( vec[ 7 ], half, iterations, v6, v5, v2, v1, v0, v3, v4, v7 ) );\n\n\t\t// Return recursive call\n\t\treturn tmp;\n\t}\n\n\t// Return complete Hilbert Curve.\n\treturn vec;\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/PRNG.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/PRNG.js",
"module-type": "library",
"text": "// Park-Miller-Carta Pseudo-Random Number Generator\n// https://github.com/pnitsch/BitmapData.js/blob/master/js/BitmapData.js\n\nvar PRNG = function () {\n\n\tthis.seed = 1;\n\tthis.next = function() { return (this.gen() / 2147483647); };\n\tthis.nextRange = function(min, max)\t{ return min + ((max - min) * this.next()) };\n\tthis.gen = function() { return this.seed = (this.seed * 16807) % 2147483647; };\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/AudioObject.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/AudioObject.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n * AudioObject\n *\n *\t- 3d spatialized sound with Doppler-shift effect\n *\n *\t- uses Audio API (currently supported in WebKit-based browsers)\n *\t\thttps://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html\n *\n *\t- based on Doppler effect demo from Chromium\n * \t\thttp://chromium.googlecode.com/svn/trunk/samples/audio/doppler.html\n *\n * - parameters\n *\n *\t\t- listener\n *\t\t\tdopplerFactor\t// A constant used to determine the amount of pitch shift to use when rendering a doppler effect.\n *\t\t\tspeedOfSound\t// The speed of sound used for calculating doppler shift. The default value is 343.3 meters / second.\n *\n *\t\t- panner\n *\t\t\trefDistance\t\t// A reference distance for reducing volume as source move further from the listener.\n *\t\t\tmaxDistance\t\t// The maximum distance between source and listener, after which the volume will not be reduced any further.\n *\t\t\trolloffFactor\t// Describes how quickly the volume is reduced as source moves away from listener.\n * \t\t\tconeInnerAngle\t// An angle inside of which there will be no volume reduction.\n *\t\t\tconeOuterAngle \t// An angle outside of which the volume will be reduced to a constant value of coneOuterGain.\n *\t\t\tconeOuterGain\t// Amount of volume reduction outside of the coneOuterAngle.\n */\n\nTHREE.AudioObject = function ( url, volume, playbackRate, loop ) {\n\n\tTHREE.Object3D.call( this );\n\n\tif ( playbackRate === undefined ) playbackRate = 1;\n\tif ( volume === undefined ) volume = 1;\n\tif ( loop === undefined ) loop = true;\n\n\tif ( ! this.context ) {\n\n\t\ttry {\n\n\t\t\tTHREE.AudioObject.prototype.context = new webkitAudioContext();\n\n\t\t} catch( error ) {\n\n\t\t\tconsole.warn( \"THREE.AudioObject: webkitAudioContext not found\" );\n\t\t\treturn this;\n\n\t\t}\n\n\t}\n\n\tthis.directionalSource = false;\n\n\tthis.listener = this.context.listener;\n\tthis.panner = this.context.createPanner();\n\tthis.source = this.context.createBufferSource();\n\n\tthis.masterGainNode = this.context.createGainNode();\n\tthis.dryGainNode = this.context.createGainNode();\n\n\t// Setup initial gains\n\n\tthis.masterGainNode.gain.value = volume;\n\tthis.dryGainNode.gain.value = 3.0;\n\n\t// Connect dry mix\n\n\tthis.source.connect( this.panner );\n\tthis.panner.connect( this.dryGainNode );\n\tthis.dryGainNode.connect( this.masterGainNode );\n\n\t// Connect master gain\n\n\tthis.masterGainNode.connect( this.context.destination );\n\n\t// Set source parameters and load sound\n\n\tthis.source.playbackRate.value = playbackRate;\n\tthis.source.loop = loop;\n\n\tloadBufferAndPlay( url );\n\n\t// private properties\n\n\tvar soundPosition = new THREE.Vector3(),\n\tcameraPosition = new THREE.Vector3(),\n\toldSoundPosition = new THREE.Vector3(),\n\toldCameraPosition = new THREE.Vector3(),\n\n\tsoundDelta = new THREE.Vector3(),\n\tcameraDelta = new THREE.Vector3(),\n\n\tsoundFront = new THREE.Vector3(),\n\tcameraFront = new THREE.Vector3(),\n\tsoundUp = new THREE.Vector3(),\n\tcameraUp = new THREE.Vector3();\n\n\tvar _this = this;\n\n\t// API\n\n\tthis.setVolume = function ( volume ) {\n\n\t\tthis.masterGainNode.gain.value = volume;\n\n\t};\n\n\tthis.update = function ( camera ) {\n\n\t\toldSoundPosition.copy( soundPosition );\n\t\toldCameraPosition.copy( cameraPosition );\n\n\t\tsoundPosition.setFromMatrixPosition( this.matrixWorld );\n\t\tcameraPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\tsoundDelta.subVectors( soundPosition, oldSoundPosition );\n\t\tcameraDelta.subVectors( cameraPosition, oldCameraPosition );\n\n\t\tcameraUp.copy( camera.up );\n\n\t\tcameraFront.set( 0, 0, -1 );\n\t\tcameraFront.transformDirection( camera.matrixWorld );\n\n\t\tthis.listener.setPosition( cameraPosition.x, cameraPosition.y, cameraPosition.z );\n\t\tthis.listener.setVelocity( cameraDelta.x, cameraDelta.y, cameraDelta.z );\n\t\tthis.listener.setOrientation( cameraFront.x, cameraFront.y, cameraFront.z, cameraUp.x, cameraUp.y, cameraUp.z );\n\n\t\tthis.panner.setPosition( soundPosition.x, soundPosition.y, soundPosition.z );\n\t\tthis.panner.setVelocity( soundDelta.x, soundDelta.y, soundDelta.z );\n\n\t\tif ( this.directionalSource ) {\n\n\t\t\tsoundFront.set( 0, 0, -1 );\n\t\t\tsoundFront.transformDirection( this.matrixWorld );\n\n\t\t\tsoundUp.copy( this.up );\n\t\t\tthis.panner.setOrientation( soundFront.x, soundFront.y, soundFront.z, soundUp.x, soundUp.y, soundUp.z );\n\n\t\t}\n\n\n\t};\n\n\tfunction loadBufferAndPlay( url ) {\n\n\t\t// Load asynchronously\n\n\t\tvar request = new XMLHttpRequest();\n\t\trequest.open( \"GET\", url, true );\n\t\trequest.responseType = \"arraybuffer\";\n\n\t\trequest.onload = function() {\n\n\t\t\t_this.source.buffer = _this.context.createBuffer( request.response, true );\n\t\t\t_this.source.noteOn( 0 );\n\n\t\t}\n\n\t\trequest.send();\n\n\t}\n\n};\n\nTHREE.AudioObject.prototype = Object.create( THREE.Object3D.prototype );\n\nTHREE.AudioObject.prototype.context = null;\nTHREE.AudioObject.prototype.type = null;\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Math/Lut.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Math/Lut.js",
"module-type": "library",
"text": "/**\n * @author daron1337 / http://daron1337.github.io/\n */\n\nTHREE.Lut = function ( colormap, numberofcolors ) {\n\n\tthis.lut = new Array();\n\tthis.map = THREE.ColorMapKeywords[ colormap ];\n\tthis.n = numberofcolors;\n\tthis.mapname = colormap;\n\n\tvar step = 1.0 / this.n;\n\n\tfor ( var i = 0; i <= 1; i += step ) {\n\n\t\tfor ( var j = 0; j < this.map.length - 1; j ++ ) {\n\n\t\t\tif ( i >= this.map[ j ][ 0 ] && i < this.map[ j + 1 ][ 0 ] ) {\n\n\t\t\t\tvar min = this.map[ j ][ 0 ];\n\t\t\t\tvar max = this.map[ j + 1 ][ 0 ];\n\n\t\t\t\tvar color = new THREE.Color( 0xffffff );\n\t\t\t\tvar minColor = new THREE.Color( 0xffffff ).setHex( this.map[ j ][ 1 ] );\n\t\t\t\tvar maxColor = new THREE.Color( 0xffffff ).setHex( this.map[ j + 1 ][ 1 ] );\n\n\t\t\t\tcolor = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );\n\n\t\t\t\tthis.lut.push(color);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn this.set( this );\n\n};\n\nTHREE.Lut.prototype = {\n\n\tconstructor: THREE.Lut,\n\n\tlut: [], map: [], mapname: 'rainbow' , n: 256, minV: 0, maxV: 1, legend: null,\n\n\tset: function ( value ) {\n\n\t\tif ( value instanceof THREE.Lut ) {\n\n\t\t\tthis.copy( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetMin: function ( min ) {\n\n\t\tthis.minV = min;\n\n\t\treturn this;\n\n\t},\n\n\tsetMax: function ( max ) {\n\n\t\tthis.maxV = max;\n\n\t\treturn this;\n\n\t},\n\n\tchangeNumberOfColors: function ( numberofcolors ) {\n\n\t\tthis.n = numberofcolors;\n\n\t\treturn new THREE.Lut( this.mapname, this.n );\n\n\t},\n\n\tchangeColorMap: function ( colormap ) {\n\n\t\tthis.mapname = colormap;\n\n\t\treturn new THREE.Lut( this.mapname, this.n );\n\n\t},\n\n\tcopy: function ( lut ) {\n\n\t\tthis.lut = lut.lut;\n\t\tthis.mapname = lut.mapname;\n\t\tthis.map = lut.map;\n\t\tthis.n = lut.n;\n\t\tthis.minV = lut.minV;\n\t\tthis.maxV = lut.maxV;\n\n\t\treturn this;\n\n\t},\n\n\tgetColor: function ( alpha ) {\n\n\t\tif ( alpha <= this.minV ) {\n\n\t\t\talpha = this.minV;\n\n\t\t} else if ( alpha >= this.maxV ) {\n\n\t\t\talpha = this.maxV;\n\n\t\t}\n\n\t\talpha = ( alpha - this.minV ) / ( this.maxV - this.minV );\n\n\t\tvar colorPosition = Math.round ( alpha * this.n );\n\t\tcolorPosition == this.n ? colorPosition -= 1 : colorPosition;\n\n\t\treturn this.lut[ colorPosition ];\n\n\t},\n\n\taddColorMap: function ( colormapName, arrayOfColors ) {\n\n\t\tTHREE.ColorMapKeywords[ colormapName ] = arrayOfColors;\n\n\t},\n\n\tsetLegendOn: function ( parameters ) {\n\n\t\tif ( parameters === undefined ) { parameters = {}; }\n\n\t\tthis.legend = {};\n\n\t\tthis.legend.layout = parameters.hasOwnProperty( 'layout' ) ? parameters[ 'layout' ] : 'vertical';\n\n\t\tthis.legend.position = parameters.hasOwnProperty( 'position' ) ? parameters[ 'position' ] : { 'x': 21.5, 'y': 8, 'z': 5 };\n\n\t\tthis.legend.dimensions = parameters.hasOwnProperty( 'dimensions' ) ? parameters[ 'dimensions' ] : { 'width': 0.5, 'height': 3 };\n\n\t\tthis.legend.canvas = document.createElement( 'canvas' );\n\n\t\tthis.legend.canvas.setAttribute( 'id', 'legend' );\n\t\tthis.legend.canvas.setAttribute( 'hidden', true );\n\n\t\tdocument.body.appendChild( this.legend.canvas );\n\n\t\tthis.legend.ctx = this.legend.canvas.getContext( '2d' );\n\n\t\tthis.legend.canvas.setAttribute( 'width', 1 );\n\t\tthis.legend.canvas.setAttribute( 'height', this.n );\n\n\t\tthis.legend.texture = new THREE.Texture( this.legend.canvas );\n\n\t\timageData = this.legend.ctx.getImageData( 0, 0, 1, this.n );\n\n\t\tdata = imageData.data;\n\t\tlen = data.length;\n\n\t\tthis.map = THREE.ColorMapKeywords[ this.mapname ];\n\n\t\tvar k = 0;\n\n\t\tvar step = 1.0 / this.n;\n\n\t\tfor ( var i = 1; i >= 0; i-=step ) {\n\n\t\t\tfor ( var j = this.map.length - 1; j >= 0; j-- ) {\n\n\t\t\t\tif ( i < this.map[ j ][ 0 ] && i >= this.map[ j - 1 ][ 0 ] ) {\n\n\t\t\t\t\tvar min = this.map[ j - 1 ][ 0 ];\n\t\t\t\t\tvar max = this.map[ j ][ 0 ];\n\t\t\t\t\tvar color = new THREE.Color( 0xffffff );\n\t\t\t\t\tvar minColor = new THREE.Color( 0xffffff ).setHex( this.map[ j - 1][ 1 ] );\n\t\t\t\t\tvar maxColor = new THREE.Color( 0xffffff ).setHex( this.map[ j ][ 1 ] );\n\t\t\t\t\tcolor = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );\n\n\t\t\t\t\tdata[ k * 4 ] = Math.round( color.r * 255 );\n\t\t\t\t\tdata[ k * 4 + 1 ] = Math.round( color.g * 255 );\n\t\t\t\t\tdata[ k * 4 + 2 ] = Math.round( color.b * 255 );\n\t\t\t\t\tdata[ k * 4 + 3 ] = 255;\n\n\t\t\t\t\tk+=1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.legend.ctx.putImageData( imageData, 0, 0 );\n\t\tthis.legend.texture.needsUpdate = true;\n\n\t\tthis.legend.legendGeometry = new THREE.PlaneGeometry( this.legend.dimensions.width , this.legend.dimensions.height );\n\t\tthis.legend.legendMaterial = new THREE.MeshBasicMaterial( { map : this.legend.texture, side : THREE.DoubleSide } );\n\n\t\tthis.legend.mesh = new THREE.Mesh( this.legend.legendGeometry, this.legend.legendMaterial );\n\n\t\tif ( this.legend.layout == 'horizontal') {\n\n\t\t\tthis.legend.mesh.rotation.z = - 90 * ( Math.PI / 180 );\n\n\t\t}\n\n\t\tthis.legend.mesh.position.copy( this.legend.position );\n\n\t\treturn this.legend.mesh;\n\n\t},\n\n\tsetLegendOff: function () {\n\n\t\tthis.legend = null;\n\n\t\treturn this.legend;\n\n\t},\n\n\tsetLegendLayout: function ( layout ) {\n\n\t\tif ( ! this.legend ) { return false; }\n\n\t\tif ( this.legend.layout == layout ) { return false; }\n\n\t\tif ( layout != 'horizontal' && layout != 'vertical' ) { return false; }\n\n\t\tthis.layout = layout;\n\n\t\tif ( layout == 'horizontal' ) {\n\n\t\t\tthis.legend.mesh.rotation.z = 90 * ( Math.PI / 180 );\n\n\t\t}\n\n\t\tif ( layout == 'vertical' ) {\n\n\t\t\tthis.legend.mesh.rotation.z = -90 * ( Math.PI / 180 );\n\n\t\t}\n\n\t\treturn this.legend.mesh;\n\n\t},\n\n\tsetLegendPosition: function ( position ) {\n\n\t\tthis.legend.position = new THREE.Vector3( position.x, position.y, position.z );\n\n\t\treturn this.legend;\n\n\t},\n\n\tsetLegendLabels: function ( parameters, callback ) {\n\n\t\tif ( ! this.legend ) { return false; }\n\n\t\tif ( typeof parameters === 'function') { callback = parameters; }\n\n\t\tif ( parameters === undefined ) { parameters = {}; }\n\n\t\tthis.legend.labels = {};\n\n\t\tthis.legend.labels.fontsize = parameters.hasOwnProperty( 'fontsize' ) ? parameters[ 'fontsize' ] : 24;\n\n\t\tthis.legend.labels.fontface = parameters.hasOwnProperty( 'fontface' ) ? parameters[ 'fontface' ] : 'Arial';\n\n\t\tthis.legend.labels.title = parameters.hasOwnProperty( 'title' ) ? parameters[ 'title' ] : '';\n\n\t\tthis.legend.labels.um = parameters.hasOwnProperty( 'um' ) ? ' [ '+ parameters[ 'um' ] + ' ]': '';\n\n\t\tthis.legend.labels.ticks = parameters.hasOwnProperty( 'ticks' ) ? parameters[ 'ticks' ] : 0;\n\n\t\tthis.legend.labels.decimal = parameters.hasOwnProperty( 'decimal' ) ? parameters[ 'decimal' ] : 2;\n\n\t\tthis.legend.labels.notation = parameters.hasOwnProperty( 'notation' ) ? parameters[ 'notation' ] : 'standard';\n\n\t\tvar backgroundColor = { r: 255, g: 100, b: 100, a: 0.8 };\n\t\tvar borderColor = { r: 255, g: 0, b: 0, a: 1.0 };\n\t\tvar borderThickness = 4;\n\n\t\tvar canvasTitle = document.createElement( 'canvas' );\n\t\tvar contextTitle = canvasTitle.getContext( '2d' );\n\n\t\tcontextTitle.font = 'Normal ' + this.legend.labels.fontsize * 1.2 + 'px ' + this.legend.labels.fontface;\n\n\t\tvar metrics = contextTitle.measureText( this.legend.labels.title.toString() + this.legend.labels.um.toString() );\n\t\tvar textWidth = metrics.width;\n\n\t\tcontextTitle.fillStyle = 'rgba(' + backgroundColor.r + ',' + backgroundColor.g + ',' + backgroundColor.b + ',' + backgroundColor.a + ')';\n\n\t\tcontextTitle.strokeStyle = 'rgba(' + borderColor.r + ',' + borderColor.g + ',' + borderColor.b + ',' + borderColor.a + ')';\n\n\t\tcontextTitle.lineWidth = borderThickness;\n\n\t\tcontextTitle.fillStyle = 'rgba( 0, 0, 0, 1.0 )';\n\n\t\tcontextTitle.fillText( this.legend.labels.title.toString() + this.legend.labels.um.toString(), borderThickness, this.legend.labels.fontsize + borderThickness );\n\n\t\tvar txtTitle = new THREE.Texture( canvasTitle );\n\n\t\ttxtTitle.needsUpdate = true;\n\n\t\tvar spriteMaterialTitle = new THREE.SpriteMaterial( { map: txtTitle, useScreenCoordinates: false } );\n\n\t\tvar spriteTitle = new THREE.Sprite( spriteMaterialTitle );\n\n\t\tspriteTitle.scale.set( 2, 1, 1.0 );\n\n\t\tif ( this.legend.layout == 'vertical' ) {\n\n\t\t\tspriteTitle.position.set( this.legend.position.x + this.legend.dimensions.width, this.legend.position.y + ( this.legend.dimensions.height * 0.45 ), this.legend.position.z );\n\n\t\t}\n\n\t\tif ( this.legend.layout == 'horizontal' ) {\n\n\t\t\tspriteTitle.position.set( this.legend.position.x * 1.015, this.legend.position.y + ( this.legend.dimensions.height * 0.03 ), this.legend.position.z );\n\n\t\t}\n\n\t\tif ( this.legend.labels.ticks > 0 ) {\n\n\t\t\tvar ticks = {};\n\t\t\tvar lines = {};\n\n\t\t\tif ( this.legend.layout == 'vertical' ) {\n\n\t\t\t\tvar topPositionY = this.legend.position.y + ( this.legend.dimensions.height * 0.36 );\n\t\t\t\tvar bottomPositionY = this.legend.position.y - ( this.legend.dimensions.height * 0.61 );\n\n\t\t\t}\n\n\t\t\tif ( this.legend.layout == 'horizontal' ) {\n\n\t\t\t\tvar topPositionX = this.legend.position.x + ( this.legend.dimensions.height * 0.75 );\n\t\t\t\tvar bottomPositionX = this.legend.position.x - ( this.legend.dimensions.width * 1.2 ) ;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < this.legend.labels.ticks; i++ ) {\n\n\t\t\t\tvar value = ( this.maxV - this.minV ) / ( this.legend.labels.ticks - 1 ) * i ;\n\n\t\t\t\tif ( callback ) {\n\n\t\t\t\t\tvalue = callback ( value );\n\n\t\t\t\t}\n\n\t\t\t\telse {\n\n\t\t\t\t\tif ( this.legend.labels.notation == 'scientific' ) {\n\n\t\t\t\t\t\tvalue = value.toExponential( this.legend.labels.decimal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse {\n\n\t\t\t\t\t\tvalue = value.toFixed( this.legend.labels.decimal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar canvasTick = document.createElement( 'canvas' );\n\t\t\t\tvar contextTick = canvasTick.getContext( '2d' );\n\n\t\t\t\tcontextTick.font = 'Normal ' + this.legend.labels.fontsize + 'px ' + this.legend.labels.fontface;\n\n\t\t\t\tvar metrics = contextTick.measureText( value.toString() );\n\t\t\t\tvar textWidth = metrics.width;\n\n\t\t\t\tcontextTick.fillStyle = 'rgba(' + backgroundColor.r + ',' + backgroundColor.g + ',' + backgroundColor.b + ',' + backgroundColor.a + ')';\n\n\t\t\t\tcontextTick.strokeStyle = 'rgba(' + borderColor.r + ',' + borderColor.g + ',' + borderColor.b + ',' + borderColor.a + ')';\n\n\t\t\t\tcontextTick.lineWidth = borderThickness;\n\n\t\t\t\tcontextTick.fillStyle = 'rgba( 0, 0, 0, 1.0 )';\n\n\t\t\t\tcontextTick.fillText( value.toString(), borderThickness, this.legend.labels.fontsize + borderThickness );\n\n\t\t\t\tvar txtTick = new THREE.Texture( canvasTick );\n\n\t\t\t\ttxtTick.needsUpdate = true;\n\n\t\t\t\tvar spriteMaterialTick = new THREE.SpriteMaterial( { map: txtTick, useScreenCoordinates: false } );\n\n\t\t\t\tvar spriteTick = new THREE.Sprite( spriteMaterialTick );\n\n\t\t\t\tspriteTick.scale.set( 2, 1, 1.0 );\n\n\t\t\t\tif ( this.legend.layout == 'vertical' ) {\n\n\t\t\t\t\tvar position = bottomPositionY + ( topPositionY - bottomPositionY ) * ( value / ( this.maxV - this.minV ) );\n\n\t\t\t\t\tspriteTick.position.set( this.legend.position.x + ( this.legend.dimensions.width * 2.7 ), position, this.legend.position.z );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.legend.layout == 'horizontal' ) {\n\n\t\t\t\t\tvar position = bottomPositionX + ( topPositionX - bottomPositionX ) * ( value / ( this.maxV - this.minV ) );\n\n\t\t\t\t\tif ( this.legend.labels.ticks > 5 ) {\n\n\t\t\t\t\t\tif ( i % 2 === 0 ) { var offset = 1.7; }\n\n\t\t\t\t\t\telse { var offset = 2.1; }\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse { var offset = 1.7; }\n\n\t\t\t\t\tspriteTick.position.set( position, this.legend.position.y - this.legend.dimensions.width * offset, this.legend.position.z );\n\n\t\t\t\t}\n\n\t\t\t\tvar material = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 2 } );\n\n\t\t\t\tvar geometry = new THREE.Geometry();\n\n\n\t\t\t\tif ( this.legend.layout == 'vertical' ) {\n\n\t\t\t\t\tvar linePosition = ( this.legend.position.y - ( this.legend.dimensions.height * 0.5 ) + 0.01 ) + ( this.legend.dimensions.height ) * ( value / ( this.maxV - this.minV ) * 0.99 );\n\n\t\t\t\t\tgeometry.vertices.push( new THREE.Vector3( this.legend.position.x + this.legend.dimensions.width * 0.55, linePosition , this.legend.position.z ) );\n\n\t\t\t\t\tgeometry.vertices.push( new THREE.Vector3( this.legend.position.x + this.legend.dimensions.width * 0.7, linePosition, this.legend.position.z ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.legend.layout == 'horizontal' ) {\n\n\t\t\t\t\tvar linePosition = ( this.legend.position.x - ( this.legend.dimensions.height * 0.5 ) + 0.01 ) + ( this.legend.dimensions.height ) * ( value / ( this.maxV - this.minV ) * 0.99 );\n\n\t\t\t\t\tgeometry.vertices.push( new THREE.Vector3( linePosition, this.legend.position.y - this.legend.dimensions.width * 0.55, this.legend.position.z ) );\n\n\t\t\t\t\tgeometry.vertices.push( new THREE.Vector3( linePosition, this.legend.position.y - this.legend.dimensions.width * 0.7, this.legend.position.z ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar line = new THREE.Line( geometry, material );\n\n\t\t\t\tlines[ i ] = line;\n\t\t\t\tticks[ i ] = spriteTick;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn { 'title': spriteTitle, 'ticks': ticks, 'lines': lines };\n\n\t}\n\n};\n\n\nTHREE.ColorMapKeywords = {\n\n \"rainbow\": [ [ 0.0, '0x0000FF' ], [ 0.2, '0x00FFFF' ], [ 0.5, '0x00FF00' ], [ 0.8, '0xFFFF00'], [1.0, '0xFF0000' ] ],\n \"cooltowarm\": [ [ 0.0, '0x3C4EC2' ], [ 0.2, '0x9BBCFF' ], [ 0.5, '0xDCDCDC' ], [ 0.8, '0xF6A385'], [1.0, '0xB40426' ] ],\n \"blackbody\" : [ [ 0.0, '0x000000' ], [ 0.2, '0x780000' ], [ 0.5, '0xE63200' ], [ 0.8, '0xFFFF00'], [1.0, '0xFFFFFF' ] ],\n \"grayscale\" : [ [ 0.0, '0x000000' ], [ 0.2, '0x404040' ], [ 0.5, '0x7F7F80' ], [ 0.8, '0xBFBFBF'], [1.0, '0xFFFFFF' ] ]\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Math/ColorConverter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Math/ColorConverter.js",
"module-type": "library",
"text": "/**\n * @author bhouston / http://exocortex.com/\n * @author zz85 / http://github.com/zz85\n */\n\nTHREE.ColorConverter = {\n\n\tsetHSV: function ( color, h, s, v ) {\n\n\t\t// https://gist.github.com/xpansive/1337890#file-index-js\n\t\treturn color.setHSL( h, ( s * v ) / ( ( h = ( 2 - s ) * v ) < 1 ? h : ( 2 - h ) ), h * 0.5 );\n\n\t},\n\n\tgetHSV: function( color ) {\n\n\t\tvar hsl = color.getHSL();\n\n\t\t// based on https://gist.github.com/xpansive/1337890#file-index-js\n\t\thsl.s *= ( hsl.l < 0.5 ) ? hsl.l : ( 1 - hsl.l );\n\n\t\treturn {\n\t\t\th: hsl.h,\n\t\t\ts: 2 * hsl.s / ( hsl.l + hsl.s ),\n\t\t\tv: hsl.l + hsl.s\n\t\t};\n\t},\n\n\t// where c, m, y, k is between 0 and 1\n\t\n\tsetCMYK: function ( color, c, m, y, k ) {\n\n\t\tvar r = ( 1 - c ) * ( 1 - k );\n\t\tvar g = ( 1 - m ) * ( 1 - k );\n\t\tvar b = ( 1 - y ) * ( 1 - k );\n\n\t\treturn color.setRGB( r, g, b );\n\n\t},\n\n\tgetCMYK: function ( color ) {\n\n\t\tvar r = color.r;\n\t\tvar g = color.g;\n\t\tvar b = color.b;\n\t\tvar k = 1 - Math.max(r, g, b);\n\t\tvar c = ( 1 - r - k ) / ( 1 - k );\n\t\tvar m = ( 1 - g - k ) / ( 1 - k );\n\t\tvar y = ( 1 - b - k ) / ( 1 - k );\n\n\t\treturn {\n\t\t\tc: c, m: m, y: y, k: k\n\t\t};\n\n\t}\n\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Modifiers/TessellateModifier.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Modifiers/TessellateModifier.js",
"module-type": "library",
"text": "/**\n * Break faces with edges longer than maxEdgeLength\n * - not recursive\n *\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.TessellateModifier = function ( maxEdgeLength ) {\n\n\tthis.maxEdgeLength = maxEdgeLength;\n\n};\n\nTHREE.TessellateModifier.prototype.modify = function ( geometry ) {\n\n\tvar i, il, face,\n\ta, b, c, d,\n\tva, vb, vc, vd,\n\tdab, dbc, dac, dcd, dad,\n\tm, m1, m2,\n\tvm, vm1, vm2,\n\tvnm, vnm1, vnm2,\n\tvcm, vcm1, vcm2,\n\ttriA, triB,\n\tquadA, quadB,\n\tedge;\n\n\tvar faces = [];\n\tvar faceVertexUvs = [];\n\tvar maxEdgeLength = this.maxEdgeLength;\n\n\tfor ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\tfaceVertexUvs[ i ] = [];\n\n\t}\n\n\tfor ( i = 0, il = geometry.faces.length; i < il; i ++ ) {\n\n\t\tface = geometry.faces[ i ];\n\n\t\tif ( face instanceof THREE.Face3 ) {\n\n\t\t\ta = face.a;\n\t\t\tb = face.b;\n\t\t\tc = face.c;\n\n\t\t\tva = geometry.vertices[ a ];\n\t\t\tvb = geometry.vertices[ b ];\n\t\t\tvc = geometry.vertices[ c ];\n\n\t\t\tdab = va.distanceTo( vb );\n\t\t\tdbc = vb.distanceTo( vc );\n\t\t\tdac = va.distanceTo( vc );\n\n\t\t\tif ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {\n\n\t\t\t\tm = geometry.vertices.length;\n\n\t\t\t\ttriA = face.clone();\n\t\t\t\ttriB = face.clone();\n\n\t\t\t\tif ( dab >= dbc && dab >= dac ) {\n\n\t\t\t\t\tvm = va.clone();\n\t\t\t\t\tvm.lerp( vb, 0.5 );\n\n\t\t\t\t\ttriA.a = a;\n\t\t\t\t\ttriA.b = m;\n\t\t\t\t\ttriA.c = c;\n\n\t\t\t\t\ttriB.a = m;\n\t\t\t\t\ttriB.b = b;\n\t\t\t\t\ttriB.c = c;\n\n\t\t\t\t\tif ( face.vertexNormals.length === 3 ) {\n\n\t\t\t\t\t\tvnm = face.vertexNormals[ 0 ].clone();\n\t\t\t\t\t\tvnm.lerp( face.vertexNormals[ 1 ], 0.5 );\n\n\t\t\t\t\t\ttriA.vertexNormals[ 1 ].copy( vnm );\n\t\t\t\t\t\ttriB.vertexNormals[ 0 ].copy( vnm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( face.vertexColors.length === 3 ) {\n\n\t\t\t\t\t\tvcm = face.vertexColors[ 0 ].clone();\n\t\t\t\t\t\tvcm.lerp( face.vertexColors[ 1 ], 0.5 );\n\n\t\t\t\t\t\ttriA.vertexColors[ 1 ].copy( vcm );\n\t\t\t\t\t\ttriB.vertexColors[ 0 ].copy( vcm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = 0;\n\n\t\t\t\t} else if ( dbc >= dab && dbc >= dac ) {\n\n\t\t\t\t\tvm = vb.clone();\n\t\t\t\t\tvm.lerp( vc, 0.5 );\n\n\t\t\t\t\ttriA.a = a;\n\t\t\t\t\ttriA.b = b;\n\t\t\t\t\ttriA.c = m;\n\n\t\t\t\t\ttriB.a = m;\n\t\t\t\t\ttriB.b = c;\n\t\t\t\t\ttriB.c = a;\n\n\t\t\t\t\tif ( face.vertexNormals.length === 3 ) {\n\n\t\t\t\t\t\tvnm = face.vertexNormals[ 1 ].clone();\n\t\t\t\t\t\tvnm.lerp( face.vertexNormals[ 2 ], 0.5 );\n\n\t\t\t\t\t\ttriA.vertexNormals[ 2 ].copy( vnm );\n\n\t\t\t\t\t\ttriB.vertexNormals[ 0 ].copy( vnm );\n\t\t\t\t\t\ttriB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );\n\t\t\t\t\t\ttriB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( face.vertexColors.length === 3 ) {\n\n\t\t\t\t\t\tvcm = face.vertexColors[ 1 ].clone();\n\t\t\t\t\t\tvcm.lerp( face.vertexColors[ 2 ], 0.5 );\n\n\t\t\t\t\t\ttriA.vertexColors[ 2 ].copy( vcm );\n\n\t\t\t\t\t\ttriB.vertexColors[ 0 ].copy( vcm );\n\t\t\t\t\t\ttriB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );\n\t\t\t\t\t\ttriB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvm = va.clone();\n\t\t\t\t\tvm.lerp( vc, 0.5 );\n\n\t\t\t\t\ttriA.a = a;\n\t\t\t\t\ttriA.b = b;\n\t\t\t\t\ttriA.c = m;\n\n\t\t\t\t\ttriB.a = m;\n\t\t\t\t\ttriB.b = b;\n\t\t\t\t\ttriB.c = c;\n\n\t\t\t\t\tif ( face.vertexNormals.length === 3 ) {\n\n\t\t\t\t\t\tvnm = face.vertexNormals[ 0 ].clone();\n\t\t\t\t\t\tvnm.lerp( face.vertexNormals[ 2 ], 0.5 );\n\n\t\t\t\t\t\ttriA.vertexNormals[ 2 ].copy( vnm );\n\t\t\t\t\t\ttriB.vertexNormals[ 0 ].copy( vnm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( face.vertexColors.length === 3 ) {\n\n\t\t\t\t\t\tvcm = face.vertexColors[ 0 ].clone();\n\t\t\t\t\t\tvcm.lerp( face.vertexColors[ 2 ], 0.5 );\n\n\t\t\t\t\t\ttriA.vertexColors[ 2 ].copy( vcm );\n\t\t\t\t\t\ttriB.vertexColors[ 0 ].copy( vcm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = 2;\n\n\t\t\t\t}\n\n\t\t\t\tfaces.push( triA, triB );\n\t\t\t\tgeometry.vertices.push( vm );\n\n\t\t\t\tvar j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;\n\n\t\t\t\tfor ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tif ( geometry.faceVertexUvs[ j ].length ) {\n\n\t\t\t\t\t\tuvs = geometry.faceVertexUvs[ j ][ i ];\n\n\t\t\t\t\t\tuvA = uvs[ 0 ];\n\t\t\t\t\t\tuvB = uvs[ 1 ];\n\t\t\t\t\t\tuvC = uvs[ 2 ];\n\n\t\t\t\t\t\t// AB\n\n\t\t\t\t\t\tif ( edge === 0 ) {\n\n\t\t\t\t\t\t\tuvM = uvA.clone();\n\t\t\t\t\t\t\tuvM.lerp( uvB, 0.5 );\n\n\t\t\t\t\t\t\tuvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];\n\t\t\t\t\t\t\tuvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];\n\n\t\t\t\t\t\t// BC\n\n\t\t\t\t\t\t} else if ( edge === 1 ) {\n\n\t\t\t\t\t\t\tuvM = uvB.clone();\n\t\t\t\t\t\t\tuvM.lerp( uvC, 0.5 );\n\n\t\t\t\t\t\t\tuvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];\n\t\t\t\t\t\t\tuvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];\n\n\t\t\t\t\t\t// AC\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuvM = uvA.clone();\n\t\t\t\t\t\t\tuvM.lerp( uvC, 0.5 );\n\n\t\t\t\t\t\t\tuvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];\n\t\t\t\t\t\t\tuvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfaceVertexUvs[ j ].push( uvsTriA, uvsTriB );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfaces.push( face );\n\n\t\t\t\tfor ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tfaceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\ta = face.a;\n\t\t\tb = face.b;\n\t\t\tc = face.c;\n\t\t\td = face.d;\n\n\t\t\tva = geometry.vertices[ a ];\n\t\t\tvb = geometry.vertices[ b ];\n\t\t\tvc = geometry.vertices[ c ];\n\t\t\tvd = geometry.vertices[ d ];\n\n\t\t\tdab = va.distanceTo( vb );\n\t\t\tdbc = vb.distanceTo( vc );\n\t\t\tdcd = vc.distanceTo( vd );\n\t\t\tdad = va.distanceTo( vd );\n\n\t\t\tif ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {\n\n\t\t\t\tm1 = geometry.vertices.length;\n\t\t\t\tm2 = geometry.vertices.length + 1;\n\n\t\t\t\tquadA = face.clone();\n\t\t\t\tquadB = face.clone();\n\n\t\t\t\tif ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {\n\n\t\t\t\t\tvm1 = va.clone();\n\t\t\t\t\tvm1.lerp( vb, 0.5 );\n\n\t\t\t\t\tvm2 = vc.clone();\n\t\t\t\t\tvm2.lerp( vd, 0.5 );\n\n\t\t\t\t\tquadA.a = a;\n\t\t\t\t\tquadA.b = m1;\n\t\t\t\t\tquadA.c = m2;\n\t\t\t\t\tquadA.d = d;\n\n\t\t\t\t\tquadB.a = m1;\n\t\t\t\t\tquadB.b = b;\n\t\t\t\t\tquadB.c = c;\n\t\t\t\t\tquadB.d = m2;\n\n\t\t\t\t\tif ( face.vertexNormals.length === 4 ) {\n\n\t\t\t\t\t\tvnm1 = face.vertexNormals[ 0 ].clone();\n\t\t\t\t\t\tvnm1.lerp( face.vertexNormals[ 1 ], 0.5 );\n\n\t\t\t\t\t\tvnm2 = face.vertexNormals[ 2 ].clone();\n\t\t\t\t\t\tvnm2.lerp( face.vertexNormals[ 3 ], 0.5 );\n\n\t\t\t\t\t\tquadA.vertexNormals[ 1 ].copy( vnm1 );\n\t\t\t\t\t\tquadA.vertexNormals[ 2 ].copy( vnm2 );\n\n\t\t\t\t\t\tquadB.vertexNormals[ 0 ].copy( vnm1 );\n\t\t\t\t\t\tquadB.vertexNormals[ 3 ].copy( vnm2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( face.vertexColors.length === 4 ) {\n\n\t\t\t\t\t\tvcm1 = face.vertexColors[ 0 ].clone();\n\t\t\t\t\t\tvcm1.lerp( face.vertexColors[ 1 ], 0.5 );\n\n\t\t\t\t\t\tvcm2 = face.vertexColors[ 2 ].clone();\n\t\t\t\t\t\tvcm2.lerp( face.vertexColors[ 3 ], 0.5 );\n\n\t\t\t\t\t\tquadA.vertexColors[ 1 ].copy( vcm1 );\n\t\t\t\t\t\tquadA.vertexColors[ 2 ].copy( vcm2 );\n\n\t\t\t\t\t\tquadB.vertexColors[ 0 ].copy( vcm1 );\n\t\t\t\t\t\tquadB.vertexColors[ 3 ].copy( vcm2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvm1 = vb.clone();\n\t\t\t\t\tvm1.lerp( vc, 0.5 );\n\n\t\t\t\t\tvm2 = vd.clone();\n\t\t\t\t\tvm2.lerp( va, 0.5 );\n\n\t\t\t\t\tquadA.a = a;\n\t\t\t\t\tquadA.b = b;\n\t\t\t\t\tquadA.c = m1;\n\t\t\t\t\tquadA.d = m2;\n\n\t\t\t\t\tquadB.a = m2;\n\t\t\t\t\tquadB.b = m1;\n\t\t\t\t\tquadB.c = c;\n\t\t\t\t\tquadB.d = d;\n\n\t\t\t\t\tif ( face.vertexNormals.length === 4 ) {\n\n\t\t\t\t\t\tvnm1 = face.vertexNormals[ 1 ].clone();\n\t\t\t\t\t\tvnm1.lerp( face.vertexNormals[ 2 ], 0.5 );\n\n\t\t\t\t\t\tvnm2 = face.vertexNormals[ 3 ].clone();\n\t\t\t\t\t\tvnm2.lerp( face.vertexNormals[ 0 ], 0.5 );\n\n\t\t\t\t\t\tquadA.vertexNormals[ 2 ].copy( vnm1 );\n\t\t\t\t\t\tquadA.vertexNormals[ 3 ].copy( vnm2 );\n\n\t\t\t\t\t\tquadB.vertexNormals[ 0 ].copy( vnm2 );\n\t\t\t\t\t\tquadB.vertexNormals[ 1 ].copy( vnm1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( face.vertexColors.length === 4 ) {\n\n\t\t\t\t\t\tvcm1 = face.vertexColors[ 1 ].clone();\n\t\t\t\t\t\tvcm1.lerp( face.vertexColors[ 2 ], 0.5 );\n\n\t\t\t\t\t\tvcm2 = face.vertexColors[ 3 ].clone();\n\t\t\t\t\t\tvcm2.lerp( face.vertexColors[ 0 ], 0.5 );\n\n\t\t\t\t\t\tquadA.vertexColors[ 2 ].copy( vcm1 );\n\t\t\t\t\t\tquadA.vertexColors[ 3 ].copy( vcm2 );\n\n\t\t\t\t\t\tquadB.vertexColors[ 0 ].copy( vcm2 );\n\t\t\t\t\t\tquadB.vertexColors[ 1 ].copy( vcm1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tedge = 1;\n\n\t\t\t\t}\n\n\t\t\t\tfaces.push( quadA, quadB );\n\t\t\t\tgeometry.vertices.push( vm1, vm2 );\n\n\t\t\t\tvar j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;\n\n\t\t\t\tfor ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tif ( geometry.faceVertexUvs[ j ].length ) {\n\n\t\t\t\t\t\tuvs = geometry.faceVertexUvs[ j ][ i ];\n\n\t\t\t\t\t\tuvA = uvs[ 0 ];\n\t\t\t\t\t\tuvB = uvs[ 1 ];\n\t\t\t\t\t\tuvC = uvs[ 2 ];\n\t\t\t\t\t\tuvD = uvs[ 3 ];\n\n\t\t\t\t\t\t// AB + CD\n\n\t\t\t\t\t\tif ( edge === 0 ) {\n\n\t\t\t\t\t\t\tuvM1 = uvA.clone();\n\t\t\t\t\t\t\tuvM1.lerp( uvB, 0.5 );\n\n\t\t\t\t\t\t\tuvM2 = uvC.clone();\n\t\t\t\t\t\t\tuvM2.lerp( uvD, 0.5 );\n\n\t\t\t\t\t\t\tuvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];\n\t\t\t\t\t\t\tuvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];\n\n\t\t\t\t\t\t// BC + AD\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuvM1 = uvB.clone();\n\t\t\t\t\t\t\tuvM1.lerp( uvC, 0.5 );\n\n\t\t\t\t\t\t\tuvM2 = uvD.clone();\n\t\t\t\t\t\t\tuvM2.lerp( uvA, 0.5 );\n\n\t\t\t\t\t\t\tuvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];\n\t\t\t\t\t\t\tuvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfaceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfaces.push( face );\n\n\t\t\t\tfor ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tfaceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgeometry.faces = faces;\n\tgeometry.faceVertexUvs = faceVertexUvs;\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Modifiers/ExplodeModifier.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Modifiers/ExplodeModifier.js",
"module-type": "library",
"text": "/**\n * Make all faces use unique vertices\n * so that each face can be separated from others\n *\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ExplodeModifier = function () {\n\n};\n\nTHREE.ExplodeModifier.prototype.modify = function ( geometry ) {\n\n\tvar vertices = [];\n\n\tfor ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {\n\n\t\tvar n = vertices.length;\n\n\t\tvar face = geometry.faces[ i ];\n\n\t\tvar a = face.a;\n\t\tvar b = face.b;\n\t\tvar c = face.c;\n\n\t\tvar va = geometry.vertices[ a ];\n\t\tvar vb = geometry.vertices[ b ];\n\t\tvar vc = geometry.vertices[ c ];\n\n\t\tvertices.push( va.clone() );\n\t\tvertices.push( vb.clone() );\n\t\tvertices.push( vc.clone() );\n\n\t\tface.a = n;\n\t\tface.b = n + 1;\n\t\tface.c = n + 2;\n\n\t}\n\n\tgeometry.vertices = vertices;\n\tdelete geometry.__tmpVertices;\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/Modifiers/SubdivisionModifier.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Modifiers/SubdivisionModifier.js",
"module-type": "library",
"text": "/*\r\n *\t@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog \r\n *\r\n *\tSubdivision Geometry Modifier \r\n *\t\tusing Loop Subdivision Scheme\r\n *\r\n *\tReferences:\r\n *\t\thttp://graphics.stanford.edu/~mdfisher/subdivision.html\r\n *\t\thttp://www.holmes3d.net/graphics/subdivision/\r\n *\t\thttp://www.cs.rutgers.edu/~decarlo/readings/subdiv-sg00c.pdf\r\n *\r\n *\tKnown Issues:\r\n *\t\t- currently doesn't handle UVs\r\n *\t\t- currently doesn't handle \"Sharp Edges\"\r\n *\r\n */\r\n\r\nTHREE.SubdivisionModifier = function ( subdivisions ) {\r\n\r\n\tthis.subdivisions = (subdivisions === undefined ) ? 1 : subdivisions;\r\n\r\n};\r\n\r\n// Applies the \"modify\" pattern\r\nTHREE.SubdivisionModifier.prototype.modify = function ( geometry ) {\r\n\r\n\tvar repeats = this.subdivisions;\r\n\r\n\twhile ( repeats-- > 0 ) {\r\n\t\tthis.smooth( geometry );\r\n\t}\r\n\r\n\tdelete geometry.__tmpVertices;\r\n\r\n\tgeometry.computeFaceNormals();\r\n\tgeometry.computeVertexNormals();\r\n\r\n};\r\n\r\n(function() {\r\n\r\n\t// Some constants\r\n\tvar WARNINGS = !true; // Set to true for development\r\n\tvar ABC = [ 'a', 'b', 'c' ];\r\n\t\r\n\r\n\tfunction getEdge( a, b, map ) {\r\n\r\n\t\tvar vertexIndexA = Math.min( a, b );\r\n\t\tvar vertexIndexB = Math.max( a, b );\r\n\r\n\t\tvar key = vertexIndexA + \"_\" + vertexIndexB;\r\n\r\n\t\treturn map[ key ];\r\n\r\n\t}\r\n\r\n\r\n\tfunction processEdge( a, b, vertices, map, face, metaVertices ) {\r\n\r\n\t\tvar vertexIndexA = Math.min( a, b );\r\n\t\tvar vertexIndexB = Math.max( a, b );\r\n\r\n\t\tvar key = vertexIndexA + \"_\" + vertexIndexB;\r\n\r\n\t\tvar edge;\r\n\r\n\t\tif ( key in map ) {\r\n\r\n\t\t\tedge = map[ key ];\r\n\r\n\t\t} else {\r\n\t\t\t\r\n\t\t\tvar vertexA = vertices[ vertexIndexA ];\r\n\t\t\tvar vertexB = vertices[ vertexIndexB ];\r\n\r\n\t\t\tedge = {\r\n\r\n\t\t\t\ta: vertexA, // pointer reference\r\n\t\t\t\tb: vertexB,\r\n\t\t\t\tnewEdge: null,\r\n\t\t\t\t// aIndex: a, // numbered reference\r\n\t\t\t\t// bIndex: b,\r\n\t\t\t\tfaces: [] // pointers to face\r\n\r\n\t\t\t};\r\n\r\n\t\t\tmap[ key ] = edge;\r\n\r\n\t\t}\r\n\r\n\t\tedge.faces.push( face );\r\n\r\n\t\tmetaVertices[ a ].edges.push( edge );\r\n\t\tmetaVertices[ b ].edges.push( edge );\r\n\t\t\r\n\r\n\t}\r\n\r\n\tfunction generateLookups( vertices, faces, metaVertices, edges ) {\r\n\r\n\t\tvar i, il, face, edge;\r\n\r\n\t\tfor ( i = 0, il = vertices.length; i < il; i++ ) {\r\n\t\t\tmetaVertices[ i ] = { edges: [] };\r\n\t\t}\r\n\t\t\r\n\t\tfor ( i = 0, il = faces.length; i < il; i++ ) {\r\n\t\t\tface = faces[ i ];\r\n\r\n\t\t\tprocessEdge( face.a, face.b, vertices, edges, face, metaVertices );\r\n\t\t\tprocessEdge( face.b, face.c, vertices, edges, face, metaVertices );\r\n\t\t\tprocessEdge( face.c, face.a, vertices, edges, face, metaVertices );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tfunction newFace( newFaces, a, b, c ) {\r\n\r\n\t\tnewFaces.push( new THREE.Face3( a, b, c ) );\r\n\r\n\t}\r\n\r\n\r\n\t/////////////////////////////\r\n\r\n\t// Performs one iteration of Subdivision\r\n\tTHREE.SubdivisionModifier.prototype.smooth = function ( geometry ) {\r\n\r\n\t\tvar tmp = new THREE.Vector3();\r\n\r\n\t\tvar oldVertices, oldFaces;\r\n\t\tvar newVertices, newFaces; // newUVs = [];\r\n\r\n\t\tvar n, l, i, il, j, k;\r\n\t\tvar metaVertices, sourceEdges;\r\n\r\n\t\t// new stuff.\r\n\t\tvar sourceEdges, newEdgeVertices, newSourceVertices\r\n\r\n\t\toldVertices = geometry.vertices; // { x, y, z}\r\n\t\toldFaces = geometry.faces; // { a: oldVertex1, b: oldVertex2, c: oldVertex3 }\r\n\r\n\t\t/******************************************************\r\n\t\t *\r\n\t\t * Step 0: Preprocess Geometry to Generate edges Lookup\r\n\t\t *\r\n\t\t *******************************************************/\r\n\r\n\t\tmetaVertices = new Array( oldVertices.length );\r\n\t\tsourceEdges = {}; // Edge => { oldVertex1, oldVertex2, faces[] }\r\n\r\n\t\tgenerateLookups(oldVertices, oldFaces, metaVertices, sourceEdges);\r\n\r\n\r\n\t\t/******************************************************\r\n\t\t *\r\n\t\t *\tStep 1. \r\n\t\t *\tFor each edge, create a new Edge Vertex,\r\n\t\t *\tthen position it.\r\n\t\t *\r\n\t\t *******************************************************/\r\n\r\n\t\tnewEdgeVertices = [];\r\n\t\tvar other, currentEdge, newEdge, face;\r\n\t\tvar edgeVertexWeight, adjacentVertexWeight, connectedFaces;\r\n\r\n\t\tfor ( i in sourceEdges ) {\r\n\r\n\t\t\tcurrentEdge = sourceEdges[ i ];\r\n\t\t\tnewEdge = new THREE.Vector3();\r\n\r\n\t\t\tedgeVertexWeight = 3 / 8;\r\n\t\t\tadjacentVertexWeight = 1 / 8;\r\n\r\n\t\t\tconnectedFaces = currentEdge.faces.length;\r\n\r\n\t\t\t// check how many linked faces. 2 should be correct.\r\n\t\t\tif ( connectedFaces != 2 ) {\r\n\r\n\t\t\t\t// if length is not 2, handle condition\r\n\t\t\t\tedgeVertexWeight = 0.5;\r\n\t\t\t\tadjacentVertexWeight = 0;\r\n\r\n\t\t\t\tif ( connectedFaces != 1 ) {\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (WARNINGS) console.warn('Subdivision Modifier: Number of connected faces != 2, is: ', connectedFaces, currentEdge);\r\n\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tnewEdge.addVectors( currentEdge.a, currentEdge.b ).multiplyScalar( edgeVertexWeight );\r\n\r\n\t\t\ttmp.set( 0, 0, 0 );\r\n\r\n\t\t\tfor ( j = 0; j < connectedFaces; j++ ) {\r\n\r\n\t\t\t\tface = currentEdge.faces[ j ];\r\n\t\t\t\t\r\n\t\t\t\tfor ( k = 0; k < 3; k++ ) {\r\n\r\n\t\t\t\t\tother = oldVertices[ face[ ABC[k] ] ];\r\n\t\t\t\t\tif (other !== currentEdge.a && other !== currentEdge.b ) break;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttmp.add( other );\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttmp.multiplyScalar( adjacentVertexWeight );\r\n\t\t\tnewEdge.add( tmp );\r\n\r\n\t\t\tcurrentEdge.newEdge = newEdgeVertices.length;\r\n\t\t\tnewEdgeVertices.push(newEdge);\r\n\r\n\t\t\t// console.log(currentEdge, newEdge);\r\n\t\t}\r\n\r\n\t\t/******************************************************\r\n\t\t *\r\n\t\t *\tStep 2. \r\n\t\t *\tReposition each source vertices.\r\n\t\t *\r\n\t\t *******************************************************/\r\n\r\n\t\tvar beta, sourceVertexWeight, connectingVertexWeight;\r\n\t\tvar connectingEdge, connectingEdges, oldVertex, newSourceVertex;\r\n\t\tnewSourceVertices = [];\r\n\r\n\t\tfor ( i = 0, il = oldVertices.length; i < il; i++ ) {\r\n\r\n\t\t\toldVertex = oldVertices[ i ];\r\n\r\n\t\t\t// find all connecting edges (using lookupTable)\r\n\t\t\tconnectingEdges = metaVertices[ i ].edges;\r\n\t\t\tn = connectingEdges.length;\r\n\t\t\tbeta;\r\n\r\n\t\t\tif ( n == 3 ) {\r\n\r\n\t\t\t\tbeta = 3 / 16;\r\n\r\n\t\t\t} else if ( n > 3 ) {\r\n\r\n\t\t\t\tbeta = 3 / ( 8 * n ); // Warren's modified formula\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Loop's original beta formula\r\n\t\t\t// beta = 1 / n * ( 5/8 - Math.pow( 3/8 + 1/4 * Math.cos( 2 * Math. PI / n ), 2) );\r\n\r\n\t\t\tsourceVertexWeight = 1 - n * beta;\r\n\t\t\tconnectingVertexWeight = beta;\r\n\r\n\t\t\tif ( n <= 2 ) {\r\n\t\t\t\t\r\n\t\t\t\t// crease and boundary rules\r\n\t\t\t\t// console.warn('crease and boundary rules');\r\n\r\n\t\t\t\tif ( n == 2 ) {\r\n\r\n\t\t\t\t\tif (WARNINGS) console.warn('2 connecting edges', connectingEdges);\r\n\t\t\t\t\tsourceVertexWeight = 3 / 4;\r\n\t\t\t\t\tconnectingVertexWeight = 1 / 8;\r\n\r\n\t\t\t\t\t// sourceVertexWeight = 1;\r\n\t\t\t\t\t// connectingVertexWeight = 0;\r\n\r\n\t\t\t\t} else if ( n == 1 ) {\r\n\r\n\t\t\t\t\tif (WARNINGS) console.warn('only 1 connecting edge');\r\n\r\n\t\t\t\t} else if ( n == 0 ) {\r\n\r\n\t\t\t\t\tif (WARNINGS) console.warn('0 connecting edges');\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tnewSourceVertex = oldVertex.clone().multiplyScalar( sourceVertexWeight );\r\n\r\n\t\t\ttmp.set( 0, 0, 0 );\r\n\r\n\t\t\tfor ( j=0; j < n; j++ ) {\r\n\r\n\t\t\t\tconnectingEdge = connectingEdges[ j ];\r\n\t\t\t\tother = connectingEdge.a !== oldVertex ? connectingEdge.a : connectingEdge.b;\r\n\t\t\t\ttmp.add( other );\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttmp.multiplyScalar( connectingVertexWeight );\r\n\t\t\tnewSourceVertex.add( tmp );\r\n\t\t\t\r\n\t\t\tnewSourceVertices.push( newSourceVertex );\r\n\r\n\t\t}\r\n\r\n\t\t\t\t\t\t\t \r\n\t\t/******************************************************\r\n\t\t *\r\n\t\t *\tStep 3. \r\n\t\t *\tGenerate Faces between source vertecies\r\n\t\t *\tand edge vertices.\r\n\t\t *\r\n\t\t *******************************************************/\r\n\r\n\t\tnewVertices = newSourceVertices.concat( newEdgeVertices );\r\n\t\tvar sl = newSourceVertices.length, edge1, edge2, edge3;\r\n\t\tnewFaces = [];\r\n\r\n\t\tfor ( i = 0, il = oldFaces.length; i < il; i++ ) {\r\n\r\n\t\t\tface = oldFaces[ i ];\r\n\r\n\t\t\t// find the 3 new edges vertex of each old face\r\n\r\n\t\t\tedge1 = getEdge( face.a, face.b, sourceEdges ).newEdge + sl;\r\n\t\t\tedge2 = getEdge( face.b, face.c, sourceEdges ).newEdge + sl;\r\n\t\t\tedge3 = getEdge( face.c, face.a, sourceEdges ).newEdge + sl;\r\n\r\n\t\t\t// create 4 faces.\r\n\r\n\t\t\tnewFace( newFaces, edge1, edge2, edge3 );\r\n\t\t\tnewFace( newFaces, face.a, edge1, edge3 );\r\n\t\t\tnewFace( newFaces, face.b, edge2, edge1 );\r\n\t\t\tnewFace( newFaces, face.c, edge3, edge2 );\r\n\r\n\t\t}\r\n\r\n\t\t// Overwrite old arrays\r\n\t\tgeometry.vertices = newVertices;\r\n\t\tgeometry.faces = newFaces;\r\n\r\n\t\t// console.log('done');\r\n\r\n\t};\r\n\r\n\r\n})();"
},
"$:/plugins/rboue/Three.js/Lib/BlendCharacter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/BlendCharacter.js",
"module-type": "library",
"text": "/**\n * @author Michael Guerrero / http://realitymeltdown.com\n */\n\nTHREE.BlendCharacter = function () {\n\n\tthis.animations = {};\n\tthis.weightSchedule = [];\n\tthis.warpSchedule = [];\n\n\tthis.load = function ( url, onLoad ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.JSONLoader();\n\t\tloader.load( url, function( geometry, materials ) {\n\n\t\t\tvar originalMaterial = materials[ 0 ];\n\t\t\toriginalMaterial.skinning = true;\n\n\t\t\tTHREE.SkinnedMesh.call( scope, geometry, originalMaterial );\n\n\t\t\t// Create the animations\n\n\t\t\tfor ( var i = 0; i < geometry.animations.length; ++i ) {\n\n\t\t\t\tvar animName = geometry.animations[ i ].name;\n\t\t\t\tscope.animations[ animName ] = new THREE.Animation( scope, geometry.animations[ i ] );\n\n\t\t\t}\n\n\t\t\t// Create the debug visualization\n\n\t\t\tscope.skeletonHelper = new THREE.SkeletonHelper( scope );\n\t\t\tscope.skeletonHelper.material.linewidth = 3;\n\t\t\tscope.add( scope.skeletonHelper );\n\n\t\t\tscope.showSkeleton( false );\n\n\t\t\t// Loading is complete, fire the callback\n\t\t\tif ( onLoad !== undefined ) onLoad();\n\n\t\t} );\n\n\t};\n\n\tthis.update = function( dt ) {\n\n\t\tfor ( var i = this.weightSchedule.length - 1; i >= 0; --i ) {\n\n\t\t\tvar data = this.weightSchedule[ i ];\n\t\t\tdata.timeElapsed += dt;\n\n\t\t\t// If the transition is complete, remove it from the schedule\n\n\t\t\tif ( data.timeElapsed > data.duration ) {\n\n\t\t\t\tdata.anim.weight = data.endWeight;\n\t\t\t\tthis.weightSchedule.splice( i, 1 );\n\n\t\t\t\t// If we've faded out completely, stop the animation\n\n\t\t\t\tif ( data.anim.weight == 0 ) {\n\n\t\t\t\t\tdata.anim.stop( 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// interpolate the weight for the current time\n\n\t\t\t\tdata.anim.weight = data.startWeight + (data.endWeight - data.startWeight) * data.timeElapsed / data.duration;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.updateWarps( dt );\n\t\tthis.skeletonHelper.update();\n\n\t};\n\n\tthis.updateWarps = function( dt ) {\n\n\t\t// Warping modifies the time scale over time to make 2 animations of different\n\t\t// lengths match. This is useful for smoothing out transitions that get out of\n\t\t// phase such as between a walk and run cycle\n\n\t\tfor ( var i = this.warpSchedule.length - 1; i >= 0; --i ) {\n\n\t\t\tvar data = this.warpSchedule[ i ];\n\t\t\tdata.timeElapsed += dt;\n\n\t\t\tif ( data.timeElapsed > data.duration ) {\n\n\t\t\t\tdata.to.weight = 1;\n\t\t\t\tdata.to.timeScale = 1;\n\t\t\t\tdata.from.weight = 0;\n\t\t\t\tdata.from.timeScale = 1;\n\t\t\t\tdata.from.stop( 0 );\n\n\t\t\t\tthis.warpSchedule.splice( i, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tvar alpha = data.timeElapsed / data.duration;\n\n\t\t\t\tvar fromLength = data.from.data.length;\n\t\t\t\tvar toLength = data.to.data.length;\n\n\t\t\t\tvar fromToRatio = fromLength / toLength;\n\t\t\t\tvar toFromRatio = toLength / fromLength;\n\n\t\t\t\t// scale from each time proportionally to the other animation\n\n\t\t\t\tdata.from.timeScale = ( 1 - alpha ) + fromToRatio * alpha;\n\t\t\t\tdata.to.timeScale = alpha + toFromRatio * ( 1 - alpha );\n\n\t\t\t\tdata.from.weight = 1 - alpha;\n\t\t\t\tdata.to.weight = alpha;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tthis.play = function(animName, weight) {\n\n\t\tthis.animations[ animName ].play( 0, weight );\n\n\t};\n\n\tthis.crossfade = function( fromAnimName, toAnimName, duration ) {\n\n\t\tvar fromAnim = this.animations[ fromAnimName ];\n\t\tvar toAnim = this.animations[ toAnimName ];\n\n\t\tfromAnim.play( 0, 1 );\n\t\ttoAnim.play( 0, 0 );\n\n\t\tthis.weightSchedule.push( {\n\n\t\t\tanim: fromAnim,\n\t\t\tstartWeight: 1,\n\t\t\tendWeight: 0,\n\t\t\ttimeElapsed: 0,\n\t\t\tduration: duration\n\n\t\t} );\n\n\t\tthis.weightSchedule.push( {\n\n\t\t\tanim: toAnim,\n\t\t\tstartWeight: 0,\n\t\t\tendWeight: 1,\n\t\t\ttimeElapsed: 0,\n\t\t\tduration: duration\n\n\t\t} );\n\n\t};\n\n\tthis.warp = function( fromAnimName, toAnimName, duration ) {\n\n\t\tvar fromAnim = this.animations[ fromAnimName ];\n\t\tvar toAnim = this.animations[ toAnimName ];\n\n\t\tfromAnim.play( 0, 1 );\n\t\ttoAnim.play( 0, 0 );\n\n\t\tthis.warpSchedule.push( {\n\n\t\t\tfrom: fromAnim,\n\t\t\tto: toAnim,\n\t\t\ttimeElapsed: 0,\n\t\t\tduration: duration\n\n\t\t} );\n\n\t};\n\n\tthis.applyWeight = function(animName, weight) {\n\n\t\tthis.animations[ animName ].weight = weight;\n\n\t};\n\n\tthis.pauseAll = function() {\n\n\t\tfor ( var a in this.animations ) {\n\n\t\t\tif ( this.animations[ a ].isPlaying ) {\n\n\t\t\t\tthis.animations[ a ].stop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.unPauseAll = function() {\n\n\tfor ( var a in this.animations ) {\n\n\t if ( this.animations[ a ].isPlaying && this.animations[ a ].isPaused ) {\n\n\t\tthis.animations[ a ].pause();\n\n\t }\n\n\t}\n\n };\n\n\n\tthis.stopAll = function() {\n\n\t\tfor ( a in this.animations ) {\n\n\t\t\tif ( this.animations[ a ].isPlaying ) {\n\t\t\t\tthis.animations[ a ].stop(0);\n\t\t\t}\n\n\t\t\tthis.animations[ a ].weight = 0;\n\n\t\t}\n\n\t\tthis.weightSchedule.length = 0;\n\t\tthis.warpSchedule.length = 0;\n\n\t}\n\n\tthis.showSkeleton = function( boolean ) {\n\n\t\tthis.skeletonHelper.visible = boolean;\n\n\t}\n\n\tthis.showModel = function( boolean ) {\n\n\t\tthis.visible = boolean;\n\n\t}\n\n};\n\n\nTHREE.BlendCharacter.prototype = Object.create( THREE.SkinnedMesh.prototype );\n\nTHREE.BlendCharacter.prototype.getForward = function() {\n\n\tvar forward = new THREE.Vector3();\n\n\treturn function() {\n\n\t\t// pull the character's forward basis vector out of the matrix\n\t\tforward.set(\n\t\t\t-this.matrix.elements[ 8 ],\n\t\t\t-this.matrix.elements[ 9 ],\n\t\t\t-this.matrix.elements[ 10 ]\n\t\t);\n\n\t\treturn forward;\n\t}\n}\n\n"
},
"$:/plugins/rboue/Three.js/Lib/SkyShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/SkyShader.js",
"module-type": "library",
"text": "/**\n * @author zz85 / https://github.com/zz85\n * \n * Based on \"A Practical Analytic Model for Daylight\" \n * aka The Preetham Model, the de facto standard analytic skydome model\n * http://www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf\n * \n * First implemented by Simon Wallner\n * http://www.simonwallner.at/projects/atmospheric-scattering\n * \n * Improved by Martin Upitis\n * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n * \n * Three.js integration by zz85 http://twitter.com/blurspline\n*/\n\nTHREE.ShaderLib['sky'] = {\n\n\tuniforms: {\n\n\t\tluminance:\t { type: \"f\", value:1 },\n\t\tturbidity:\t { type: \"f\", value:2 },\n\t\treileigh:\t { type: \"f\", value:1 },\n\t\tmieCoefficient:\t { type: \"f\", value:0.005 },\n\t\tmieDirectionalG: { type: \"f\", value:0.8 },\n\t\tsunPosition: \t { type: \"v3\", value: new THREE.Vector3() }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec3 vWorldPosition;\",\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\t\t\t\"vWorldPosition = worldPosition.xyz;\",\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\",\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\n\t\t\"uniform sampler2D skySampler;\",\n\t\t\"uniform vec3 sunPosition;\",\n\t\t\"varying vec3 vWorldPosition;\",\n\t\t\"varying vec2 vUv;\",\n\n\n\t\t\"vec3 cameraPos = vec3(0., 0., 0.);\",\n\t\t\"// uniform sampler2D sDiffuse;\",\n\t\t\"// const float turbidity = 10.0; //\",\n\t\t\"// const float reileigh = 2.; //\",\n\t\t\"// const float luminance = 1.0; //\",\n\t\t\"// const float mieCoefficient = 0.005;\",\n\t\t\"// const float mieDirectionalG = 0.8;\",\n\n\t\t\"uniform float luminance;\",\n\t\t\"uniform float turbidity;\",\n\t\t\"uniform float reileigh;\",\n\t\t\"uniform float mieCoefficient;\",\n\t\t\"uniform float mieDirectionalG;\",\n\n\n\t\t\"vec3 sunDirection = normalize(sunPosition);\",\n\t\t\"float reileighCoefficient = reileigh;\",\n\n\t\t\"// constants for atmospheric scattering\",\n\t\t\"const float e = 2.71828182845904523536028747135266249775724709369995957;\",\n\t\t\"const float pi = 3.141592653589793238462643383279502884197169;\",\n\n\t\t\"const float n = 1.0003; // refractive index of air\",\n\t\t\"const float N = 2.545E25; // number of molecules per unit volume for air at\",\n\t\t\t\t\t\t\t\t\"// 288.15K and 1013mb (sea level -45 celsius)\",\n\t\t\"const float pn = 0.035;\t// depolatization factor for standard air\",\n\n\t\t\"// wavelength of used primaries, according to preetham\",\n\t\t\"const vec3 lambda = vec3(680E-9, 550E-9, 450E-9);\",\n\n\t\t\"// mie stuff\",\n\t\t\"// K coefficient for the primaries\",\n\t\t\"const vec3 K = vec3(0.686, 0.678, 0.666);\",\n\t\t\"const float v = 4.0;\",\n\n\t\t\"// optical length at zenith for molecules\",\n\t\t\"const float rayleighZenithLength = 8.4E3;\",\n\t\t\"const float mieZenithLength = 1.25E3;\",\n\t\t\"const vec3 up = vec3(0.0, 1.0, 0.0);\",\n\n\t\t\"const float EE = 1000.0;\",\n\t\t\"const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\",\n\t\t\"// 66 arc seconds -> degrees, and the cosine of that\",\n\n\t\t\"// earth shadow hack\",\n\t\t\"const float cutoffAngle = pi/1.95;\",\n\t\t\"const float steepness = 1.5;\",\n\n\n\t\t\"vec3 totalRayleigh(vec3 lambda)\",\n\t\t\"{\",\n\t\t\t\"return (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn));\",\n\t\t\"}\",\n\n\t\t\"float rayleighPhase(float cosTheta)\",\n\t\t\"{\t \",\n\t\t\t\"return (3.0 / (16.0*pi)) * (1.0 + pow(cosTheta, 2.0));\",\n\t\t\"//\treturn (1.0 / (3.0*pi)) * (1.0 + pow(cosTheta, 2.0));\",\n\t\t\"//\treturn (3.0 / 4.0) * (1.0 + pow(cosTheta, 2.0));\",\n\t\t\"}\",\n\n\t\t\"vec3 totalMie(vec3 lambda, vec3 K, float T)\",\n\t\t\"{\",\n\t\t\t\"float c = (0.2 * T ) * 10E-18;\",\n\t\t\t\"return 0.434 * c * pi * pow((2.0 * pi) / lambda, vec3(v - 2.0)) * K;\",\n\t\t\"}\",\n\n\t\t\"float hgPhase(float cosTheta, float g)\",\n\t\t\"{\",\n\t\t\t\"return (1.0 / (4.0*pi)) * ((1.0 - pow(g, 2.0)) / pow(1.0 - 2.0*g*cosTheta + pow(g, 2.0), 1.5));\",\n\t\t\"}\",\n\n\t\t\"float sunIntensity(float zenithAngleCos)\",\n\t\t\"{\",\n\t\t\t\"return EE * max(0.0, 1.0 - exp(-((cutoffAngle - acos(zenithAngleCos))/steepness)));\",\n\t\t\"}\",\n\n\t\t\"// float logLuminance(vec3 c)\",\n\t\t\"// {\",\n\t\t\"// \treturn log(c.r * 0.2126 + c.g * 0.7152 + c.b * 0.0722);\",\n\t\t\"// }\",\n\n\t\t\"// Filmic ToneMapping http://filmicgames.com/archives/75\",\n\t\t\"float A = 0.15;\",\n\t\t\"float B = 0.50;\",\n\t\t\"float C = 0.10;\",\n\t\t\"float D = 0.20;\",\n\t\t\"float E = 0.02;\",\n\t\t\"float F = 0.30;\",\n\t\t\"float W = 1000.0;\",\n\n\t\t\"vec3 Uncharted2Tonemap(vec3 x)\",\n\t\t\"{\",\n\t\t \"return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;\",\n\t\t\"}\",\n\n\n\t\t\"void main() \",\n\t\t\"{\",\n\t\t\t\"float sunfade = 1.0-clamp(1.0-exp((sunPosition.y/450000.0)),0.0,1.0);\",\n\n\t\t\t\"// luminance = 1.0 ;// vWorldPosition.y / 450000. + 0.5; //sunPosition.y / 450000. * 1. + 0.5;\",\n\n\t\t\t \"// gl_FragColor = vec4(sunfade, sunfade, sunfade, 1.0);\",\n\t\t\t\n\t\t\t\"reileighCoefficient = reileighCoefficient - (1.0* (1.0-sunfade));\",\n\t\t\t\n\t\t\t\"float sunE = sunIntensity(dot(sunDirection, up));\",\n\n\t\t\t\"// extinction (absorbtion + out scattering) \",\n\t\t\t\"// rayleigh coefficients\",\n\t\t\t\"vec3 betaR = totalRayleigh(lambda) * reileighCoefficient;\",\n\n\t\t\t\"// mie coefficients\",\n\t\t\t\"vec3 betaM = totalMie(lambda, K, turbidity) * mieCoefficient;\",\n\n\t\t\t\"// optical length\",\n\t\t\t\"// cutoff angle at 90 to avoid singularity in next formula.\",\n\t\t\t\"float zenithAngle = acos(max(0.0, dot(up, normalize(vWorldPosition - cameraPos))));\",\n\t\t\t\"float sR = rayleighZenithLength / (cos(zenithAngle) + 0.15 * pow(93.885 - ((zenithAngle * 180.0) / pi), -1.253));\",\n\t\t\t\"float sM = mieZenithLength / (cos(zenithAngle) + 0.15 * pow(93.885 - ((zenithAngle * 180.0) / pi), -1.253));\",\n\n\n\n\t\t\t\"// combined extinction factor\t\",\n\t\t\t\"vec3 Fex = exp(-(betaR * sR + betaM * sM));\",\n\n\t\t\t\"// in scattering\",\n\t\t\t\"float cosTheta = dot(normalize(vWorldPosition - cameraPos), sunDirection);\",\n\n\t\t\t\"float rPhase = rayleighPhase(cosTheta*0.5+0.5);\",\n\t\t\t\"vec3 betaRTheta = betaR * rPhase;\",\n\n\t\t\t\"float mPhase = hgPhase(cosTheta, mieDirectionalG);\",\n\t\t\t\"vec3 betaMTheta = betaM * mPhase;\",\n\n\n\t\t\t\"vec3 Lin = pow(sunE * ((betaRTheta + betaMTheta) / (betaR + betaM)) * (1.0 - Fex),vec3(1.5));\",\n\t\t\t\"Lin *= mix(vec3(1.0),pow(sunE * ((betaRTheta + betaMTheta) / (betaR + betaM)) * Fex,vec3(1.0/2.0)),clamp(pow(1.0-dot(up, sunDirection),5.0),0.0,1.0));\",\n\n\t\t\t\"//nightsky\",\n\t\t\t\"vec3 direction = normalize(vWorldPosition - cameraPos);\",\n\t\t\t\"float theta = acos(direction.y); // elevation --> y-axis, [-pi/2, pi/2]\",\n\t\t\t\"float phi = atan(direction.z, direction.x); // azimuth --> x-axis [-pi/2, pi/2]\",\n\t\t\t\"vec2 uv = vec2(phi, theta) / vec2(2.0*pi, pi) + vec2(0.5, 0.0);\",\n\t\t\t\"// vec3 L0 = texture2D(skySampler, uv).rgb+0.1 * Fex;\",\n\t\t\t\"vec3 L0 = vec3(0.1) * Fex;\",\n\t\t\t\n\t\t\t\"// composition + solar disc\",\n\t\t\t\"//if (cosTheta > sunAngularDiameterCos)\",\n\t\t\t\"float sundisk = smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);\",\n\t\t\t\"// if (normalize(vWorldPosition - cameraPos).y>0.0)\",\n\t\t\t\"L0 += (sunE * 19000.0 * Fex)*sundisk;\",\n\n\n\t\t\t\"vec3 whiteScale = 1.0/Uncharted2Tonemap(vec3(W));\",\n\t\t\t\n\t\t\t\"vec3 texColor = (Lin+L0); \",\n\t\t\t\"texColor *= 0.04 ;\",\n\t\t\t\"texColor += vec3(0.0,0.001,0.0025)*0.3;\",\n\t\t\t\n\t\t\t\"float g_fMaxLuminance = 1.0;\",\n\t\t\t\"float fLumScaled = 0.1 / luminance; \",\n\t\t\t\"float fLumCompressed = (fLumScaled * (1.0 + (fLumScaled / (g_fMaxLuminance * g_fMaxLuminance)))) / (1.0 + fLumScaled); \",\n\n\t\t\t\"float ExposureBias = fLumCompressed;\",\n\t\t \n\t\t\t\"vec3 curr = Uncharted2Tonemap((log2(2.0/pow(luminance,4.0)))*texColor);\",\n\t\t\t\"vec3 color = curr*whiteScale;\",\n\n\t\t\t\"vec3 retColor = pow(color,vec3(1.0/(1.2+(1.2*sunfade))));\",\n\n\t\t\t\n\t\t\t\"gl_FragColor.rgb = retColor;\",\n\t\t\t\t\n\t\t\t\"gl_FragColor.a = 1.0;\",\n\t\t\"}\",\n\n\t].join(\"\\n\")\n\n};\n\nTHREE.Sky = function () {\n\n\tvar skyShader = THREE.ShaderLib[ \"sky\" ];\n\tvar skyUniforms = THREE.UniformsUtils.clone( skyShader.uniforms );\n\n\tvar skyMat = new THREE.ShaderMaterial( { \n\t\tfragmentShader: skyShader.fragmentShader, \n\t\tvertexShader: skyShader.vertexShader, \n\t\tuniforms: skyUniforms,\n\t\tside: THREE.BackSide\n\t} );\n\n\tvar skyGeo = new THREE.SphereGeometry( 450000, 32, 15 );\n\tvar skyMesh = new THREE.Mesh( skyGeo, skyMat );\n\n\n\t// Expose variables\n\tthis.mesh = skyMesh;\n\tthis.uniforms = skyUniforms;\n\n\n};\n\n"
},
"$:/plugins/rboue/Three.js/Lib/SimulationRenderer.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/SimulationRenderer.js",
"module-type": "library",
"text": "/**\n * @author zz85 https://github.com/zz85 / http://www.lab4games.net/zz85/blog\n *\n * Bird Simulation Render\n *\n * \tA simple scene rendering a quad of the following shaders\n *\t1. Pass-thru Shader,\n *\t2. Bird Position Update Shader,\n *\t3. Bird Velocity Update Shader\n *\n */\n\nfunction SimulationRenderer(WIDTH, renderer) {\n\n\tWIDTH = WIDTH || 4;\n\tvar camera = new THREE.Camera();\n\tcamera.position.z = 1;\n\n\t// Init RTT stuff\n\tgl = renderer.getContext();\n\n\tif( !gl.getExtension( \"OES_texture_float\" )) {\n\t\talert( \"No OES_texture_float support for float textures!\" );\n\t\treturn;\n\t}\n\n\tif( gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS) == 0) {\n\t\talert( \"No support for vertex shader textures!\" );\n\t\treturn;\n\t}\n\n\tvar scene = new THREE.Scene();\n\n\tvar uniforms = {\n\t\ttime: { type: \"f\", value: 1.0 },\n\t\tresolution: { type: \"v2\", value: new THREE.Vector2( WIDTH, WIDTH ) },\n\t\ttexture: { type: \"t\", value: null }\n\t};\n\n\tvar passThruShader = new THREE.ShaderMaterial( {\n\t\tuniforms: uniforms,\n\t\tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n\t\tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n\t} );\n\n\tvar mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), passThruShader );\n\n\tvar positionShader = new THREE.ShaderMaterial( {\n\n\t\tuniforms: {\n\t\t\ttime: { type: \"f\", value: 1.0 },\n\t\t\tdelta: { type: \"f\", value: 0.0 },\n\t\t\tresolution: { type: \"v2\", value: new THREE.Vector2( WIDTH, WIDTH ) },\n\t\t\ttexturePosition: { type: \"t\", value: null },\n\t\t\ttextureVelocity: { type: \"t\", value: null },\n\t\t},\n\t\tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n\t\tfragmentShader: document.getElementById( 'fragmentShaderPosition' ).textContent\n\n\t} );\n\n\tthis.positionShader = positionShader;\n\n\tvar velocityShader = new THREE.ShaderMaterial( {\n\n\t\tuniforms: {\n\t\t\ttime: { type: \"f\", value: 1.0 },\n\t\t\tdelta: { type: \"f\", value: 0.0 },\n\t\t\tresolution: { type: \"v2\", value: new THREE.Vector2( WIDTH, WIDTH ) },\n\t\t\ttexturePosition: { type: \"t\", value: null },\n\t\t\ttextureVelocity: { type: \"t\", value: null },\n\t\t\ttesting: { type: \"f\", value: 1.0 },\n\t\t\tseperationDistance: { type: \"f\", value: 1.0 },\n\t\t\talignmentDistance: { type: \"f\", value: 1.0 },\n\t\t\tcohesionDistance: { type: \"f\", value: 1.0 },\n\t\t\tfreedomFactor: { type: \"f\", value: 1.0 },\n\t\t\tpredator: { type: \"v3\", value: new THREE.Vector3() }\n\t\t},\n\t\tdefines: {\n\t\t\tWIDTH: WIDTH.toFixed(2)\n\t\t},\n\t\tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n\t\tfragmentShader: document.getElementById( 'fragmentShaderVelocity' ).textContent\n\n\t} );\n\n\tthis.velocityUniforms = velocityShader.uniforms;\n\n\tscene.add( mesh );\n\n\tvar flipflop = true;\n\tvar rtPosition1, rtPosition2, rtVelocity1, rtVelocity2;\n\n\tfunction init() {\n\t\tvar dtPosition = generatePositionTexture();\n\t\tvar dtVelocity = generateVelocityTexture();\n\n\t\trtPosition1 = getRenderTarget( THREE.RGBAFormat );\n\t\trtPosition2 = rtPosition1.clone();\n\t\trtVelocity1 = getRenderTarget( THREE.RGBFormat );\n\t\trtVelocity2 = rtVelocity1.clone();\n\n\t\tsimulator.renderTexture(dtPosition, rtPosition1);\n\t\tsimulator.renderTexture(rtPosition1, rtPosition2);\n\n\t\tsimulator.renderTexture(dtVelocity, rtVelocity1);\n\t\tsimulator.renderTexture(rtVelocity1, rtVelocity2);\n\n\t\tsimulator.velocityUniforms.testing.value = 10;\n\t}\n\n\tthis.init = init;\n\n\tfunction getRenderTarget( type ) {\n\t\tvar renderTarget = new THREE.WebGLRenderTarget(WIDTH, WIDTH, {\n\t\t\twrapS: THREE.RepeatWrapping,\n\t\t\twrapT: THREE.RepeatWrapping,\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: type,\n\t\t\ttype: THREE.FloatType,\n\t\t\tstencilBuffer: false\n\t\t});\n\n\t\treturn renderTarget;\n\t}\n\n\t// Takes a texture, and render out as another texture\n\tthis.renderTexture = function ( input, output ) {\n\t\tmesh.material = passThruShader;\n\t\tuniforms.texture.value = input;\n\t\trenderer.render( scene, camera, output );\n\t}\n\n\n\tthis.renderPosition = function(position, velocity, output, delta) {\n\t\tmesh.material = positionShader;\n\t\tpositionShader.uniforms.texturePosition.value = position;\n\t\tpositionShader.uniforms.textureVelocity.value = velocity;\n\t\tpositionShader.uniforms.time.value = performance.now();\n\t\tpositionShader.uniforms.delta.value = delta;\n\t\trenderer.render( scene, camera, output );\n\t\tthis.currentPosition = output;\n\t}\n\n\tthis.renderVelocity = function(position, velocity, output, delta) {\n\t\tmesh.material = velocityShader;\n\t\tvelocityShader.uniforms.texturePosition.value = position;\n\t\tvelocityShader.uniforms.textureVelocity.value = velocity;\n\t\tvelocityShader.uniforms.time.value = performance.now();\n\t\tvelocityShader.uniforms.delta.value = delta;\n\t\trenderer.render( scene, camera, output );\n\t\tthis.currentVelocity = output;\n\t}\n\n\tthis.simulate = function( delta ) {\n\n\t\tif (flipflop) {\n\n\t\t\tsimulator.renderVelocity( rtPosition1, rtVelocity1, rtVelocity2, delta );\n\t\t\tsimulator.renderPosition( rtPosition1, rtVelocity2, rtPosition2, delta );\n\n\t\t} else {\n\n\t\t\tsimulator.renderVelocity( rtPosition2, rtVelocity2, rtVelocity1, delta );\n\t\t\tsimulator.renderPosition( rtPosition2, rtVelocity1, rtPosition1, delta );\n\n\t\t}\n\n\t\tflipflop = !flipflop;\n\n\t}\n\n\tfunction generatePositionTexture() {\n\n\t\tvar a = new Float32Array( PARTICLES * 4 );\n\n\t\tfor ( var k = 0, kl = a.length; k < kl; k += 4 ) {\n\n\t\t\tvar x = Math.random() * BOUNDS - BOUNDS_HALF;\n\t\t\tvar y = Math.random() * BOUNDS - BOUNDS_HALF;\n\t\t\tvar z = Math.random() * BOUNDS - BOUNDS_HALF;\n\n\t\t\ta[ k + 0 ] = x;\n\t\t\ta[ k + 1 ] = y;\n\t\t\ta[ k + 2 ] = z;\n\t\t\ta[ k + 3 ] = 1;\n\n\t\t}\n\n\t\tvar texture = new THREE.DataTexture( a, WIDTH, WIDTH, THREE.RGBAFormat, THREE.FloatType );\n\t\ttexture.minFilter = THREE.NearestFilter;\n\t\ttexture.magFilter = THREE.NearestFilter;\n\t\ttexture.needsUpdate = true;\n\t\ttexture.flipY = false;\n\n\t\treturn texture;\n\n\t}\n\n\tfunction generateVelocityTexture() {\n\n\t\tvar a = new Float32Array( PARTICLES * 3 );\n\n\t\tfor ( var k = 0, kl = a.length; k < kl; k += 3 ) {\n\n\t\t\tvar x = Math.random() - 0.5;\n\t\t\tvar y = Math.random() - 0.5;\n\t\t\tvar z = Math.random() - 0.5;\n\n\t\t\ta[ k + 0 ] = x * 10;\n\t\t\ta[ k + 1 ] = y * 10;\n\t\t\ta[ k + 2 ] = z * 10;\n\n\t\t}\n\n\t\tvar texture = new THREE.DataTexture( a, WIDTH, WIDTH, THREE.RGBFormat, THREE.FloatType );\n\t\ttexture.minFilter = THREE.NearestFilter;\n\t\ttexture.magFilter = THREE.NearestFilter;\n\t\ttexture.needsUpdate = true;\n\t\ttexture.flipY = false;\n\n\t\treturn texture;\n\n\t}\n\n}"
},
"$:/plugins/rboue/Three.js/Lib/ImprovedNoise.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ImprovedNoise.js",
"module-type": "library",
"text": "// http://mrl.nyu.edu/~perlin/noise/\n\nvar ImprovedNoise = function () {\n\n\tvar p = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,\n\t\t 23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,\n\t\t 174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,\n\t\t 133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,\n\t\t 89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,\n\t\t 202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,\n\t\t 248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,\n\t\t 178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,\n\t\t 14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,\n\t\t 93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180];\n\n\tfor (var i=0; i < 256 ; i++) {\n\n\t\tp[256+i] = p[i];\n\n\t}\n\n\tfunction fade(t) {\n\n\t\treturn t * t * t * (t * (t * 6 - 15) + 10);\n\n\t}\n\n\tfunction lerp(t, a, b) {\n\n\t\treturn a + t * (b - a);\n\n\t}\n\n\tfunction grad(hash, x, y, z) {\n\n\t\tvar h = hash & 15;\n\t\tvar u = h < 8 ? x : y, v = h < 4 ? y : h == 12 || h == 14 ? x : z;\n\t\treturn ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);\n\n\t}\n\n\treturn {\n\n\t\tnoise: function (x, y, z) {\n\n\t\t\tvar floorX = ~~x, floorY = ~~y, floorZ = ~~z;\n\n\t\t\tvar X = floorX & 255, Y = floorY & 255, Z = floorZ & 255;\n\n\t\t\tx -= floorX;\n\t\t\ty -= floorY;\n\t\t\tz -= floorZ;\n\n\t\t\tvar xMinus1 = x -1, yMinus1 = y - 1, zMinus1 = z - 1;\n\n\t\t\tvar u = fade(x), v = fade(y), w = fade(z);\n\n\t\t\tvar A = p[X]+Y, AA = p[A]+Z, AB = p[A+1]+Z, B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z;\n\n\t\t\treturn lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z), \n\t\t\t\t\t\t\tgrad(p[BA], xMinus1, y, z)),\n\t\t\t\t\t\tlerp(u, grad(p[AB], x, yMinus1, z),\n\t\t\t\t\t\t\tgrad(p[BB], xMinus1, yMinus1, z))),\n\t\t\t\t\tlerp(v, lerp(u, grad(p[AA+1], x, y, zMinus1),\n\t\t\t\t\t\t\tgrad(p[BA+1], xMinus1, y, z-1)),\n\t\t\t\t\t\tlerp(u, grad(p[AB+1], x, yMinus1, zMinus1),\n\t\t\t\t\t\t\tgrad(p[BB+1], xMinus1, yMinus1, zMinus1))));\n\n\t\t}\n\t}\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/ShaderTerrain.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ShaderTerrain.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n *\n */\n\nTHREE.ShaderTerrain = {\n\n\t/* -------------------------------------------------------------------------\n\t//\tDynamic terrain shader\n\t//\t\t- Blinn-Phong\n\t//\t\t- height + normal + diffuse1 + diffuse2 + specular + detail maps\n\t//\t\t- point, directional and hemisphere lights (use with \"lights: true\" material option)\n\t//\t\t- shadow maps receiving\n\t ------------------------------------------------------------------------- */\n\n\t'terrain' : {\n\n\t\tuniforms: THREE.UniformsUtils.merge( [\n\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\n\t\t\tTHREE.UniformsLib[ \"lights\" ],\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ],\n\n\t\t\t{\n\n\t\t\t\"enableDiffuse1\" : { type: \"i\", value: 0 },\n\t\t\t\"enableDiffuse2\" : { type: \"i\", value: 0 },\n\t\t\t\"enableSpecular\" : { type: \"i\", value: 0 },\n\t\t\t\"enableReflection\": { type: \"i\", value: 0 },\n\n\t\t\t\"tDiffuse1\"\t : { type: \"t\", value: null },\n\t\t\t\"tDiffuse2\"\t : { type: \"t\", value: null },\n\t\t\t\"tDetail\"\t : { type: \"t\", value: null },\n\t\t\t\"tNormal\"\t : { type: \"t\", value: null },\n\t\t\t\"tSpecular\"\t : { type: \"t\", value: null },\n\t\t\t\"tDisplacement\": { type: \"t\", value: null },\n\n\t\t\t\"uNormalScale\": { type: \"f\", value: 1.0 },\n\n\t\t\t\"uDisplacementBias\": { type: \"f\", value: 0.0 },\n\t\t\t\"uDisplacementScale\": { type: \"f\", value: 1.0 },\n\n\t\t\t\"diffuse\": { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\n\t\t\t\"specular\": { type: \"c\", value: new THREE.Color( 0x111111 ) },\n\t\t\t\"ambient\": { type: \"c\", value: new THREE.Color( 0x050505 ) },\n\t\t\t\"shininess\": { type: \"f\", value: 30 },\n\t\t\t\"opacity\": { type: \"f\", value: 1 },\n\n\t\t\t\"uRepeatBase\" : { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\t\t\t\"uRepeatOverlay\" : { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\n\n\t\t\t\"uOffset\" : { type: \"v2\", value: new THREE.Vector2( 0, 0 ) }\n\n\t\t\t}\n\n\t\t] ),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform vec3 ambient;\",\n\t\t\t\"uniform vec3 diffuse;\",\n\t\t\t\"uniform vec3 specular;\",\n\t\t\t\"uniform float shininess;\",\n\t\t\t\"uniform float opacity;\",\n\n\t\t\t\"uniform bool enableDiffuse1;\",\n\t\t\t\"uniform bool enableDiffuse2;\",\n\t\t\t\"uniform bool enableSpecular;\",\n\n\t\t\t\"uniform sampler2D tDiffuse1;\",\n\t\t\t\"uniform sampler2D tDiffuse2;\",\n\t\t\t\"uniform sampler2D tDetail;\",\n\t\t\t\"uniform sampler2D tNormal;\",\n\t\t\t\"uniform sampler2D tSpecular;\",\n\t\t\t\"uniform sampler2D tDisplacement;\",\n\n\t\t\t\"uniform float uNormalScale;\",\n\n\t\t\t\"uniform vec2 uRepeatOverlay;\",\n\t\t\t\"uniform vec2 uRepeatBase;\",\n\n\t\t\t\"uniform vec2 uOffset;\",\n\n\t\t\t\"varying vec3 vTangent;\",\n\t\t\t\"varying vec3 vBinormal;\",\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"uniform vec3 ambientLightColor;\",\n\n\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\n\t\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"gl_FragColor = vec4( vec3( 1.0 ), opacity );\",\n\n\t\t\t\t\"vec3 specularTex = vec3( 1.0 );\",\n\n\t\t\t\t\"vec2 uvOverlay = uRepeatOverlay * vUv + uOffset;\",\n\t\t\t\t\"vec2 uvBase = uRepeatBase * vUv;\",\n\n\t\t\t\t\"vec3 normalTex = texture2D( tDetail, uvOverlay ).xyz * 2.0 - 1.0;\",\n\t\t\t\t\"normalTex.xy *= uNormalScale;\",\n\t\t\t\t\"normalTex = normalize( normalTex );\",\n\n\t\t\t\t\"if( enableDiffuse1 && enableDiffuse2 ) {\",\n\n\t\t\t\t\t\"vec4 colDiffuse1 = texture2D( tDiffuse1, uvOverlay );\",\n\t\t\t\t\t\"vec4 colDiffuse2 = texture2D( tDiffuse2, uvOverlay );\",\n\n\t\t\t\t\t\"#ifdef GAMMA_INPUT\",\n\n\t\t\t\t\t\t\"colDiffuse1.xyz *= colDiffuse1.xyz;\",\n\t\t\t\t\t\t\"colDiffuse2.xyz *= colDiffuse2.xyz;\",\n\n\t\t\t\t\t\"#endif\",\n\n\t\t\t\t\t\"gl_FragColor = gl_FragColor * mix ( colDiffuse1, colDiffuse2, 1.0 - texture2D( tDisplacement, uvBase ) );\",\n\n\t\t\t\t\" } else if( enableDiffuse1 ) {\",\n\n\t\t\t\t\t\"gl_FragColor = gl_FragColor * texture2D( tDiffuse1, uvOverlay );\",\n\n\t\t\t\t\"} else if( enableDiffuse2 ) {\",\n\n\t\t\t\t\t\"gl_FragColor = gl_FragColor * texture2D( tDiffuse2, uvOverlay );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"if( enableSpecular )\",\n\t\t\t\t\t\"specularTex = texture2D( tSpecular, uvOverlay ).xyz;\",\n\n\t\t\t\t\"mat3 tsb = mat3( vTangent, vBinormal, vNormal );\",\n\t\t\t\t\"vec3 finalNormal = tsb * normalTex;\",\n\n\t\t\t\t\"vec3 normal = normalize( finalNormal );\",\n\t\t\t\t\"vec3 viewPosition = normalize( vViewPosition );\",\n\n\t\t\t\t// point lights\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec3 pointDiffuse = vec3( 0.0 );\",\n\t\t\t\t\t\"vec3 pointSpecular = vec3( 0.0 );\",\n\n\t\t\t\t\t\"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\n\t\t\t\t\t\t\"vec3 lVector = lPosition.xyz + vViewPosition.xyz;\",\n\n\t\t\t\t\t\t\"float lDistance = 1.0;\",\n\t\t\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\n\t\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\n\n\t\t\t\t\t\t\"lVector = normalize( lVector );\",\n\n\t\t\t\t\t\t\"vec3 pointHalfVector = normalize( lVector + viewPosition );\",\n\t\t\t\t\t\t\"float pointDistance = lDistance;\",\n\n\t\t\t\t\t\t\"float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\",\n\t\t\t\t\t\t\"float pointDiffuseWeight = max( dot( normal, lVector ), 0.0 );\",\n\n\t\t\t\t\t\t\"float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, shininess ), 0.0 );\",\n\n\t\t\t\t\t\t\"pointDiffuse += pointDistance * pointLightColor[ i ] * diffuse * pointDiffuseWeight;\",\n\t\t\t\t\t\t\"pointSpecular += pointDistance * pointLightColor[ i ] * specular * pointSpecularWeight * pointDiffuseWeight;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// directional lights\n\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec3 dirDiffuse = vec3( 0.0 );\",\n\t\t\t\t\t\"vec3 dirSpecular = vec3( 0.0 );\",\n\n\t\t\t\t\t\"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\",\n\n\t\t\t\t\t\t\"vec3 dirVector = normalize( lDirection.xyz );\",\n\t\t\t\t\t\t\"vec3 dirHalfVector = normalize( dirVector + viewPosition );\",\n\n\t\t\t\t\t\t\"float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\",\n\t\t\t\t\t\t\"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\",\n\n\t\t\t\t\t\t\"float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, shininess ), 0.0 );\",\n\n\t\t\t\t\t\t\"dirDiffuse += directionalLightColor[ i ] * diffuse * dirDiffuseWeight;\",\n\t\t\t\t\t\t\"dirSpecular += directionalLightColor[ i ] * specular * dirSpecularWeight * dirDiffuseWeight;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// hemisphere lights\n\n\t\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\n\n\t\t\t\t\t\"vec3 hemiDiffuse = vec3( 0.0 );\",\n\t\t\t\t\t\"vec3 hemiSpecular = vec3( 0.0 );\" ,\n\n\t\t\t\t\t\"for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\",\n\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\",\n\t\t\t\t\t\t\"vec3 lVector = normalize( lDirection.xyz );\",\n\n\t\t\t\t\t\t// diffuse\n\n\t\t\t\t\t\t\"float dotProduct = dot( normal, lVector );\",\n\t\t\t\t\t\t\"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\",\n\n\t\t\t\t\t\t\"hemiDiffuse += diffuse * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\",\n\n\t\t\t\t\t\t// specular (sky light)\n\n\t\t\t\t\t\t\"float hemiSpecularWeight = 0.0;\",\n\n\t\t\t\t\t\t\"vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\",\n\t\t\t\t\t\t\"float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\",\n\t\t\t\t\t\t\"hemiSpecularWeight += specularTex.r * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\",\n\n\t\t\t\t\t\t// specular (ground light)\n\n\t\t\t\t\t\t\"vec3 lVectorGround = -lVector;\",\n\n\t\t\t\t\t\t\"vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\",\n\t\t\t\t\t\t\"float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\",\n\t\t\t\t\t\t\"hemiSpecularWeight += specularTex.r * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\",\n\n\t\t\t\t\t\t\"hemiSpecular += specular * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight ) * hemiSpecularWeight * hemiDiffuseWeight;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// all lights contribution summation\n\n\t\t\t\t\"vec3 totalDiffuse = vec3( 0.0 );\",\n\t\t\t\t\"vec3 totalSpecular = vec3( 0.0 );\",\n\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\n\n\t\t\t\t\t\"totalDiffuse += dirDiffuse;\",\n\t\t\t\t\t\"totalSpecular += dirSpecular;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\n\n\t\t\t\t\t\"totalDiffuse += hemiDiffuse;\",\n\t\t\t\t\t\"totalSpecular += hemiSpecular;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\n\n\t\t\t\t\t\"totalDiffuse += pointDiffuse;\",\n\t\t\t\t\t\"totalSpecular += pointSpecular;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t//\"gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient) + totalSpecular;\",\n\t\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient + totalSpecular );\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"linear_to_gamma_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader: [\n\n\t\t\t\"attribute vec4 tangent;\",\n\n\t\t\t\"uniform vec2 uRepeatBase;\",\n\n\t\t\t\"uniform sampler2D tNormal;\",\n\n\t\t\t\"#ifdef VERTEX_TEXTURES\",\n\n\t\t\t\t\"uniform sampler2D tDisplacement;\",\n\t\t\t\t\"uniform float uDisplacementScale;\",\n\t\t\t\t\"uniform float uDisplacementBias;\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 vTangent;\",\n\t\t\t\"varying vec3 vBinormal;\",\n\t\t\t\"varying vec3 vNormal;\",\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\n\n\t\t\t\t// tangent and binormal vectors\n\n\t\t\t\t\"vTangent = normalize( normalMatrix * tangent.xyz );\",\n\n\t\t\t\t\"vBinormal = cross( vNormal, vTangent ) * tangent.w;\",\n\t\t\t\t\"vBinormal = normalize( vBinormal );\",\n\n\t\t\t\t// texture coordinates\n\n\t\t\t\t\"vUv = uv;\",\n\n\t\t\t\t\"vec2 uvBase = uv * uRepeatBase;\",\n\n\t\t\t\t// displacement mapping\n\n\t\t\t\t\"#ifdef VERTEX_TEXTURES\",\n\n\t\t\t\t\t\"vec3 dv = texture2D( tDisplacement, uvBase ).xyz;\",\n\t\t\t\t\t\"float df = uDisplacementScale * dv.x + uDisplacementBias;\",\n\t\t\t\t\t\"vec3 displacedPosition = normal * df + position;\",\n\n\t\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\",\n\t\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\",\n\n\t\t\t\t\"#else\",\n\n\t\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\n\t\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\n\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\n\n\t\t\t\t\"vec3 normalTex = texture2D( tNormal, uvBase ).xyz * 2.0 - 1.0;\",\n\t\t\t\t\"vNormal = normalMatrix * normalTex;\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/WaterShader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/WaterShader.js",
"module-type": "library",
"text": "/**\n * @author jbouny / https://github.com/jbouny\n *\n * Work based on :\n * @author Slayvin / http://slayvin.net : Flat mirror for three.js\n * @author Stemkoski / http://www.adelphi.edu/~stemkoski : An implementation of water shader based on the flat mirror\n * @author Jonas Wagner / http://29a.ch/ && http://29a.ch/slides/2012/webglwater/ : Water shader explanations in WebGL\n */\n\nTHREE.ShaderLib['water'] = {\n\n\tuniforms: { \"normalSampler\":\t{ type: \"t\", value: null },\n\t\t\t\t\"mirrorSampler\":\t{ type: \"t\", value: null },\n\t\t\t\t\"alpha\":\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\t\t\"time\":\t\t\t\t{ type: \"f\", value: 0.0 },\n\t\t\t\t\"distortionScale\":\t{ type: \"f\", value: 20.0 },\n\t\t\t\t\"textureMatrix\" :\t{ type: \"m4\", value: new THREE.Matrix4() },\n\t\t\t\t\"sunColor\":\t\t\t{ type: \"c\", value: new THREE.Color( 0x7F7F7F ) },\n\t\t\t\t\"sunDirection\":\t\t{ type: \"v3\", value: new THREE.Vector3( 0.70707, 0.70707, 0 ) },\n\t\t\t\t\"eye\":\t\t\t\t{ type: \"v3\", value: new THREE.Vector3( 0, 0, 0 ) },\n\t\t\t\t\"waterColor\":\t\t{ type: \"c\", value: new THREE.Color( 0x555555 ) }\n\t},\n\n\tvertexShader: [\n\t\t'uniform mat4 textureMatrix;',\n\t\t'uniform float time;',\n\n\t\t'varying vec4 mirrorCoord;',\n\t\t'varying vec3 worldPosition;',\n\t\t\n\t\t'void main()',\n\t\t'{',\n\t\t'\tmirrorCoord = modelMatrix * vec4( position, 1.0 );',\n\t\t'\tworldPosition = mirrorCoord.xyz;',\n\t\t'\tmirrorCoord = textureMatrix * mirrorCoord;',\n\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\t\t'}'\n\t].join('\\n'),\n\n\tfragmentShader: [\n\t\t'precision highp float;',\n\t\t\n\t\t'uniform sampler2D mirrorSampler;',\n\t\t'uniform float alpha;',\n\t\t'uniform float time;',\n\t\t'uniform float distortionScale;',\n\t\t'uniform sampler2D normalSampler;',\n\t\t'uniform vec3 sunColor;',\n\t\t'uniform vec3 sunDirection;',\n\t\t'uniform vec3 eye;',\n\t\t'uniform vec3 waterColor;',\n\n\t\t'varying vec4 mirrorCoord;',\n\t\t'varying vec3 worldPosition;',\n\t\t\n\t\t'vec4 getNoise( vec2 uv )',\n\t\t'{',\n\t\t'\tvec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0);',\n\t\t'\tvec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 );',\n\t\t'\tvec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 );',\n\t\t'\tvec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 );',\n\t\t'\tvec4 noise = ( texture2D( normalSampler, uv0 ) ) +',\n '\t\t( texture2D( normalSampler, uv1 ) ) +',\n '\t\t( texture2D( normalSampler, uv2 ) ) +',\n\t\t'\t\t( texture2D( normalSampler, uv3 ) );',\n\t\t'\treturn noise * 0.5 - 1.0;',\n\t\t'}',\n\t\t\n\t\t'void sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor )',\n\t\t'{',\n\t\t'\tvec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) );',\n\t\t'\tfloat direction = max( 0.0, dot( eyeDirection, reflection ) );',\n\t\t'\tspecularColor += pow( direction, shiny ) * sunColor * spec;',\n\t\t'\tdiffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse;',\n\t\t'}',\n\t\t\n\t\t'void main()',\n\t\t'{',\n\t\t'\tvec4 noise = getNoise( worldPosition.xz );',\n\t\t'\tvec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) );',\n\n\t\t'\tvec3 diffuseLight = vec3(0.0);',\n\t\t'\tvec3 specularLight = vec3(0.0);',\n\n\t\t'\tvec3 worldToEye = eye-worldPosition;',\n\t\t'\tvec3 eyeDirection = normalize( worldToEye );',\n\t\t'\tsunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight );',\n\t\t\n\t\t'\tfloat distance = length(worldToEye);',\n\n\t\t'\tvec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale;',\n\t\t'\tvec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.z + distortion ) );',\n\n\t\t'\tfloat theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );',\n\t\t'\tfloat rf0 = 0.3;',\n\t\t'\tfloat reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );',\n\t\t'\tvec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;',\n\t\t'\tvec3 albedo = mix( sunColor * diffuseLight * 0.3 + scatter, ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance );',\n\t\t'\tgl_FragColor = vec4( albedo, alpha );',\n\t\t'}'\n\t].join('\\n')\n\n};\n\nTHREE.Water = function ( renderer, camera, scene, options ) {\n\n\tTHREE.Object3D.call( this );\n\tthis.name = 'water_' + this.id;\n\n\tfunction optionalParameter ( value, defaultValue ) {\n\t\treturn value !== undefined ? value : defaultValue;\n\t};\n\n\toptions = options || {};\n\t\n\tthis.matrixNeedsUpdate = true;\n\t\n\tvar width = optionalParameter( options.textureWidth, 512 );\n\tvar height = optionalParameter( options.textureHeight, 512 );\n\tthis.clipBias = optionalParameter( options.clipBias, 0.0 );\n\tthis.alpha = optionalParameter( options.alpha, 1.0 );\n\tthis.time = optionalParameter( options.time, 0.0 );\n\tthis.normalSampler = optionalParameter( options.waterNormals, null );\n\tthis.sunDirection = optionalParameter( options.sunDirection, new THREE.Vector3( 0.70707, 0.70707, 0.0 ) );\n\tthis.sunColor = new THREE.Color( optionalParameter( options.sunColor, 0xffffff ) );\n\tthis.waterColor = new THREE.Color( optionalParameter( options.waterColor, 0x7F7F7F ) );\n\tthis.eye = optionalParameter( options.eye, new THREE.Vector3( 0, 0, 0 ) );\n\tthis.distortionScale = optionalParameter( options.distortionScale, 20.0 );\n\t\n\tthis.renderer = renderer;\n\tthis.scene = scene;\n\tthis.mirrorPlane = new THREE.Plane();\n\tthis.normal = new THREE.Vector3( 0, 0, 1 );\n\tthis.mirrorWorldPosition = new THREE.Vector3();\n\tthis.cameraWorldPosition = new THREE.Vector3();\n\tthis.rotationMatrix = new THREE.Matrix4();\n\tthis.lookAtPosition = new THREE.Vector3( 0, 0, -1 );\n\tthis.clipPlane = new THREE.Vector4();\n\t\n\tif ( camera instanceof THREE.PerspectiveCamera )\n\t\tthis.camera = camera;\n\telse \n\t{\n\t\tthis.camera = new THREE.PerspectiveCamera();\n\t\tconsole.log(this.name + ': camera is not a Perspective Camera!')\n\t}\n\n\tthis.textureMatrix = new THREE.Matrix4();\n\n\tthis.mirrorCamera = this.camera.clone();\n\t\n\tthis.texture = new THREE.WebGLRenderTarget( width, height );\n\tthis.tempTexture = new THREE.WebGLRenderTarget( width, height );\n\t\n\tvar mirrorShader = THREE.ShaderLib[ \"water\" ];\n\tvar mirrorUniforms = THREE.UniformsUtils.clone( mirrorShader.uniforms );\n\n\tthis.material = new THREE.ShaderMaterial( { \n\t\tfragmentShader: mirrorShader.fragmentShader, \n\t\tvertexShader: mirrorShader.vertexShader, \n\t\tuniforms: mirrorUniforms,\n\t\ttransparent: true\n\t} );\n\n\tthis.material.uniforms.mirrorSampler.value = this.texture;\n\tthis.material.uniforms.textureMatrix.value = this.textureMatrix;\n\tthis.material.uniforms.alpha.value = this.alpha;\n\tthis.material.uniforms.time.value = this.time;\n\tthis.material.uniforms.normalSampler.value = this.normalSampler;\n\tthis.material.uniforms.sunColor.value = this.sunColor;\n\tthis.material.uniforms.waterColor.value = this.waterColor;\n\tthis.material.uniforms.sunDirection.value = this.sunDirection;\n\tthis.material.uniforms.distortionScale.value = this.distortionScale;\n\t\n\tthis.material.uniforms.eye.value = this.eye;\n\t\n\tif ( !THREE.Math.isPowerOfTwo(width) || !THREE.Math.isPowerOfTwo(height) )\n\t{\n\t\tthis.texture.generateMipmaps = false;\n\t\tthis.tempTexture.generateMipmaps = false;\n\t}\n\n\tthis.updateTextureMatrix();\n\tthis.render();\n};\n\nTHREE.Water.prototype = Object.create( THREE.Mirror.prototype );\n\n\nTHREE.Water.prototype.updateTextureMatrix = function () {\n\n\tfunction sign(x) { return x ? x < 0 ? -1 : 1 : 0; }\n\n\tthis.updateMatrixWorld();\n\tthis.camera.updateMatrixWorld();\n\n\tthis.mirrorWorldPosition.setFromMatrixPosition( this.matrixWorld );\n\tthis.cameraWorldPosition.setFromMatrixPosition( this.camera.matrixWorld );\n\n\tthis.rotationMatrix.extractRotation( this.matrixWorld );\n\n\tthis.normal.set( 0, 0, 1 );\n\tthis.normal.applyMatrix4( this.rotationMatrix );\n\n\tvar view = this.mirrorWorldPosition.clone().sub( this.cameraWorldPosition );\n\tview.reflect( this.normal ).negate();\n\tview.add( this.mirrorWorldPosition );\n\n\tthis.rotationMatrix.extractRotation( this.camera.matrixWorld );\n\n\tthis.lookAtPosition.set(0, 0, -1);\n\tthis.lookAtPosition.applyMatrix4( this.rotationMatrix );\n\tthis.lookAtPosition.add( this.cameraWorldPosition );\n\n\tvar target = this.mirrorWorldPosition.clone().sub( this.lookAtPosition );\n\ttarget.reflect( this.normal ).negate();\n\ttarget.add( this.mirrorWorldPosition );\n\n\tthis.up.set(0, -1, 0);\n\tthis.up.applyMatrix4( this.rotationMatrix );\n\tthis.up.reflect( this.normal ).negate();\n\n\tthis.mirrorCamera.position.copy( view );\n\tthis.mirrorCamera.up = this.up;\n\tthis.mirrorCamera.lookAt( target );\n\tthis.mirrorCamera.aspect = this.camera.aspect;\n\n\tthis.mirrorCamera.updateProjectionMatrix();\n\tthis.mirrorCamera.updateMatrixWorld();\n\tthis.mirrorCamera.matrixWorldInverse.getInverse(this.mirrorCamera.matrixWorld);\n\n\t// Update the texture matrix\n\tthis.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0 );\n\tthis.textureMatrix.multiply(this.mirrorCamera.projectionMatrix);\n\tthis.textureMatrix.multiply(this.mirrorCamera.matrixWorldInverse);\n\n\t// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n\t// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n\tthis.mirrorPlane.setFromNormalAndCoplanarPoint( this.normal, this.mirrorWorldPosition );\n\tthis.mirrorPlane.applyMatrix4(this.mirrorCamera.matrixWorldInverse);\n\n\tthis.clipPlane.set(this.mirrorPlane.normal.x, this.mirrorPlane.normal.y, this.mirrorPlane.normal.z, this.mirrorPlane.constant );\n\n\tvar q = new THREE.Vector4();\n\tvar projectionMatrix = this.mirrorCamera.projectionMatrix;\n\n\tq.x = (sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];\n\tq.y = (sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];\n\tq.z = -1.0;\n\tq.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];\n\n\t// Calculate the scaled plane vector\n\tvar c = new THREE.Vector4();\n\tc = this.clipPlane.multiplyScalar( 2.0 / this.clipPlane.dot(q) );\n\n\t// Replacing the third row of the projection matrix\n\tprojectionMatrix.elements[2] = c.x;\n\tprojectionMatrix.elements[6] = c.y;\n\tprojectionMatrix.elements[10] = c.z + 1.0 - this.clipBias;\n\tprojectionMatrix.elements[14] = c.w;\n\t\n\tvar worldCoordinates = new THREE.Vector3();\n\tworldCoordinates.setFromMatrixPosition( this.camera.matrixWorld );\n\tthis.eye = worldCoordinates;\n\tthis.material.uniforms.eye.value = this.eye;\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Octree.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Octree.js",
"module-type": "library",
"text": "/*!\n *\n * threeoctree.js (r60) / https://github.com/collinhover/threeoctree\n * (sparse) dynamic 3D spatial representation structure for fast searches.\n *\n * @author Collin Hover / http://collinhover.com/\n * based on Dynamic Octree by Piko3D @ http://www.piko3d.com/ and Octree by Marek Pawlowski @ pawlowski.it\n *\n */\n ( function ( THREE ) { \"use strict\";\n\t\n\t/*===================================================\n\n\tutility\n\n\t=====================================================*/\n\t\n\tfunction isNumber ( n ) {\n\t\treturn !isNaN( n ) && isFinite( n );\n\t}\n\t\n\tfunction isArray ( target ) {\n\t\treturn Object.prototype.toString.call( target ) === '[object Array]';\n\t}\n\t\n\tfunction toArray ( target ) {\n\t\treturn target ? ( isArray ( target ) !== true ? [ target ] : target ) : [];\n\t}\n\t\n\tfunction indexOfValue( array, value ) {\n\t\t\n\t\tfor ( var i = 0, il = array.length; i < il; i++ ) {\n\t\t\t\n\t\t\tif ( array[ i ] === value ) {\n\t\t\t\t\n\t\t\t\treturn i;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn -1;\n\t\t\n\t}\n\t\n\tfunction indexOfPropertyWithValue( array, property, value ) {\n\t\t\n\t\tfor ( var i = 0, il = array.length; i < il; i++ ) {\n\t\t\t\n\t\t\tif ( array[ i ][ property ] === value ) {\n\t\t\t\t\n\t\t\t\treturn i;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn -1;\n\t\t\n\t}\n\n\t/*===================================================\n\n\toctree\n\n\t=====================================================*/\n\n\tTHREE.Octree = function ( parameters ) {\n\t\t\n\t\t// handle parameters\n\t\t\n\t\tparameters = parameters || {};\n\t\t\n\t\tparameters.tree = this;\n\t\t\n\t\t// static properties ( modification is not recommended )\n\t\t\n\t\tthis.nodeCount = 0;\n\t\t\n\t\tthis.INDEX_INSIDE_CROSS = -1;\n\t\tthis.INDEX_OUTSIDE_OFFSET = 2;\n\t\t\n\t\tthis.INDEX_OUTSIDE_POS_X = isNumber( parameters.INDEX_OUTSIDE_POS_X ) ? parameters.INDEX_OUTSIDE_POS_X : 0;\n\t\tthis.INDEX_OUTSIDE_NEG_X = isNumber( parameters.INDEX_OUTSIDE_NEG_X ) ? parameters.INDEX_OUTSIDE_NEG_X : 1;\n\t\tthis.INDEX_OUTSIDE_POS_Y = isNumber( parameters.INDEX_OUTSIDE_POS_Y ) ? parameters.INDEX_OUTSIDE_POS_Y : 2;\n\t\tthis.INDEX_OUTSIDE_NEG_Y = isNumber( parameters.INDEX_OUTSIDE_NEG_Y ) ? parameters.INDEX_OUTSIDE_NEG_Y : 3;\n\t\tthis.INDEX_OUTSIDE_POS_Z = isNumber( parameters.INDEX_OUTSIDE_POS_Z ) ? parameters.INDEX_OUTSIDE_POS_Z : 4;\n\t\tthis.INDEX_OUTSIDE_NEG_Z = isNumber( parameters.INDEX_OUTSIDE_NEG_Z ) ? parameters.INDEX_OUTSIDE_NEG_Z : 5;\n\t\t\n\t\tthis.INDEX_OUTSIDE_MAP = [];\n\t\tthis.INDEX_OUTSIDE_MAP[ this.INDEX_OUTSIDE_POS_X ] = { index: this.INDEX_OUTSIDE_POS_X, count: 0, x: 1, y: 0, z: 0 };\n\t\tthis.INDEX_OUTSIDE_MAP[ this.INDEX_OUTSIDE_NEG_X ] = { index: this.INDEX_OUTSIDE_NEG_X, count: 0, x: -1, y: 0, z: 0 };\n\t\tthis.INDEX_OUTSIDE_MAP[ this.INDEX_OUTSIDE_POS_Y ] = { index: this.INDEX_OUTSIDE_POS_Y, count: 0, x: 0, y: 1, z: 0 };\n\t\tthis.INDEX_OUTSIDE_MAP[ this.INDEX_OUTSIDE_NEG_Y ] = { index: this.INDEX_OUTSIDE_NEG_Y, count: 0, x: 0, y: -1, z: 0 };\n\t\tthis.INDEX_OUTSIDE_MAP[ this.INDEX_OUTSIDE_POS_Z ] = { index: this.INDEX_OUTSIDE_POS_Z, count: 0, x: 0, y: 0, z: 1 };\n\t\tthis.INDEX_OUTSIDE_MAP[ this.INDEX_OUTSIDE_NEG_Z ] = { index: this.INDEX_OUTSIDE_NEG_Z, count: 0, x: 0, y: 0, z: -1 };\n\t\t\n\t\tthis.FLAG_POS_X = 1 << ( this.INDEX_OUTSIDE_POS_X + 1 );\n\t\tthis.FLAG_NEG_X = 1 << ( this.INDEX_OUTSIDE_NEG_X + 1 );\n\t\tthis.FLAG_POS_Y = 1 << ( this.INDEX_OUTSIDE_POS_Y + 1 );\n\t\tthis.FLAG_NEG_Y = 1 << ( this.INDEX_OUTSIDE_NEG_Y + 1 );\n\t\tthis.FLAG_POS_Z = 1 << ( this.INDEX_OUTSIDE_POS_Z + 1 );\n\t\tthis.FLAG_NEG_Z = 1 << ( this.INDEX_OUTSIDE_NEG_Z + 1 );\n\t\t\n\t\tthis.utilVec31Search = new THREE.Vector3();\n\t\tthis.utilVec32Search = new THREE.Vector3();\n\t\t\n\t\t// pass scene to see octree structure\n\t\t\n\t\tthis.scene = parameters.scene;\n\t\t\n\t\tif ( this.scene ) {\n\t\t\t\n\t\t\tthis.visualGeometry = new THREE.BoxGeometry( 1, 1, 1 );\n\t\t\tthis.visualMaterial = new THREE.MeshBasicMaterial( { color: 0xFF0066, wireframe: true, wireframeLinewidth: 1 } );\n\t\t\t\n\t\t}\n\t\t\n\t\t// properties\n\t\t\n\t\tthis.objects = [];\n\t\tthis.objectsMap = {};\n\t\tthis.objectsData = [];\n\t\tthis.objectsDeferred = [];\n\t\t\n\t\tthis.depthMax = isNumber( parameters.depthMax ) ? parameters.depthMax : Infinity;\n\t\tthis.objectsThreshold = isNumber( parameters.objectsThreshold ) ? parameters.objectsThreshold : 8;\n\t\tthis.overlapPct = isNumber( parameters.overlapPct ) ? parameters.overlapPct : 0.15;\n\t\tthis.undeferred = parameters.undeferred || false;\n\t\t\n\t\tthis.root = parameters.root instanceof THREE.OctreeNode ? parameters.root : new THREE.OctreeNode( parameters );\n\t\t\n\t};\n\n\tTHREE.Octree.prototype = {\n\t\t\n\t\tupdate: function () {\n\t\t\t\n\t\t\t// add any deferred objects that were waiting for render cycle\n\t\t\t\n\t\t\tif ( this.objectsDeferred.length > 0 ) {\n\t\t\t\t\n\t\t\t\tfor ( var i = 0, il = this.objectsDeferred.length; i < il; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tvar deferred = this.objectsDeferred[ i ];\n\t\t\t\t\t\n\t\t\t\t\tthis.addDeferred( deferred.object, deferred.options );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.objectsDeferred.length = 0;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tadd: function ( object, options ) {\n\t\t\t\n\t\t\t// add immediately\n\t\t\t\n\t\t\tif ( this.undeferred ) {\n\t\t\t\t\n\t\t\t\tthis.updateObject( object );\n\t\t\t\t\n\t\t\t\tthis.addDeferred( object, options );\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\t// defer add until update called\n\t\t\t\t\n\t\t\t\tthis.objectsDeferred.push( { object: object, options: options } );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\taddDeferred: function ( object, options ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tgeometry,\n\t\t\t\tfaces,\n\t\t\t\tuseFaces,\n\t\t\t\tvertices,\n\t\t\t\tuseVertices,\n\t\t\t\tobjectData;\n\t\t\t\n\t\t\t// ensure object is not object data\n\t\t\t\n\t\t\tif ( object instanceof THREE.OctreeObjectData ) {\n\t\t\t\t\n\t\t\t\tobject = object.object;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// check uuid to avoid duplicates\n\t\t\t\n\t\t\tif ( !object.uuid ) {\n\t\t\t\t\n\t\t\t\tobject.uuid = THREE.Math.generateUUID();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif ( !this.objectsMap[ object.uuid ] ) {\n\t\t\t\t\n\t\t\t\t// store\n\t\t\t\t\n\t\t\t\tthis.objects.push( object );\n\t\t\t\tthis.objectsMap[ object.uuid ] = object;\n\t\t\t\t\n\t\t\t\t// check options\n\t\t\t\t\n\t\t\t\tif ( options ) {\n\t\t\t\t\t\n\t\t\t\t\tuseFaces = options.useFaces;\n\t\t\t\t\tuseVertices = options.useVertices;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( useVertices === true ) {\n\t\t\t\t\t\n\t\t\t\t\tgeometry = object.geometry;\n\t\t\t\t\tvertices = geometry.vertices;\n\t\t\t\t\t\n\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i++ ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.addObjectData( object, vertices[ i ] );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} else if ( useFaces === true ) {\n\t\t\t\t\t\n\t\t\t\t\tgeometry = object.geometry;\n\t\t\t\t\tfaces = geometry.faces;\n\t\t\t\t\t\n\t\t\t\t\tfor ( i = 0, l = faces.length; i < l; i++ ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.addObjectData( object, faces[ i ] );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t\n\t\t\t\t\tthis.addObjectData( object );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\taddObjectData: function ( object, part ) {\n\t\t\t\n\t\t\tvar objectData = new THREE.OctreeObjectData( object, part );\n\t\t\t\n\t\t\t// add to tree objects data list\n\t\t\t\n\t\t\tthis.objectsData.push( objectData );\n\t\t\t\n\t\t\t// add to nodes\n\t\t\t\n\t\t\tthis.root.addObject( objectData );\n\t\t\t\n\t\t},\n\t\t\n\t\tremove: function ( object ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tobjectData = object,\n\t\t\t\tindex,\n\t\t\t\tobjectsDataRemoved;\n\t\t\t\n\t\t\t// ensure object is not object data for index search\n\t\t\t\n\t\t\tif ( object instanceof THREE.OctreeObjectData ) {\n\t\t\t\t\n\t\t\t\tobject = object.object;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// check uuid\n\t\t\t\n\t\t\tif ( this.objectsMap[ object.uuid ] ) {\n\t\t\t\t\n\t\t\t\tthis.objectsMap[ object.uuid ] = undefined;\n\t\t\t\t\n\t\t\t\t// check and remove from objects, nodes, and data lists\n\t\t\t\t\n\t\t\t\tindex = indexOfValue( this.objects, object );\n\t\t\t\t\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.objects.splice( index, 1 );\n\t\t\t\t\t\n\t\t\t\t\t// remove from nodes\n\t\t\t\t\t\n\t\t\t\t\tobjectsDataRemoved = this.root.removeObject( objectData );\n\t\t\t\t\t\n\t\t\t\t\t// remove from objects data list\n\t\t\t\t\t\n\t\t\t\t\tfor ( i = 0, l = objectsDataRemoved.length; i < l; i++ ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tobjectData = objectsDataRemoved[ i ];\n\t\t\t\t\t\t\n\t\t\t\t\t\tindex = indexOfValue( this.objectsData, objectData );\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.objectsData.splice( index, 1 );\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( this.objectsDeferred.length > 0 ) {\n\t\t\t\t\n\t\t\t\t// check and remove from deferred\n\t\t\t\t\n\t\t\t\tindex = indexOfPropertyWithValue( this.objectsDeferred, 'object', object );\n\t\t\t\t\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.objectsDeferred.splice( index, 1 );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\textend: function ( octree ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tobjectsData,\n\t\t\t\tobjectData;\n\t\t\t\t\n\t\t\tif ( octree instanceof THREE.Octree ) {\n\t\t\t\t\n\t\t\t\t// for each object data\n\t\t\t\t\n\t\t\t\tobjectsData = octree.objectsData;\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = objectsData.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tobjectData = objectsData[ i ];\n\t\t\t\t\t\n\t\t\t\t\tthis.add( objectData, { useFaces: objectData.faces, useVertices: objectData.vertices } );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\trebuild: function () {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode,\n\t\t\t\tobject,\n\t\t\t\tobjectData,\n\t\t\t\tindexOctant,\n\t\t\t\tindexOctantLast,\n\t\t\t\tobjectsUpdate = [];\n\t\t\t\n\t\t\t// check all object data for changes in position\n\t\t\t// assumes all object matrices are up to date\n\t\t\t\n\t\t\tfor ( i = 0, l = this.objectsData.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tobjectData = this.objectsData[ i ];\n\t\t\t\t\n\t\t\t\tnode = objectData.node;\n\t\t\t\t\n\t\t\t\t// update object\n\t\t\t\t\n\t\t\t\tobjectData.update();\n\t\t\t\t\n\t\t\t\t// if position has changed since last organization of object in tree\n\t\t\t\t\n\t\t\t\tif ( node instanceof THREE.OctreeNode && !objectData.positionLast.equals( objectData.position ) ) {\n\t\t\t\t\t\n\t\t\t\t\t// get octant index of object within current node\n\t\t\t\t\t\n\t\t\t\t\tindexOctantLast = objectData.indexOctant;\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = node.getOctantIndex( objectData );\n\t\t\t\t\t\n\t\t\t\t\t// if object octant index has changed\n\t\t\t\t\t\n\t\t\t\t\tif ( indexOctant !== indexOctantLast ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\t// add to update list\n\t\t\t\t\t\t\n\t\t\t\t\t\tobjectsUpdate.push( objectData );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// update changed objects\n\t\t\t\n\t\t\tfor ( i = 0, l = objectsUpdate.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tobjectData = objectsUpdate[ i ];\n\t\t\t\t\n\t\t\t\t// remove object from current node\n\t\t\t\t\n\t\t\t\tobjectData.node.removeObject( objectData );\n\t\t\t\t\n\t\t\t\t// add object to tree root\n\t\t\t\t\n\t\t\t\tthis.root.addObject( objectData );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tupdateObject: function ( object ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tparentCascade = [ object ],\n\t\t\t\tparent,\n\t\t\t\tparentUpdate;\n\t\t\t\n\t\t\t// search all parents between object and root for world matrix update\n\t\t\t\n\t\t\tparent = object.parent;\n\t\t\t\n\t\t\twhile( parent ) {\n\t\t\t\t\n\t\t\t\tparentCascade.push( parent );\n\t\t\t\tparent = parent.parent;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfor ( i = 0, l = parentCascade.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tparent = parentCascade[ i ];\n\t\t\t\t\n\t\t\t\tif ( parent.matrixWorldNeedsUpdate === true ) {\n\t\t\t\t\t\n\t\t\t\t\tparentUpdate = parent;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// update world matrix starting at uppermost parent that needs update\n\t\t\t\n\t\t\tif ( typeof parentUpdate !== 'undefined' ) {\n\t\t\t\t\n\t\t\t\tparentUpdate.updateMatrixWorld();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tsearch: function ( position, radius, organizeByObject, direction ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode,\n\t\t\t\tobjects,\n\t\t\t\tobjectData,\n\t\t\t\tobject,\n\t\t\t\tresults,\n\t\t\t\tresultData,\n\t\t\t\tresultsObjectsIndices,\n\t\t\t\tresultObjectIndex,\n\t\t\t\tdirectionPct;\n\t\t\t\n\t\t\t// add root objects\n\t\t\t\n\t\t\tobjects = [].concat( this.root.objects );\n\t\t\t\n\t\t\t// ensure radius (i.e. distance of ray) is a number\n\t\t\t\n\t\t\tif ( !( radius > 0 ) ) {\n\t\t\t\t\n\t\t\t\tradius = Number.MAX_VALUE;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if direction passed, normalize and find pct\n\t\t\t\n\t\t\tif ( direction instanceof THREE.Vector3 ) {\n\t\t\t\t\n\t\t\t\tdirection = this.utilVec31Search.copy( direction ).normalize();\n\t\t\t\tdirectionPct = this.utilVec32Search.set( 1, 1, 1 ).divide( direction );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// search each node of root\n\t\t\t\n\t\t\tfor ( i = 0, l = this.root.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tnode = this.root.nodesByIndex[ this.root.nodesIndices[ i ] ];\n\t\t\t\t\n\t\t\t\tobjects = node.search( position, radius, objects, direction, directionPct );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if should organize results by object\n\t\t\t\n\t\t\tif ( organizeByObject === true ) {\n\t\t\t\t\n\t\t\t\tresults = [];\n\t\t\t\tresultsObjectsIndices = [];\n\t\t\t\t\n\t\t\t\t// for each object data found\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = objects.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tobjectData = objects[ i ];\n\t\t\t\t\tobject = objectData.object;\n\t\t\t\t\t\n\t\t\t\t\tresultObjectIndex = indexOfValue( resultsObjectsIndices, object );\n\t\t\t\t\t\n\t\t\t\t\t// if needed, create new result data\n\t\t\t\t\t\n\t\t\t\t\tif ( resultObjectIndex === -1 ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tresultData = {\n\t\t\t\t\t\t\tobject: object,\n\t\t\t\t\t\t\tfaces: [],\n\t\t\t\t\t\t\tvertices: []\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tresults.push( resultData );\n\t\t\t\t\t\t\n\t\t\t\t\t\tresultsObjectsIndices.push( object );\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\n\t\t\t\t\t\tresultData = results[ resultObjectIndex ];\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// object data has faces or vertices, add to list\n\t\t\t\t\t\n\t\t\t\t\tif ( objectData.faces ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tresultData.faces.push( objectData.faces );\n\t\t\t\t\t\t\n\t\t\t\t\t} else if ( objectData.vertices ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tresultData.vertices.push( objectData.vertices );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tresults = objects;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn results;\n\t\t\t\n\t\t},\n\t\t\n\t\tsetRoot: function ( root ) { \n\t\t\t\n\t\t\tif ( root instanceof THREE.OctreeNode ) {\n\t\t\t\t\n\t\t\t\t// store new root\n\t\t\t\t\n\t\t\t\tthis.root = root;\n\t\t\t\t\n\t\t\t\t// update properties\n\t\t\t\t\n\t\t\t\tthis.root.updateProperties();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tgetDepthEnd: function () {\n\t\t\t\n\t\t\treturn this.root.getDepthEnd();\n\t\t\t\n\t\t},\n\t\t\n\t\tgetNodeCountEnd: function () {\n\t\t\t\n\t\t\treturn this.root.getNodeCountEnd();\n\t\t\t\n\t\t},\n\t\t\n\t\tgetObjectCountEnd: function () {\n\t\t\t\n\t\t\treturn this.root.getObjectCountEnd();\n\t\t\t\n\t\t},\n\t\t\n\t\ttoConsole: function () {\n\t\t\t\n\t\t\tthis.root.toConsole();\n\t\t\t\n\t\t}\n\t\t\n\t};\n\n\t/*===================================================\n\n\tobject data\n\n\t=====================================================*/\n\n\tTHREE.OctreeObjectData = function ( object, part ) {\n\t\t\n\t\t// properties\n\t\t\n\t\tthis.object = object;\n\t\t\n\t\t// handle part by type\n\t\t\n\t\tif ( part instanceof THREE.Face3 ) {\n\t\t\t\n\t\t\tthis.faces = part;\n\t\t\tthis.face3 = true;\n\t\t\tthis.utilVec31FaceBounds = new THREE.Vector3();\n\t\t\t\n\t\t} else if ( part instanceof THREE.Vector3 ) {\n\t\t\t\n\t\t\tthis.vertices = part;\n\t\t\t\n\t\t}\n\t\t\n\t\tthis.radius = 0;\n\t\tthis.position = new THREE.Vector3();\n\t\t\t\n\t\t// initial update\n\t\t\n\t\tif ( this.object instanceof THREE.Object3D ) {\n\t\t\t\n\t\t\tthis.update();\n\t\t\t\n\t\t}\n\t\t\n\t\tthis.positionLast = this.position.clone();\n\t\t\n\t};\n\n\tTHREE.OctreeObjectData.prototype = {\n\t\t\n\t\tupdate: function () {\n\t\t\t\n\t\t\tif ( this.face3 ) {\n\t\t\t\t\n\t\t\t\tthis.radius = this.getFace3BoundingRadius( this.object, this.faces );\n\t\t\t\tthis.position.copy( this.faces.centroid ).applyMatrix4( this.object.matrixWorld );\n\t\t\t\t\n\t\t\t} else if ( this.vertices ) {\n\t\t\t\t\n\t\t\t\tthis.radius = this.object.material.size || 1;\n\t\t\t\tthis.position.copy( this.vertices ).applyMatrix4( this.object.matrixWorld );\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tif ( this.object.geometry ) {\n\t\t\t\t\t\n\t\t\t\t\tif ( this.object.geometry.boundingSphere === null ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.object.geometry.computeBoundingSphere();\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.radius = this.object.geometry.boundingSphere.radius;\n\t\t\t\t\tthis.position.copy( this.object.geometry.boundingSphere.center ).applyMatrix4( this.object.matrixWorld );\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t\n\t\t\t\t\tthis.radius = this.object.boundRadius;\n\t\t\t\t\tthis.position.setFromMatrixPosition( this.object.matrixWorld );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.radius = this.radius * Math.max( this.object.scale.x, this.object.scale.y, this.object.scale.z );\n\t\t\t\n\t\t},\n\t\t\n\t\tgetFace3BoundingRadius: function ( object, face ) {\n\n\t\t\tif ( face.centroid === undefined ) face.centroid = new THREE.Vector3();\n\t\t\t\n\t\t\tvar geometry = object.geometry || object,\n\t\t\t\tvertices = geometry.vertices,\n\t\t\t\tcentroid = face.centroid,\n\t\t\t\tva = vertices[ face.a ], vb = vertices[ face.b ], vc = vertices[ face.c ],\n\t\t\t\tcentroidToVert = this.utilVec31FaceBounds,\n\t\t\t\tradius;\n\t\t\t\t\n\t\t\tcentroid.addVectors( va, vb ).add( vc ).divideScalar( 3 );\n\t\t\tradius = Math.max( centroidToVert.subVectors( centroid, va ).length(), centroidToVert.subVectors( centroid, vb ).length(), centroidToVert.subVectors( centroid, vc ).length() );\n\t\t\t\n\t\t\treturn radius;\n\t\t\t\n\t\t}\n\t\t\n\t};\n\n\t/*===================================================\n\n\tnode\n\n\t=====================================================*/\n\n\tTHREE.OctreeNode = function ( parameters ) {\n\t\t\n\t\t// utility\n\t\t\n\t\tthis.utilVec31Branch = new THREE.Vector3();\n\t\tthis.utilVec31Expand = new THREE.Vector3();\n\t\tthis.utilVec31Ray = new THREE.Vector3();\n\t\t\n\t\t// handle parameters\n\t\t\n\t\tparameters = parameters || {};\n\t\t\n\t\t// store or create tree\n\t\t\n\t\tif ( parameters.tree instanceof THREE.Octree ) {\n\t\t\t\n\t\t\tthis.tree = parameters.tree;\n\t\t\t\n\t\t} else if ( parameters.parent instanceof THREE.OctreeNode !== true ) {\n\t\t\t\n\t\t\tparameters.root = this;\n\t\t\t\n\t\t\tthis.tree = new THREE.Octree( parameters );\n\t\t\t\n\t\t}\n\t\t\n\t\t// basic properties\n\t\t\n\t\tthis.id = this.tree.nodeCount++;\n\t\tthis.position = parameters.position instanceof THREE.Vector3 ? parameters.position : new THREE.Vector3();\n\t\tthis.radius = parameters.radius > 0 ? parameters.radius : 1;\n\t\tthis.indexOctant = parameters.indexOctant;\n\t\tthis.depth = 0;\n\t\t\n\t\t// reset and assign parent\n\t\t\n\t\tthis.reset();\n\t\tthis.setParent( parameters.parent );\n\t\t\n\t\t// additional properties\n\t\t\n\t\tthis.overlap = this.radius * this.tree.overlapPct;\n\t\tthis.radiusOverlap = this.radius + this.overlap;\n\t\tthis.left = this.position.x - this.radiusOverlap;\n\t\tthis.right = this.position.x + this.radiusOverlap;\n\t\tthis.bottom = this.position.y - this.radiusOverlap;\n\t\tthis.top = this.position.y + this.radiusOverlap;\n\t\tthis.back = this.position.z - this.radiusOverlap;\n\t\tthis.front = this.position.z + this.radiusOverlap;\n\t\t\n\t\t// visual\n\t\t\n\t\tif ( this.tree.scene ) {\n\t\t\t\n\t\t\tthis.visual = new THREE.Mesh( this.tree.visualGeometry, this.tree.visualMaterial );\n\t\t\tthis.visual.scale.set( this.radiusOverlap * 2, this.radiusOverlap * 2, this.radiusOverlap * 2 );\n\t\t\tthis.visual.position.copy( this.position );\n\t\t\tthis.tree.scene.add( this.visual );\n\t\t\t\n\t\t}\n\t\t\n\t};\n\n\tTHREE.OctreeNode.prototype = {\n\t\t\n\t\tsetParent: function ( parent ) {\n\t\t\t\n\t\t\t// store new parent\n\t\t\t\n\t\t\tif ( parent !== this && this.parent !== parent ) {\n\t\t\t\t\n\t\t\t\tthis.parent = parent;\n\t\t\t\t\n\t\t\t\t// update properties\n\t\t\t\t\n\t\t\t\tthis.updateProperties();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tupdateProperties: function () {\n\t\t\t\n\t\t\tvar i, l;\n\t\t\t\n\t\t\t// properties\n\t\t\t\n\t\t\tif ( this.parent instanceof THREE.OctreeNode ) {\n\t\t\t\t\n\t\t\t\tthis.tree = this.parent.tree;\n\t\t\t\tthis.depth = this.parent.depth + 1;\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tthis.depth = 0;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// cascade\n\t\t\t\n\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tthis.nodesByIndex[ this.nodesIndices[ i ] ].updateProperties();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\treset: function ( cascade, removeVisual ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode,\n\t\t\t\tnodesIndices = this.nodesIndices || [],\n\t\t\t\tnodesByIndex = this.nodesByIndex;\n\t\t\t\n\t\t\tthis.objects = [];\n\t\t\tthis.nodesIndices = [];\n\t\t\tthis.nodesByIndex = {};\n\t\t\t\n\t\t\t// unset parent in nodes\n\t\t\t\n\t\t\tfor ( i = 0, l = nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tnode = nodesByIndex[ nodesIndices[ i ] ];\n\t\t\t\t\n\t\t\t\tnode.setParent( undefined );\n\t\t\t\t\n\t\t\t\tif ( cascade === true ) {\n\t\t\t\t\t\n\t\t\t\t\tnode.reset( cascade, removeVisual );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// visual\n\t\t\t\n\t\t\tif ( removeVisual === true && this.visual && this.visual.parent ) {\n\t\t\t\t\n\t\t\t\tthis.visual.parent.remove( this.visual );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\taddNode: function ( node, indexOctant ) {\n\t\t\t\n\t\t\tnode.indexOctant = indexOctant;\n\t\t\t\n\t\t\tif ( indexOfValue( this.nodesIndices, indexOctant ) === -1 ) {\n\t\t\t\t\n\t\t\t\tthis.nodesIndices.push( indexOctant );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.nodesByIndex[ indexOctant ] = node;\n\t\t\t\n\t\t\tif ( node.parent !== this ) {\n\t\t\t\t\n\t\t\t\tnode.setParent( this );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tremoveNode: function ( indexOctant ) {\n\t\t\t\n\t\t\tvar index,\n\t\t\t\tnode;\n\t\t\t\t\n\t\t\tindex = indexOfValue( this.nodesIndices, indexOctant );\n\t\t\t\n\t\t\tthis.nodesIndices.splice( index, 1 );\n\t\t\t\n\t\t\tnode = node || this.nodesByIndex[ indexOctant ];\n\t\t\t\n\t\t\tdelete this.nodesByIndex[ indexOctant ];\n\t\t\t\n\t\t\tif ( node.parent === this ) {\n\t\t\t\t\n\t\t\t\tnode.setParent( undefined );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\taddObject: function ( object ) {\n\t\t\t\n\t\t\tvar index,\n\t\t\t\tindexOctant,\n\t\t\t\tnode;\n\t\t\t\n\t\t\t// get object octant index\n\t\t\t\n\t\t\tindexOctant = this.getOctantIndex( object );\n\t\t\t\n\t\t\t// if object fully contained by an octant, add to subtree\n\t\t\tif ( indexOctant > -1 && this.nodesIndices.length > 0 ) {\n\t\t\t\t\n\t\t\t\tnode = this.branch( indexOctant );\n\t\t\t\t\n\t\t\t\tnode.addObject( object );\n\t\t\t\t\n\t\t\t} else if ( indexOctant < -1 && this.parent instanceof THREE.OctreeNode ) {\n\t\t\t\t\n\t\t\t\t// if object lies outside bounds, add to parent node\n\t\t\t\t\n\t\t\t\tthis.parent.addObject( object );\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\t// add to this objects list\n\t\t\t\t\n\t\t\t\tindex = indexOfValue( this.objects, object );\n\t\t\t\t\n\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.objects.push( object );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// node reference\n\t\t\t\t\n\t\t\t\tobject.node = this;\n\t\t\t\t\n\t\t\t\t// check if need to expand, split, or both\n\t\t\t\t\n\t\t\t\tthis.checkGrow();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\taddObjectWithoutCheck: function ( objects ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tobject;\n\n\t\t\tfor ( i = 0, l = objects.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tobject = objects[ i ];\n\t\t\t\t\n\t\t\t\tthis.objects.push( object );\n\t\t\t\t\n\t\t\t\tobject.node = this;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tremoveObject: function ( object ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnodesRemovedFrom,\n\t\t\t\tremoveData;\n\t\t\t\n\t\t\t// cascade through tree to find and remove object\n\t\t\t\n\t\t\tremoveData = this.removeObjectRecursive( object, { searchComplete: false, nodesRemovedFrom: [], objectsDataRemoved: [] } );\n\t\t\t\n\t\t\t// if object removed, try to shrink the nodes it was removed from\n\t\t\t\n\t\t\tnodesRemovedFrom = removeData.nodesRemovedFrom;\n\t\t\t\n\t\t\tif ( nodesRemovedFrom.length > 0 ) {\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = nodesRemovedFrom.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tnodesRemovedFrom[ i ].shrink();\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn removeData.objectsDataRemoved;\n\t\t\t\n\t\t},\n\t\t\n\t\tremoveObjectRecursive: function ( object, removeData ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tindex = -1,\n\t\t\t\tobjectData,\n\t\t\t\tnode,\n\t\t\t\tobjectRemoved;\n\t\t\t\n\t\t\t// find index of object in objects list\n\t\t\t\n\t\t\t// search and remove object data (fast)\n\t\t\tif ( object instanceof THREE.OctreeObjectData ) {\n\t\t\t\t\n\t\t\t\t// remove from this objects list\n\t\t\t\t\n\t\t\t\tindex = indexOfValue( this.objects, object );\n\t\t\t\t\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.objects.splice( index, 1 );\n\t\t\t\t\tobject.node = undefined;\n\t\t\t\t\t\n\t\t\t\t\tremoveData.objectsDataRemoved.push( object );\n\t\t\t\t\t\n\t\t\t\t\tremoveData.searchComplete = objectRemoved = true;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\n\t\t\t\t// search each object data for object and remove (slow)\n\t\t\t\t\n\t\t\t\tfor ( i = this.objects.length - 1; i >= 0; i-- ) {\n\t\t\t\t\t\n\t\t\t\t\tobjectData = this.objects[ i ];\n\t\t\t\t\t\n\t\t\t\t\tif ( objectData.object === object ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.objects.splice( i, 1 );\n\t\t\t\t\t\tobjectData.node = undefined;\n\t\t\t\t\t\t\n\t\t\t\t\t\tremoveData.objectsDataRemoved.push( objectData );\n\t\t\t\t\t\t\n\t\t\t\t\t\tobjectRemoved = true;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( !objectData.faces && !objectData.vertices ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tremoveData.searchComplete = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if object data removed and this is not on nodes removed from\n\t\t\t\n\t\t\tif ( objectRemoved === true ) {\n\t\t\t\t\n\t\t\t\tremoveData.nodesRemovedFrom.push( this );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if search not complete, search nodes\n\t\t\t\n\t\t\tif ( removeData.searchComplete !== true ) {\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\t\t\t\t\t\n\t\t\t\t\t// try removing object from node\n\t\t\t\t\t\n\t\t\t\t\tremoveData = node.removeObjectRecursive( object, removeData );\n\t\t\t\t\t\n\t\t\t\t\tif ( removeData.searchComplete === true ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn removeData;\n\t\t\t\n\t\t},\n\t\t\n\t\tcheckGrow: function () {\n\t\t\t\n\t\t\t// if object count above max\n\t\t\t\n\t\t\tif ( this.objects.length > this.tree.objectsThreshold && this.tree.objectsThreshold > 0 ) {\n\t\t\t\t\n\t\t\t\tthis.grow();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tgrow: function () {\n\t\t\t\n\t\t\tvar indexOctant,\n\t\t\t\tobject,\n\t\t\t\tobjectsExpand = [],\n\t\t\t\tobjectsExpandOctants = [],\n\t\t\t\tobjectsSplit = [],\n\t\t\t\tobjectsSplitOctants = [],\n\t\t\t\tobjectsRemaining = [],\n\t\t\t\ti, l;\n\t\t\t\n\t\t\t// for each object\n\t\t\t\n\t\t\tfor ( i = 0, l = this.objects.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tobject = this.objects[ i ];\n\t\t\t\t\n\t\t\t\t// get object octant index\n\t\t\t\t\n\t\t\t\tindexOctant = this.getOctantIndex( object );\n\t\t\t\t\n\t\t\t\t// if lies within octant\n\t\t\t\tif ( indexOctant > -1 ) {\n\t\t\t\t\t\n\t\t\t\t\tobjectsSplit.push( object );\n\t\t\t\t\tobjectsSplitOctants.push( indexOctant );\n\t\t\t\t\n\t\t\t\t} else if ( indexOctant < -1 ) {\n\t\t\t\t\t\n\t\t\t\t\t// lies outside radius\n\t\t\t\t\t\n\t\t\t\t\tobjectsExpand.push( object );\n\t\t\t\t\tobjectsExpandOctants.push( indexOctant );\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\n\t\t\t\t\t// lies across bounds between octants\n\t\t\t\t\t\n\t\t\t\t\tobjectsRemaining.push( object );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if has objects to split\n\t\t\t\n\t\t\tif ( objectsSplit.length > 0) {\n\t\t\t\t\n\t\t\t\tobjectsRemaining = objectsRemaining.concat( this.split( objectsSplit, objectsSplitOctants ) );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if has objects to expand\n\t\t\t\n\t\t\tif ( objectsExpand.length > 0) {\n\t\t\t\t\n\t\t\t\tobjectsRemaining = objectsRemaining.concat( this.expand( objectsExpand, objectsExpandOctants ) );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// store remaining\n\t\t\t\n\t\t\tthis.objects = objectsRemaining;\n\t\t\t\n\t\t\t// merge check\n\t\t\t\n\t\t\tthis.checkMerge();\n\t\t\t\n\t\t},\n\t\t\n\t\tsplit: function ( objects, octants ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tindexOctant,\n\t\t\t\tobject,\n\t\t\t\tnode,\n\t\t\t\tobjectsRemaining;\n\t\t\t\n\t\t\t// if not at max depth\n\t\t\t\n\t\t\tif ( this.depth < this.tree.depthMax ) {\n\t\t\t\t\n\t\t\t\tobjects = objects || this.objects;\n\t\t\t\t\n\t\t\t\toctants = octants || [];\n\t\t\t\t\n\t\t\t\tobjectsRemaining = [];\n\t\t\t\t\n\t\t\t\t// for each object\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = objects.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tobject = objects[ i ];\n\t\t\t\t\t\n\t\t\t\t\t// get object octant index\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = octants[ i ];\n\t\t\t\t\t\n\t\t\t\t\t// if object contained by octant, branch this tree\n\t\t\t\t\t\n\t\t\t\t\tif ( indexOctant > -1 ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tnode = this.branch( indexOctant );\n\t\t\t\t\t\t\n\t\t\t\t\t\tnode.addObject( object );\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\n\t\t\t\t\t\tobjectsRemaining.push( object );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if all objects, set remaining as new objects\n\t\t\t\t\n\t\t\t\tif ( objects === this.objects ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.objects = objectsRemaining;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tobjectsRemaining = this.objects;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn objectsRemaining;\n\t\t\t\n\t\t},\n\t\t\n\t\tbranch: function ( indexOctant ) {\n\t\t\t\n\t\t\tvar node,\n\t\t\t\toverlap,\n\t\t\t\tradius,\n\t\t\t\tradiusOffset,\n\t\t\t\toffset,\n\t\t\t\tposition;\n\t\t\t\n\t\t\t// node exists\n\t\t\t\n\t\t\tif ( this.nodesByIndex[ indexOctant ] instanceof THREE.OctreeNode ) {\n\t\t\t\t\n\t\t\t\tnode = this.nodesByIndex[ indexOctant ];\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\t// properties\n\t\t\t\t\n\t\t\t\tradius = ( this.radiusOverlap ) * 0.5;\n\t\t\t\toverlap = radius * this.tree.overlapPct;\n\t\t\t\tradiusOffset = radius - overlap;\n\t\t\t\toffset = this.utilVec31Branch.set( indexOctant & 1 ? radiusOffset : -radiusOffset, indexOctant & 2 ? radiusOffset : -radiusOffset, indexOctant & 4 ? radiusOffset : -radiusOffset );\n\t\t\t\tposition = new THREE.Vector3().addVectors( this.position, offset );\n\t\t\t\t\n\t\t\t\t// node\n\t\t\t\t\n\t\t\t\tnode = new THREE.OctreeNode( {\n\t\t\t\t\ttree: this.tree,\n\t\t\t\t\tparent: this,\n\t\t\t\t\tposition: position,\n\t\t\t\t\tradius: radius,\n\t\t\t\t\tindexOctant: indexOctant\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\t// store\n\t\t\t\t\n\t\t\t\tthis.addNode( node, indexOctant );\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn node;\n\t\t\t\n\t\t},\n\t\t\n\t\texpand: function ( objects, octants ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tobject,\n\t\t\t\tobjectsRemaining,\n\t\t\t\tobjectsExpand,\n\t\t\t\tindexOctant,\n\t\t\t\tflagsOutside,\n\t\t\t\tindexOutside,\n\t\t\t\tindexOctantInverse,\n\t\t\t\tiom = this.tree.INDEX_OUTSIDE_MAP,\n\t\t\t\tindexOutsideCounts,\n\t\t\t\tinfoIndexOutside1,\n\t\t\t\tinfoIndexOutside2,\n\t\t\t\tinfoIndexOutside3,\n\t\t\t\tindexOutsideBitwise1,\n\t\t\t\tindexOutsideBitwise2,\n\t\t\t\tinfoPotential1,\n\t\t\t\tinfoPotential2,\n\t\t\t\tinfoPotential3,\n\t\t\t\tindexPotentialBitwise1,\n\t\t\t\tindexPotentialBitwise2,\n\t\t\t\toctantX, octantY, octantZ,\n\t\t\t\toverlap,\n\t\t\t\tradius,\n\t\t\t\tradiusOffset,\n\t\t\t\tradiusParent,\n\t\t\t\toverlapParent,\n\t\t\t\toffset = this.utilVec31Expand,\n\t\t\t\tposition,\n\t\t\t\tparent;\n\t\t\t\n\t\t\t// handle max depth down tree\n\t\t\t\n\t\t\tif ( this.tree.root.getDepthEnd() < this.tree.depthMax ) {\n\t\t\t\t\n\t\t\t\tobjects = objects || this.objects;\n\t\t\t\toctants = octants || [];\n\t\t\t\t\n\t\t\t\tobjectsRemaining = [];\n\t\t\t\tobjectsExpand = [];\n\t\t\t\t\n\t\t\t\t// reset counts\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = iom.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tiom[ i ].count = 0;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// for all outside objects, find outside octants containing most objects\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = objects.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tobject = objects[ i ];\n\t\t\t\t\t\n\t\t\t\t\t// get object octant index\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = octants[ i ] ;\n\t\t\t\t\t\n\t\t\t\t\t// if object outside this, include in calculations\n\t\t\t\t\t\n\t\t\t\t\tif ( indexOctant < -1 ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\t// convert octant index to outside flags\n\t\t\t\t\t\t\n\t\t\t\t\t\tflagsOutside = -indexOctant - this.tree.INDEX_OUTSIDE_OFFSET;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// check against bitwise flags\n\t\t\t\t\t\t\n\t\t\t\t\t\t// x\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( flagsOutside & this.tree.FLAG_POS_X ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiom[ this.tree.INDEX_OUTSIDE_POS_X ].count++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else if ( flagsOutside & this.tree.FLAG_NEG_X ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiom[ this.tree.INDEX_OUTSIDE_NEG_X ].count++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// y\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( flagsOutside & this.tree.FLAG_POS_Y ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiom[ this.tree.INDEX_OUTSIDE_POS_Y ].count++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else if ( flagsOutside & this.tree.FLAG_NEG_Y ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiom[ this.tree.INDEX_OUTSIDE_NEG_Y ].count++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// z\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( flagsOutside & this.tree.FLAG_POS_Z ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiom[ this.tree.INDEX_OUTSIDE_POS_Z ].count++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else if ( flagsOutside & this.tree.FLAG_NEG_Z ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiom[ this.tree.INDEX_OUTSIDE_NEG_Z ].count++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// store in expand list\n\t\t\t\t\t\t\n\t\t\t\t\t\tobjectsExpand.push( object );\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\n\t\t\t\t\t\tobjectsRemaining.push( object );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if objects to expand\n\t\t\t\t\n\t\t\t\tif ( objectsExpand.length > 0 ) {\n\t\t\t\t\t\n\t\t\t\t\t// shallow copy index outside map\n\t\t\t\t\t\n\t\t\t\t\tindexOutsideCounts = iom.slice( 0 );\n\t\t\t\t\t\n\t\t\t\t\t// sort outside index count so highest is first\n\t\t\t\t\t\n\t\t\t\t\tindexOutsideCounts.sort( function ( a, b ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn b.count - a.count;\n\t\t\t\t\t\t\n\t\t\t\t\t} );\n\t\t\t\t\t\n\t\t\t\t\t// get highest outside indices\n\t\t\t\t\t\n\t\t\t\t\t// first is first\n\t\t\t\t\tinfoIndexOutside1 = indexOutsideCounts[ 0 ];\n\t\t\t\t\tindexOutsideBitwise1 = infoIndexOutside1.index | 1;\n\t\t\t\t\t\n\t\t\t\t\t// second is ( one of next two bitwise OR 1 ) that is not opposite of ( first bitwise OR 1 )\n\t\t\t\t\t\n\t\t\t\t\tinfoPotential1 = indexOutsideCounts[ 1 ];\n\t\t\t\t\tinfoPotential2 = indexOutsideCounts[ 2 ];\n\t\t\t\t\t\n\t\t\t\t\tinfoIndexOutside2 = ( infoPotential1.index | 1 ) !== indexOutsideBitwise1 ? infoPotential1 : infoPotential2;\n\t\t\t\t\tindexOutsideBitwise2 = infoIndexOutside2.index | 1;\n\t\t\t\t\t\n\t\t\t\t\t// third is ( one of next three bitwise OR 1 ) that is not opposite of ( first or second bitwise OR 1 )\n\t\t\t\t\t\n\t\t\t\t\tinfoPotential1 = indexOutsideCounts[ 2 ];\n\t\t\t\t\tinfoPotential2 = indexOutsideCounts[ 3 ];\n\t\t\t\t\tinfoPotential3 = indexOutsideCounts[ 4 ];\n\t\t\t\t\t\n\t\t\t\t\tindexPotentialBitwise1 = infoPotential1.index | 1;\n\t\t\t\t\tindexPotentialBitwise2 = infoPotential2.index | 1;\n\t\t\t\t\t\n\t\t\t\t\tinfoIndexOutside3 = indexPotentialBitwise1 !== indexOutsideBitwise1 && indexPotentialBitwise1 !== indexOutsideBitwise2 ? infoPotential1 : indexPotentialBitwise2 !== indexOutsideBitwise1 && indexPotentialBitwise2 !== indexOutsideBitwise2 ? infoPotential2 : infoPotential3;\n\t\t\t\t\t\n\t\t\t\t\t// get this octant normal based on outside octant indices\n\t\t\t\t\t\n\t\t\t\t\toctantX = infoIndexOutside1.x + infoIndexOutside2.x + infoIndexOutside3.x;\n\t\t\t\t\toctantY = infoIndexOutside1.y + infoIndexOutside2.y + infoIndexOutside3.y;\n\t\t\t\t\toctantZ = infoIndexOutside1.z + infoIndexOutside2.z + infoIndexOutside3.z;\n\t\t\t\t\t\n\t\t\t\t\t// get this octant indices based on octant normal\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = this.getOctantIndexFromPosition( octantX, octantY, octantZ );\n\t\t\t\t\tindexOctantInverse = this.getOctantIndexFromPosition( -octantX, -octantY, -octantZ );\n\t\t\t\t\t\n\t\t\t\t\t// properties\n\t\t\t\t\t\n\t\t\t\t\toverlap = this.overlap;\n\t\t\t\t\tradius = this.radius;\n\t\t\t\t\t\n\t\t\t\t\t// radius of parent comes from reversing overlap of this, unless overlap percent is 0\n\t\t\t\t\t\n\t\t\t\t\tradiusParent = this.tree.overlapPct > 0 ? overlap / ( ( 0.5 * this.tree.overlapPct ) * ( 1 + this.tree.overlapPct ) ) : radius * 2; \n\t\t\t\t\toverlapParent = radiusParent * this.tree.overlapPct;\n\t\t\t\t\t\n\t\t\t\t\t// parent offset is difference between radius + overlap of parent and child\n\t\t\t\t\t\n\t\t\t\t\tradiusOffset = ( radiusParent + overlapParent ) - ( radius + overlap );\n\t\t\t\t\toffset.set( indexOctant & 1 ? radiusOffset : -radiusOffset, indexOctant & 2 ? radiusOffset : -radiusOffset, indexOctant & 4 ? radiusOffset : -radiusOffset );\n\t\t\t\t\tposition = new THREE.Vector3().addVectors( this.position, offset );\n\t\t\t\t\t\n\t\t\t\t\t// parent\n\t\t\t\t\t\n\t\t\t\t\tparent = new THREE.OctreeNode( {\n\t\t\t\t\t\ttree: this.tree,\n\t\t\t\t\t\tposition: position,\n\t\t\t\t\t\tradius: radiusParent\n\t\t\t\t\t} );\n\t\t\t\t\t\n\t\t\t\t\t// set self as node of parent\n\t\t\t\t\t\n\t\t\t\t\tparent.addNode( this, indexOctantInverse );\n\t\t\t\t\t\n\t\t\t\t\t// set parent as root\n\t\t\t\t\t\n\t\t\t\t\tthis.tree.setRoot( parent );\n\t\t\t\t\t\n\t\t\t\t\t// add all expand objects to parent\n\t\t\t\t\t\n\t\t\t\t\tfor ( i = 0, l = objectsExpand.length; i < l; i++ ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.tree.root.addObject( objectsExpand[ i ] );\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if all objects, set remaining as new objects\n\t\t\t\t\n\t\t\t\tif ( objects === this.objects ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.objects = objectsRemaining;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tobjectsRemaining = objects;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn objectsRemaining;\n\t\t\t\n\t\t},\n\t\t\n\t\tshrink: function () {\n\t\t\t\n\t\t\t// merge check\n\t\t\t\n\t\t\tthis.checkMerge();\n\t\t\t\n\t\t\t// contract check\n\t\t\t\n\t\t\tthis.tree.root.checkContract();\n\t\t\t\n\t\t},\n\t\t\n\t\tcheckMerge: function () {\n\t\t\t\n\t\t\tvar nodeParent = this,\n\t\t\t\tnodeMerge;\n\t\t\t\n\t\t\t// traverse up tree as long as node + entire subtree's object count is under minimum\n\t\t\t\n\t\t\twhile ( nodeParent.parent instanceof THREE.OctreeNode && nodeParent.getObjectCountEnd() < this.tree.objectsThreshold ) {\n\t\t\t\t\n\t\t\t\tnodeMerge = nodeParent;\n\t\t\t\tnodeParent = nodeParent.parent;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if parent node is not this, merge entire subtree into merge node\n\t\t\t\n\t\t\tif ( nodeParent !== this ) {\n\t\t\t\t\n\t\t\t\tnodeParent.merge( nodeMerge );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tmerge: function ( nodes ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tj, k,\n\t\t\t\tnode;\n\t\t\t\n\t\t\t// handle nodes\n\t\t\t\n\t\t\tnodes = toArray( nodes );\n\t\t\t\n\t\t\tfor ( i = 0, l = nodes.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tnode = nodes[ i ];\n\t\t\t\t\n\t\t\t\t// gather node + all subtree objects\n\t\t\t\t\n\t\t\t\tthis.addObjectWithoutCheck( node.getObjectsEnd() );\n\t\t\t\t\n\t\t\t\t// reset node + entire subtree\n\t\t\t\t\n\t\t\t\tnode.reset( true, true );\n\t\t\t\t\n\t\t\t\t// remove node\n\t\t\t\t\n\t\t\t\tthis.removeNode( node.indexOctant, node );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// merge check\n\t\t\t\n\t\t\tthis.checkMerge();\n\t\t\t\n\t\t},\n\t\t\n\t\tcheckContract: function () {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode,\n\t\t\t\tnodeObjectsCount,\n\t\t\t\tnodeHeaviest,\n\t\t\t\tnodeHeaviestObjectsCount,\n\t\t\t\toutsideHeaviestObjectsCount;\n\t\t\t\n\t\t\t// find node with highest object count\n\t\t\t\n\t\t\tif ( this.nodesIndices.length > 0 ) {\n\t\t\t\t\n\t\t\t\tnodeHeaviestObjectsCount = 0;\n\t\t\t\toutsideHeaviestObjectsCount = this.objects.length;\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\t\t\t\t\t\n\t\t\t\t\tnodeObjectsCount = node.getObjectCountEnd();\n\t\t\t\t\toutsideHeaviestObjectsCount += nodeObjectsCount;\n\t\t\t\t\t\n\t\t\t\t\tif ( nodeHeaviest instanceof THREE.OctreeNode === false || nodeObjectsCount > nodeHeaviestObjectsCount ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tnodeHeaviest = node;\n\t\t\t\t\t\tnodeHeaviestObjectsCount = nodeObjectsCount;\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// subtract heaviest count from outside count\n\t\t\t\t\n\t\t\t\toutsideHeaviestObjectsCount -= nodeHeaviestObjectsCount;\n\t\t\t\t\n\t\t\t\t// if should contract\n\t\t\t\t\n\t\t\t\tif ( outsideHeaviestObjectsCount < this.tree.objectsThreshold && nodeHeaviest instanceof THREE.OctreeNode ) {\n\t\t\t\t\t\n\t\t\t\t\tthis.contract( nodeHeaviest );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t},\n\t\t\n\t\tcontract: function ( nodeRoot ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode;\n\t\t\t\n\t\t\t// handle all nodes\n\t\t\t\n\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\t\t\t\t\n\t\t\t\t// if node is not new root\n\t\t\t\t\n\t\t\t\tif ( node !== nodeRoot ) {\n\t\t\t\t\t\n\t\t\t\t\t// add node + all subtree objects to root\n\t\t\t\t\t\n\t\t\t\t\tnodeRoot.addObjectWithoutCheck( node.getObjectsEnd() );\n\t\t\t\t\t\n\t\t\t\t\t// reset node + entire subtree\n\t\t\t\t\t\n\t\t\t\t\tnode.reset( true, true );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// add own objects to root\n\t\t\t\n\t\t\tnodeRoot.addObjectWithoutCheck( this.objects );\n\t\t\t\n\t\t\t// reset self\n\t\t\t\n\t\t\tthis.reset( false, true );\n\t\t\t\n\t\t\t// set new root\n\t\t\t\n\t\t\tthis.tree.setRoot( nodeRoot );\n\t\t\t\n\t\t\t// contract check on new root\n\t\t\t\n\t\t\tnodeRoot.checkContract();\n\t\t\t\n\t\t},\n\t\t\n\t\tgetOctantIndex: function ( objectData ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tpositionObj,\n\t\t\t\tradiusObj,\n\t\t\t\tposition = this.position,\n\t\t\t\tradiusOverlap = this.radiusOverlap,\n\t\t\t\toverlap = this.overlap,\n\t\t\t\tdeltaX, deltaY, deltaZ,\n\t\t\t\tdistX, distY, distZ, \n\t\t\t\tdistance,\n\t\t\t\tindexOctant = 0;\n\t\t\t\n\t\t\t// handle type\n\t\t\t\n\t\t\tif ( objectData instanceof THREE.OctreeObjectData ) {\n\t\t\t\t\n\t\t\t\tradiusObj = objectData.radius;\n\t\t\t\t\n\t\t\t\tpositionObj = objectData.position;\n\t\t\t\t\n\t\t\t\t// update object data position last\n\t\t\t\t\n\t\t\t\tobjectData.positionLast.copy( positionObj );\n\t\t\t\t\n\t\t\t} else if ( objectData instanceof THREE.OctreeNode ) {\n\t\t\t\t\n\t\t\t\tpositionObj = objectData.position;\n\t\t\t\t\n\t\t\t\tradiusObj = 0;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// find delta and distance\n\t\t\t\n\t\t\tdeltaX = positionObj.x - position.x;\n\t\t\tdeltaY = positionObj.y - position.y;\n\t\t\tdeltaZ = positionObj.z - position.z;\n\t\t\t\n\t\t\tdistX = Math.abs( deltaX );\n\t\t\tdistY = Math.abs( deltaY );\n\t\t\tdistZ = Math.abs( deltaZ );\n\t\t\tdistance = Math.max( distX, distY, distZ );\n\t\t\t\n\t\t\t// if outside, use bitwise flags to indicate on which sides object is outside of\n\t\t\t\n\t\t\tif ( distance + radiusObj > radiusOverlap ) {\n\t\t\t\t\n\t\t\t\t// x\n\t\t\t\t\n\t\t\t\tif ( distX + radiusObj > radiusOverlap ) {\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = indexOctant ^ ( deltaX > 0 ? this.tree.FLAG_POS_X : this.tree.FLAG_NEG_X );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// y\n\t\t\t\t\n\t\t\t\tif ( distY + radiusObj > radiusOverlap ) {\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = indexOctant ^ ( deltaY > 0 ? this.tree.FLAG_POS_Y : this.tree.FLAG_NEG_Y );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// z\n\t\t\t\t\n\t\t\t\tif ( distZ + radiusObj > radiusOverlap ) {\n\t\t\t\t\t\n\t\t\t\t\tindexOctant = indexOctant ^ ( deltaZ > 0 ? this.tree.FLAG_POS_Z : this.tree.FLAG_NEG_Z );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tobjectData.indexOctant = -indexOctant - this.tree.INDEX_OUTSIDE_OFFSET;\n\t\t\t\t\n\t\t\t\treturn objectData.indexOctant;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// return octant index from delta xyz\n\t\t\t\n\t\t\tif ( deltaX - radiusObj > -overlap ) {\n\t\t\t\t\n\t\t\t\t// x right\n\t\t\t\t\n\t\t\t\tindexOctant = indexOctant | 1;\n\t\t\t\t\n\t\t\t} else if ( !( deltaX + radiusObj < overlap ) ) {\n\t\t\t\t\n\t\t\t\t// x left\n\t\t\t\t\n\t\t\t\tobjectData.indexOctant = this.tree.INDEX_INSIDE_CROSS;\n\t\t\t\treturn objectData.indexOctant;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif ( deltaY - radiusObj > -overlap ) {\n\t\t\t\t\n\t\t\t\t// y right\n\t\t\t\t\n\t\t\t\tindexOctant = indexOctant | 2;\n\t\t\t\t\n\t\t\t} else if ( !( deltaY + radiusObj < overlap ) ) {\n\t\t\t\t\n\t\t\t\t// y left\n\t\t\t\t\n\t\t\t\tobjectData.indexOctant = this.tree.INDEX_INSIDE_CROSS;\n\t\t\t\treturn objectData.indexOctant;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tif ( deltaZ - radiusObj > -overlap ) {\n\t\t\t\t\n\t\t\t\t// z right\n\t\t\t\t\n\t\t\t\tindexOctant = indexOctant | 4;\n\t\t\t\t\n\t\t\t} else if ( !( deltaZ + radiusObj < overlap ) ) {\n\t\t\t\t\n\t\t\t\t// z left\n\t\t\t\t\n\t\t\t\tobjectData.indexOctant = this.tree.INDEX_INSIDE_CROSS;\n\t\t\t\treturn objectData.indexOctant;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tobjectData.indexOctant = indexOctant;\n\t\t\treturn objectData.indexOctant;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetOctantIndexFromPosition: function ( x, y, z ) {\n\t\t\t\n\t\t\tvar indexOctant = 0;\n\t\t\t\n\t\t\tif ( x > 0 ) {\n\t\t\t\t\n\t\t\t\tindexOctant = indexOctant | 1;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif ( y > 0 ) {\n\t\t\t\t\n\t\t\t\tindexOctant = indexOctant | 2;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif ( z > 0 ) {\n\t\t\t\t\n\t\t\t\tindexOctant = indexOctant | 4;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn indexOctant;\n\t\t\t\n\t\t},\n\t\t\n\t\tsearch: function ( position, radius, objects, direction, directionPct ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode,\n\t\t\t\tintersects;\n\t\t\t\n\t\t\t// test intersects by parameters\n\t\t\t\n\t\t\tif ( direction ) {\n\t\t\t\t\n\t\t\t\tintersects = this.intersectRay( position, direction, radius, directionPct );\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tintersects = this.intersectSphere( position, radius );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// if intersects\n\t\t\t\n\t\t\tif ( intersects === true ) {\n\t\t\t\t\n\t\t\t\t// gather objects\n\t\t\t\t\n\t\t\t\tobjects = objects.concat( this.objects );\n\t\t\t\t\n\t\t\t\t// search subtree\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\t\n\t\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\t\t\t\t\t\n\t\t\t\t\tobjects = node.search( position, radius, objects, direction );\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn objects;\n\t\t\t\n\t\t},\n\t\t\n\t\tintersectSphere: function ( position, radius ) {\n\t\t\t\n\t\t\tvar\tdistance = radius * radius,\n\t\t\t\tpx = position.x,\n\t\t\t\tpy = position.y,\n\t\t\t\tpz = position.z;\n\t\t\t\n\t\t\tif ( px < this.left ) {\n\t\t\t\tdistance -= Math.pow( px - this.left, 2 );\n\t\t\t} else if ( px > this.right ) {\n\t\t\t\tdistance -= Math.pow( px - this.right, 2 );\n\t\t\t}\n\t\t\t\n\t\t\tif ( py < this.bottom ) {\n\t\t\t\tdistance -= Math.pow( py - this.bottom, 2 );\n\t\t\t} else if ( py > this.top ) {\n\t\t\t\tdistance -= Math.pow( py - this.top, 2 );\n\t\t\t}\n\t\t\t\n\t\t\tif ( pz < this.back ) {\n\t\t\t\tdistance -= Math.pow( pz - this.back, 2 );\n\t\t\t} else if ( pz > this.front ) {\n\t\t\t\tdistance -= Math.pow( pz - this.front, 2 );\n\t\t\t}\n\t\t\t\n\t\t\treturn distance >= 0;\n\t\t\t\n\t\t},\n\t\t\n\t\tintersectRay: function ( origin, direction, distance, directionPct ) {\n\t\t\t\n\t\t\tif ( typeof directionPct === 'undefined' ) {\n\t\t\t\t\n\t\t\t\tdirectionPct = this.utilVec31Ray.set( 1, 1, 1 ).divide( direction );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tvar t1 = ( this.left - origin.x ) * directionPct.x,\n\t\t\t\tt2 = ( this.right - origin.x ) * directionPct.x,\n\t\t\t\tt3 = ( this.bottom - origin.y ) * directionPct.y,\n\t\t\t\tt4 = ( this.top - origin.y ) * directionPct.y,\n\t\t\t\tt5 = ( this.back - origin.z ) * directionPct.z,\n\t\t\t\tt6 = ( this.front - origin.z ) * directionPct.z,\n\t\t\t\ttmax = Math.min( Math.min( Math.max( t1, t2), Math.max( t3, t4) ), Math.max( t5, t6) ),\n\t\t\t\ttmin;\n\n\t\t\t// ray would intersect in reverse direction, i.e. this is behind ray\n\t\t\tif (tmax < 0)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\ttmin = Math.max( Math.max( Math.min( t1, t2), Math.min( t3, t4)), Math.min( t5, t6));\n\t\t\t\n\t\t\t// if tmin > tmax or tmin > ray distance, ray doesn't intersect AABB\n\t\t\tif( tmin > tmax || tmin > distance ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetDepthEnd: function ( depth ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode;\n\n\t\t\tif ( this.nodesIndices.length > 0 ) {\n\t\t\t\t\n\t\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\n\t\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\n\t\t\t\t\tdepth = node.getDepthEnd( depth );\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\n\t\t\t\tdepth = !depth || this.depth > depth ? this.depth : depth;\n\n\t\t\t}\n\n\t\t\treturn depth;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetNodeCountEnd: function () {\n\t\t\t\n\t\t\treturn this.tree.root.getNodeCountRecursive() + 1;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetNodeCountRecursive: function () {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tcount = this.nodesIndices.length;\n\t\t\t\n\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tcount += this.nodesByIndex[ this.nodesIndices[ i ] ].getNodeCountRecursive();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn count;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetObjectsEnd: function ( objects ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode;\n\t\t\t\n\t\t\tobjects = ( objects || [] ).concat( this.objects );\n\t\t\t\n\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\t\t\t\t\n\t\t\t\tobjects = node.getObjectsEnd( objects );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn objects;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetObjectCountEnd: function () {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tcount = this.objects.length;\n\t\t\t\n\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tcount += this.nodesByIndex[ this.nodesIndices[ i ] ].getObjectCountEnd();\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn count;\n\t\t\t\n\t\t},\n\t\t\n\t\tgetObjectCountStart: function () {\n\t\t\t\n\t\t\tvar count = this.objects.length,\n\t\t\t\tparent = this.parent;\n\t\t\t\n\t\t\twhile( parent instanceof THREE.OctreeNode ) {\n\t\t\t\t\n\t\t\t\tcount += parent.objects.length;\n\t\t\t\tparent = parent.parent;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn count;\n\t\t\t\n\t\t},\n\t\t\n\t\ttoConsole: function ( space ) {\n\t\t\t\n\t\t\tvar i, l,\n\t\t\t\tnode,\n\t\t\t\tspaceAddition = ' ';\n\t\t\t\n\t\t\tspace = typeof space === 'string' ? space : spaceAddition;\n\t\t\t\n\t\t\tconsole.log( ( this.parent ? space + ' octree NODE > ' : ' octree ROOT > ' ), this, ' // id: ', this.id, ' // indexOctant: ', this.indexOctant, ' // position: ', this.position.x, this.position.y, this.position.z, ' // radius: ', this.radius, ' // depth: ', this.depth );\n\t\t\tconsole.log( ( this.parent ? space + ' ' : ' ' ), '+ objects ( ', this.objects.length, ' ) ', this.objects );\n\t\t\tconsole.log( ( this.parent ? space + ' ' : ' ' ), '+ children ( ', this.nodesIndices.length, ' )', this.nodesIndices, this.nodesByIndex );\n\t\t\t\n\t\t\tfor ( i = 0, l = this.nodesIndices.length; i < l; i++ ) {\n\t\t\t\t\n\t\t\t\tnode = this.nodesByIndex[ this.nodesIndices[ i ] ];\n\t\t\t\t\n\t\t\t\tnode.toConsole( space + spaceAddition );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t};\n\n\t/*===================================================\n\n\traycaster additional functionality\n\n\t=====================================================*/\n\t\n\tTHREE.Raycaster.prototype.intersectOctreeObject = function ( object, recursive ) {\n\t\t\n\t\tvar intersects,\n\t\t\toctreeObject,\n\t\t\tfacesAll,\n\t\t\tfacesSearch;\n\t\t\n\t\tif ( object.object instanceof THREE.Object3D ) {\n\t\t\t\n\t\t\toctreeObject = object;\n\t\t\tobject = octreeObject.object;\n\t\t\t\n\t\t\t// temporarily replace object geometry's faces with octree object faces\n\t\t\t\n\t\t\tfacesSearch = octreeObject.faces;\n\t\t\tfacesAll = object.geometry.faces;\n\t\t\t\n\t\t\tif ( facesSearch.length > 0 ) {\n\t\t\t\t\n\t\t\t\tobject.geometry.faces = facesSearch;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// intersect\n\t\t\t\n\t\t\tintersects = this.intersectObject( object, recursive );\n\t\t\t\n\t\t\t// revert object geometry's faces\n\t\t\t\n\t\t\tif ( facesSearch.length > 0 ) {\n\t\t\t\t\n\t\t\t\tobject.geometry.faces = facesAll;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t} else {\n\t\t\t\n\t\t\tintersects = this.intersectObject( object, recursive );\n\t\t\t\n\t\t}\n\t\t\n\t\treturn intersects;\n\t\t\n\t};\n\t\n\tTHREE.Raycaster.prototype.intersectOctreeObjects = function ( objects, recursive ) {\n\t\t\n\t\tvar i, il,\n\t\t\tintersects = [];\n\t\t\n\t\tfor ( i = 0, il = objects.length; i < il; i++ ) {\n\t\t\t\n\t\t\tintersects = intersects.concat( this.intersectOctreeObject( objects[ i ], recursive ) );\n\t\t\n\t\t}\n\t\t\n\t\treturn intersects;\n\t\t\n\t};\n\n}( THREE ) );"
},
"$:/plugins/rboue/Three.js/Lib/TypedArrayUtils.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/TypedArrayUtils.js",
"module-type": "library",
"text": "\nTHREE.TypedArrayUtils = {};\n\n/**\n * In-place quicksort for typed arrays (e.g. for Float32Array)\n * provides fast sorting\n * useful e.g. for a custom shader and/or BufferGeometry\n *\n * @author Roman Bolzern <roman.bolzern@fhnw.ch>, 2013\n * @author I4DS http://www.fhnw.ch/i4ds, 2013\n * @license MIT License <http://www.opensource.org/licenses/mit-license.php>\n *\n * Complexity: http://bigocheatsheet.com/ see Quicksort\n *\n * Example: \n * points: [x, y, z, x, y, z, x, y, z, ...]\n * eleSize: 3 //because of (x, y, z)\n * orderElement: 0 //order according to x\n */\n\nTHREE.TypedArrayUtils.quicksortIP = function ( arr, eleSize, orderElement ) {\n\n\tvar stack = [];\n\tvar sp = -1;\n\tvar left = 0;\n\tvar right = arr.length / eleSize - 1;\n\tvar tmp = 0.0, x = 0, y = 0;\n\n\tvar swapF = function ( a, b ) {\n\n\t\ta *= eleSize; b *= eleSize;\n\n\t\tfor ( y = 0; y < eleSize; y ++ ) {\n\n\t\t\ttmp = arr[ a + y ];\n\t\t\tarr[ a + y ]=arr[ b + y ];\n\t\t\tarr[ b + y ]=tmp;\n\n\t\t}\n\n\t};\n\t\n\tvar i, j, swap = new Float32Array( eleSize ), temp = new Float32Array( eleSize );\n\n\twhile ( true ) {\n\n\t\tif ( right - left <= 25 ) {\n\n\t\t\tfor ( j= left + 1; j <= right; j ++ ) {\n\n\t\t\t\tfor ( x = 0; x < eleSize; x ++ ) {\n\t\t\t\n\t\t\t\t\tswap[ x ] = arr[ j * eleSize + x ];\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ti = j - 1;\n\t\t\t\t\n\t\t\t\twhile ( i >= left && arr[ i * eleSize + orderElement ] > swap[orderElement ] ) {\n\n\t\t\t\t\tfor ( x = 0; x < eleSize; x ++ ) {\n\n\t\t\t\t\t\tarr[ ( i + 1 ) * eleSize + x ] = arr[ i * eleSize + x ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\ti --;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( x = 0; x < eleSize; x ++ ) {\n\n\t\t\t\t\tarr[ ( i + 1 ) * eleSize + x ] = swap[ x ];\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t\tif ( sp == -1 ) break;\n\n\t\t\tright = stack[ sp -- ]; //?\n\t\t\tleft = stack[ sp -- ];\n\n\t\t} else {\n\n\t\t\tvar median = ( left + right ) >> 1;\n\n\t\t\ti = left + 1;\n\t\t\tj = right;\n\t\n\t\t\tswapF( median, i );\n\n\t\t\tif ( arr[ left * eleSize + orderElement ] > arr[ right * eleSize + orderElement ] ) {\n\t\t\n\t\t\t\tswapF( left, right );\n\t\t\t\t\n\t\t\t}\n\n\t\t\tif ( arr[ i * eleSize + orderElement ] > arr[ right * eleSize + orderElement ] ) {\n\t\t\n\t\t\t\tswapF( i, right );\n\t\t\n\t\t\t}\n\n\t\t\tif ( arr[ left * eleSize + orderElement ] > arr[ i * eleSize + orderElement ] ) {\n\t\t\n\t\t\t\tswapF( left, i );\n\t\t\t\n\t\t\t}\n\n\t\t\tfor ( x = 0; x < eleSize; x ++ ) {\n\n\t\t\t\ttemp[ x ] = arr[ i * eleSize + x ];\n\n\t\t\t}\n\t\t\t\n\t\t\twhile ( true ) {\n\t\t\t\t\n\t\t\t\tdo i ++; while ( arr[ i * eleSize + orderElement ] < temp[ orderElement ] );\n\t\t\t\tdo j --; while ( arr[ j * eleSize + orderElement ] > temp[ orderElement ] );\n\t\t\t\t\n\t\t\t\tif ( j < i ) break;\n\t\t\n\t\t\t\tswapF( i, j );\n\t\t\t\n\t\t\t}\n\n\t\t\tfor ( x = 0; x < eleSize; x ++ ) {\n\n\t\t\t\tarr[ ( left + 1 ) * eleSize + x ] = arr[ j * eleSize + x ];\n\t\t\t\tarr[ j * eleSize + x ] = temp[ x ];\n\n\t\t\t}\n\n\t\t\tif ( right - i + 1 >= j - left ) {\n\n\t\t\t\tstack[ ++ sp ] = i;\n\t\t\t\tstack[ ++ sp ] = right;\n\t\t\t\tright = j - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstack[ ++ sp ] = left;\n\t\t\t\tstack[ ++ sp ] = j - 1;\n\t\t\t\tleft = i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn arr;\n\n};\n\n\n\n/**\n * k-d Tree for typed arrays (e.g. for Float32Array), in-place\n * provides fast nearest neighbour search\n * useful e.g. for a custom shader and/or BufferGeometry, saves tons of memory\n * has no insert and remove, only buildup and neares neighbour search\n *\n * Based on https://github.com/ubilabs/kd-tree-javascript by Ubilabs\n *\n * @author Roman Bolzern <roman.bolzern@fhnw.ch>, 2013\n * @author I4DS http://www.fhnw.ch/i4ds, 2013\n * @license MIT License <http://www.opensource.org/licenses/mit-license.php>\n *\n * Requires typed array quicksort\n *\n * Example: \n * points: [x, y, z, x, y, z, x, y, z, ...]\n * metric: function(a, b){\treturn Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2) + Math.pow(a[2] - b[2], 2); } //Manhatten distance\n * eleSize: 3 //because of (x, y, z)\n *\n * Further information (including mathematical properties)\n * http://en.wikipedia.org/wiki/Binary_tree\n * http://en.wikipedia.org/wiki/K-d_tree\n *\n * If you want to further minimize memory usage, remove Node.depth and replace in search algorithm with a traversal to root node (see comments at THREE.TypedArrayUtils.Kdtree.prototype.Node)\n */\n\n THREE.TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {\n\n\tvar self = this;\n\t\n\tvar maxDepth = 0;\n\t\n\tvar getPointSet = function ( points, pos ) {\n\n\t\treturn points.subarray( pos * eleSize, pos * eleSize + eleSize );\n\n\t};\n\t\t\n\tfunction buildTree( points, depth, parent, pos ) {\n\n\t\tvar dim = depth % eleSize,\n\t\t\tmedian,\n\t\t\tnode,\n\t\t\tplength = points.length / eleSize;\n\n\t\tif ( depth > maxDepth ) maxDepth = depth;\n\t\t\n\t\tif ( plength === 0 ) return null;\n\t\tif ( plength === 1 ) {\n\n\t\t\treturn new self.Node( getPointSet( points, 0 ), depth, parent, pos );\n\n\t\t}\n\n\t\tTHREE.TypedArrayUtils.quicksortIP( points, eleSize, dim );\n\t\t\n\t\tmedian = Math.floor( plength / 2 );\n\t\t\n\t\tnode = new self.Node( getPointSet( points, median ) , depth, parent, median + pos );\n\t\tnode.left = buildTree( points.subarray( 0, median * eleSize), depth + 1, node, pos );\n\t\tnode.right = buildTree( points.subarray( ( median + 1 ) * eleSize, points.length ), depth + 1, node, pos + median + 1 );\n\n\t\treturn node;\n\t\n\t}\n\n\tthis.root = buildTree( points, 0, null, 0 );\n\t\t\n\tthis.getMaxDepth = function () { return maxDepth; };\n\t\n\tthis.nearest = function ( point, maxNodes , maxDistance ) {\n\t\n\t\t /* point: array of size eleSize \n\t\t\tmaxNodes: max amount of nodes to return \n\t\t\tmaxDistance: maximum distance to point result nodes should have\n\t\t\tcondition (not implemented): function to test node before it's added to the result list, e.g. test for view frustum\n\t\t*/\n\n\t\tvar i,\n\t\t\tresult,\n\t\t\tbestNodes;\n\n\t\tbestNodes = new THREE.TypedArrayUtils.Kdtree.BinaryHeap(\n\n\t\t\tfunction ( e ) { return -e[ 1 ]; }\n\n\t\t);\n\n\t\tfunction nearestSearch( node ) {\n\n\t\t\tvar bestChild,\n\t\t\t\tdimension = node.depth % eleSize,\n\t\t\t\townDistance = metric(point, node.obj),\n\t\t\t\tlinearDistance = 0,\n\t\t\t\totherChild,\n\t\t\t\ti,\n\t\t\t\tlinearPoint = [];\n\n\t\t\tfunction saveNode( node, distance ) {\n\n\t\t\t\tbestNodes.push( [ node, distance ] );\n\n\t\t\t\tif ( bestNodes.size() > maxNodes ) {\n\n\t\t\t\t\tbestNodes.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < eleSize; i += 1 ) {\n\n\t\t\t\tif ( i === node.depth % eleSize ) {\n\n\t\t\t\t\tlinearPoint[ i ] = point[ i ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlinearPoint[ i ] = node.obj[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlinearDistance = metric( linearPoint, node.obj );\n\n\t\t\t// if it's a leaf\n\n\t\t\tif ( node.right === null && node.left === null ) {\n\n\t\t\t\tif ( bestNodes.size() < maxNodes || ownDistance < bestNodes.peek()[ 1 ] ) {\n\n\t\t\t\t\tsaveNode( node, ownDistance );\n\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( node.right === null ) {\n\n\t\t\t\tbestChild = node.left;\n\n\t\t\t} else if ( node.left === null ) {\n\n\t\t\t\tbestChild = node.right;\n\n\t\t\t} else {\n\n\t\t\t\tif ( point[ dimension ] < node.obj[ dimension ] ) {\n\n\t\t\t\t\tbestChild = node.left;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbestChild = node.right;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// recursive search\n\n\t\t\tnearestSearch( bestChild );\n\n\t\t\tif ( bestNodes.size() < maxNodes || ownDistance < bestNodes.peek()[ 1 ] ) {\n\n\t\t\t\tsaveNode( node, ownDistance );\n\n\t\t\t}\n\n\t\t\t// if there's still room or the current distance is nearer than the best distance\n\n\t\t\tif ( bestNodes.size() < maxNodes || Math.abs(linearDistance) < bestNodes.peek()[ 1 ] ) {\n\n\t\t\t\tif ( bestChild === node.left ) {\n\n\t\t\t\t\totherChild = node.right;\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherChild = node.left;\n\n\t\t\t\t}\n\n\t\t\t\tif ( otherChild !== null ) {\n\n\t\t\t\t\tnearestSearch( otherChild );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( maxDistance ) {\n\n\t\t\tfor ( i = 0; i < maxNodes; i += 1 ) {\n\n\t\t\t\tbestNodes.push( [ null, maxDistance ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tnearestSearch( self.root );\n\n\t\tresult = [];\n\n\t\tfor ( i = 0; i < maxNodes; i += 1 ) {\n\n\t\t\tif ( bestNodes.content[ i ][ 0 ] ) {\n\n\t\t\t\tresult.push( [ bestNodes.content[ i ][ 0 ], bestNodes.content[ i ][ 1 ] ] );\n\n\t\t\t}\n\n\t\t}\n\t\t\n\t\treturn result;\n\t\n\t};\n\t\n};\n\n/**\n * If you need to free up additional memory and agree with an additional O( log n ) traversal time you can get rid of \"depth\" and \"pos\" in Node:\n * Depth can be easily done by adding 1 for every parent (care: root node has depth 0, not 1)\n * Pos is a bit tricky: Assuming the tree is balanced (which is the case when after we built it up), perform the following steps:\n * By traversing to the root store the path e.g. in a bit pattern (01001011, 0 is left, 1 is right)\n * From buildTree we know that \"median = Math.floor( plength / 2 );\", therefore for each bit...\n * 0: amountOfNodesRelevantForUs = Math.floor( (pamountOfNodesRelevantForUs - 1) / 2 );\n * 1: amountOfNodesRelevantForUs = Math.ceil( (pamountOfNodesRelevantForUs - 1) / 2 );\n * pos += Math.floor( (pamountOfNodesRelevantForUs - 1) / 2 );\n * when recursion done, we still need to add all left children of target node:\n * pos += Math.floor( (pamountOfNodesRelevantForUs - 1) / 2 );\n * and I think you need to +1 for the current position, not sure.. depends, try it out ^^\n *\n * I experienced that for 200'000 nodes you can get rid of 4 MB memory each, leading to 8 MB memory saved.\n */\nTHREE.TypedArrayUtils.Kdtree.prototype.Node = function ( obj, depth, parent, pos ) {\n\n\tthis.obj = obj;\n\tthis.left = null;\n\tthis.right = null;\n\tthis.parent = parent;\n\tthis.depth = depth;\n\tthis.pos = pos;\n\n}; \n\n/**\n * Binary heap implementation\n * @author http://eloquentjavascript.net/appendix2.htm\n */\n\nTHREE.TypedArrayUtils.Kdtree.BinaryHeap = function ( scoreFunction ) {\n\n\tthis.content = [];\n\tthis.scoreFunction = scoreFunction;\n\n};\n\nTHREE.TypedArrayUtils.Kdtree.BinaryHeap.prototype = {\n\n\tpush: function ( element ) {\n\n\t\t// Add the new element to the end of the array.\n\t\tthis.content.push( element );\n\n\t\t// Allow it to bubble up.\n\t\tthis.bubbleUp( this.content.length - 1 );\n\n\t},\n\n\tpop: function () {\n\n\t\t// Store the first element so we can return it later.\n\t\tvar result = this.content[ 0 ];\n\n\t\t// Get the element at the end of the array.\n\t\tvar end = this.content.pop();\n\n\t\t// If there are any elements left, put the end element at the\n\t\t// start, and let it sink down.\n\t\tif ( this.content.length > 0 ) {\n\n\t\t\tthis.content[ 0 ] = end;\n\t\t\tthis.sinkDown( 0 );\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\tpeek: function () {\n\n\t\treturn this.content[ 0 ];\n\n\t},\n\n\tremove: function ( node ) {\n\n\t\tvar len = this.content.length;\n\n\t\t// To remove a value, we must search through the array to find it.\n\t\tfor ( var i = 0; i < len; i ++ ) {\n\n\t\t\tif ( this.content[ i ] == node ) {\n\n\t\t\t\t// When it is found, the process seen in 'pop' is repeated\n\t\t\t\t// to fill up the hole.\n\t\t\t\tvar end = this.content.pop();\n\n\t\t\t\tif ( i != len - 1 ) {\n\n\t\t\t\t\tthis.content[ i ] = end;\n\n\t\t\t\t\tif ( this.scoreFunction( end ) < this.scoreFunction( node ) ) {\n\n\t\t\t\t\t\tthis.bubbleUp( i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.sinkDown( i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthrow new Error( \"Node not found.\" );\n\n\t},\n\n\tsize: function () {\n\n\t\treturn this.content.length;\n\n\t},\n\n\tbubbleUp: function ( n ) {\n\n\t\t// Fetch the element that has to be moved.\n\t\tvar element = this.content[ n ];\n\n\t\t// When at 0, an element can not go up any further.\n\t\twhile ( n > 0 ) {\n\n\t\t\t// Compute the parent element's index, and fetch it.\n\t\t\tvar parentN = Math.floor( ( n + 1 ) / 2 ) - 1,\n\t\t\t\tparent = this.content[ parentN ];\n\n\t\t\t// Swap the elements if the parent is greater.\n\t\t\tif ( this.scoreFunction( element ) < this.scoreFunction( parent ) ) {\n\n\t\t\t\tthis.content[ parentN ] = element;\n\t\t\t\tthis.content[ n ] = parent;\n\n\t\t\t\t// Update 'n' to continue at the new position.\n\t\t\t\tn = parentN;\n\n\t\t\t} else {\n\n\t\t\t\t// Found a parent that is less, no need to move it further.\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tsinkDown: function ( n ) {\n\n\t\t// Look up the target element and its score.\n\t\tvar length = this.content.length,\n\t\t\telement = this.content[ n ],\n\t\t\telemScore = this.scoreFunction( element );\n\n\t\twhile ( true ) {\n\n\t\t\t// Compute the indices of the child elements.\n\t\t\tvar child2N = ( n + 1 ) * 2, child1N = child2N - 1;\n\n\t\t\t// This is used to store the new position of the element, if any.\n\t\t\tvar swap = null;\n\n\t\t\t// If the first child exists (is inside the array)...\n\t\t\tif ( child1N < length ) {\n\n\t\t\t\t// Look it up and compute its score.\n\t\t\t\tvar child1 = this.content[ child1N ],\n\t\t\t\t\tchild1Score = this.scoreFunction( child1 );\n\n\t\t\t\t// If the score is less than our element's, we need to swap.\n\t\t\t\tif ( child1Score < elemScore ) swap = child1N;\n\n\t\t\t}\n\n\t\t\t// Do the same checks for the other child.\n\t\t\tif ( child2N < length ) {\n\n\t\t\t\tvar child2 = this.content[ child2N ],\n\t\t\t\t\tchild2Score = this.scoreFunction( child2 );\n\n\t\t\t\tif ( child2Score < ( swap === null ? elemScore : child1Score ) ) swap = child2N;\n\n\t\t\t}\n\n\t\t\t// If the element needs to be moved, swap it, and continue.\n\t\t\tif ( swap !== null ) {\n\n\t\t\t\tthis.content[ n ] = this.content[ swap ];\n\t\t\t\tthis.content[ swap ] = element;\n\t\t\t\tn = swap;\n\n\t\t\t} else {\n\n\t\t\t\t// Otherwise, we are done.\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/Mirror.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Mirror.js",
"module-type": "library",
"text": "/**\r\n * @author Slayvin / http://slayvin.net\r\n */\r\n\r\nTHREE.ShaderLib['mirror'] = {\r\n\r\n\tuniforms: { \"mirrorColor\": { type: \"c\", value: new THREE.Color(0x7F7F7F) },\r\n\t\t\t\t\"mirrorSampler\": { type: \"t\", value: null },\r\n\t\t\t\t\"textureMatrix\" : { type: \"m4\", value: new THREE.Matrix4() }\r\n\t},\r\n\r\n\tvertexShader: [\r\n\r\n\t\t\"uniform mat4 textureMatrix;\",\r\n\r\n\t\t\"varying vec4 mirrorCoord;\",\r\n\r\n\t\t\"void main() {\",\r\n\r\n\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\r\n\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\r\n\t\t\t\"mirrorCoord = textureMatrix * worldPosition;\",\r\n\r\n\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\r\n\r\n\t\t\"}\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tfragmentShader: [\r\n\r\n\t\t\"uniform vec3 mirrorColor;\",\r\n\t\t\"uniform sampler2D mirrorSampler;\",\r\n\r\n\t\t\"varying vec4 mirrorCoord;\",\r\n\r\n\t\t\"float blendOverlay(float base, float blend) {\",\r\n\t\t\t\"return( base < 0.5 ? ( 2.0 * base * blend ) : (1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\",\r\n\t\t\"}\",\r\n\t\t\r\n\t\t\"void main() {\",\r\n\r\n\t\t\t\"vec4 color = texture2DProj(mirrorSampler, mirrorCoord);\",\r\n\t\t\t\"color = vec4(blendOverlay(mirrorColor.r, color.r), blendOverlay(mirrorColor.g, color.g), blendOverlay(mirrorColor.b, color.b), 1.0);\",\r\n\r\n\t\t\t\"gl_FragColor = color;\",\r\n\r\n\t\t\"}\"\r\n\r\n\t].join(\"\\n\")\r\n\r\n};\r\n\r\nTHREE.Mirror = function ( renderer, camera, options ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.name = 'mirror_' + this.id;\r\n\r\n\toptions = options || {};\r\n\r\n\tthis.matrixNeedsUpdate = true;\r\n\r\n\tvar width = options.textureWidth !== undefined ? options.textureWidth : 512;\r\n\tvar height = options.textureHeight !== undefined ? options.textureHeight : 512;\r\n\r\n\tthis.clipBias = options.clipBias !== undefined ? options.clipBias : 0.0;\r\n\r\n\tvar mirrorColor = options.color !== undefined ? new THREE.Color(options.color) : new THREE.Color(0x7F7F7F);\r\n\r\n\tthis.renderer = renderer;\r\n\tthis.mirrorPlane = new THREE.Plane();\r\n\tthis.normal = new THREE.Vector3( 0, 0, 1 );\r\n\tthis.mirrorWorldPosition = new THREE.Vector3();\r\n\tthis.cameraWorldPosition = new THREE.Vector3();\r\n\tthis.rotationMatrix = new THREE.Matrix4();\r\n\tthis.lookAtPosition = new THREE.Vector3(0, 0, -1);\r\n\tthis.clipPlane = new THREE.Vector4();\r\n\t\r\n\t// For debug only, show the normal and plane of the mirror\r\n\tvar debugMode = options.debugMode !== undefined ? options.debugMode : false;\r\n\r\n\tif ( debugMode ) {\r\n\r\n\t\tvar arrow = new THREE.ArrowHelper(new THREE.Vector3( 0, 0, 1 ), new THREE.Vector3( 0, 0, 0 ), 10, 0xffff80 );\r\n\t\tvar planeGeometry = new THREE.Geometry();\r\n\t\tplaneGeometry.vertices.push( new THREE.Vector3( -10, -10, 0 ) );\r\n\t\tplaneGeometry.vertices.push( new THREE.Vector3( 10, -10, 0 ) );\r\n\t\tplaneGeometry.vertices.push( new THREE.Vector3( 10, 10, 0 ) );\r\n\t\tplaneGeometry.vertices.push( new THREE.Vector3( -10, 10, 0 ) );\r\n\t\tplaneGeometry.vertices.push( planeGeometry.vertices[0] );\r\n\t\tvar plane = new THREE.Line( planeGeometry, new THREE.LineBasicMaterial( { color: 0xffff80 } ) );\r\n\r\n\t\tthis.add(arrow);\r\n\t\tthis.add(plane);\r\n\r\n\t}\r\n\r\n\tif ( camera instanceof THREE.PerspectiveCamera ) {\r\n\r\n\t\tthis.camera = camera;\r\n\r\n\t} else {\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera();\r\n\t\tconsole.log( this.name + ': camera is not a Perspective Camera!' );\r\n\r\n\t}\r\n\r\n\tthis.textureMatrix = new THREE.Matrix4();\r\n\r\n\tthis.mirrorCamera = this.camera.clone();\r\n\r\n\tthis.texture = new THREE.WebGLRenderTarget( width, height );\r\n\tthis.tempTexture = new THREE.WebGLRenderTarget( width, height );\r\n\r\n\tvar mirrorShader = THREE.ShaderLib[ \"mirror\" ];\r\n\tvar mirrorUniforms = THREE.UniformsUtils.clone( mirrorShader.uniforms );\r\n\r\n\tthis.material = new THREE.ShaderMaterial( {\r\n\r\n\t\tfragmentShader: mirrorShader.fragmentShader,\r\n\t\tvertexShader: mirrorShader.vertexShader,\r\n\t\tuniforms: mirrorUniforms\r\n\r\n\t} );\r\n\r\n\tthis.material.uniforms.mirrorSampler.value = this.texture;\r\n\tthis.material.uniforms.mirrorColor.value = mirrorColor;\r\n\tthis.material.uniforms.textureMatrix.value = this.textureMatrix;\r\n\r\n\tif ( !THREE.Math.isPowerOfTwo(width) || !THREE.Math.isPowerOfTwo( height ) ) {\r\n\r\n\t\tthis.texture.generateMipmaps = false;\r\n\t\tthis.tempTexture.generateMipmaps = false;\r\n\r\n\t}\r\n\r\n\tthis.updateTextureMatrix();\r\n\tthis.render();\r\n\r\n};\r\n\r\nTHREE.Mirror.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Mirror.prototype.renderWithMirror = function ( otherMirror ) {\r\n\r\n\t// update the mirror matrix to mirror the current view\r\n\tthis.updateTextureMatrix();\r\n\tthis.matrixNeedsUpdate = false;\r\n\r\n\t// set the camera of the other mirror so the mirrored view is the reference view\r\n\tvar tempCamera = otherMirror.camera;\r\n\totherMirror.camera = this.mirrorCamera;\r\n\r\n\t// render the other mirror in temp texture\r\n\totherMirror.renderTemp();\r\n\totherMirror.material.uniforms.mirrorSampler.value = otherMirror.tempTexture;\r\n\r\n\t// render the current mirror\r\n\tthis.render();\r\n\tthis.matrixNeedsUpdate = true;\r\n\r\n\t// restore material and camera of other mirror\r\n\totherMirror.material.uniforms.mirrorSampler.value = otherMirror.texture;\r\n\totherMirror.camera = tempCamera;\r\n\r\n\t// restore texture matrix of other mirror\r\n\totherMirror.updateTextureMatrix();\r\n};\r\n\r\nTHREE.Mirror.prototype.updateTextureMatrix = function () {\r\n\r\n\tvar sign = THREE.Math.sign;\r\n\r\n\tthis.updateMatrixWorld();\r\n\tthis.camera.updateMatrixWorld();\r\n\r\n\tthis.mirrorWorldPosition.setFromMatrixPosition( this.matrixWorld );\r\n\tthis.cameraWorldPosition.setFromMatrixPosition( this.camera.matrixWorld );\r\n\r\n\tthis.rotationMatrix.extractRotation( this.matrixWorld );\r\n\r\n\tthis.normal.set( 0, 0, 1 );\r\n\tthis.normal.applyMatrix4( this.rotationMatrix );\r\n\r\n\tvar view = this.mirrorWorldPosition.clone().sub( this.cameraWorldPosition );\r\n\tview.reflect( this.normal ).negate();\r\n\tview.add( this.mirrorWorldPosition );\r\n\r\n\tthis.rotationMatrix.extractRotation( this.camera.matrixWorld );\r\n\r\n\tthis.lookAtPosition.set(0, 0, -1);\r\n\tthis.lookAtPosition.applyMatrix4( this.rotationMatrix );\r\n\tthis.lookAtPosition.add( this.cameraWorldPosition );\r\n\r\n\tvar target = this.mirrorWorldPosition.clone().sub( this.lookAtPosition );\r\n\ttarget.reflect( this.normal ).negate();\r\n\ttarget.add( this.mirrorWorldPosition );\r\n\r\n\tthis.up.set( 0, -1, 0 );\r\n\tthis.up.applyMatrix4( this.rotationMatrix );\r\n\tthis.up.reflect( this.normal ).negate();\r\n\r\n\tthis.mirrorCamera.position.copy( view );\r\n\tthis.mirrorCamera.up = this.up;\r\n\tthis.mirrorCamera.lookAt( target );\r\n\r\n\tthis.mirrorCamera.updateProjectionMatrix();\r\n\tthis.mirrorCamera.updateMatrixWorld();\r\n\tthis.mirrorCamera.matrixWorldInverse.getInverse( this.mirrorCamera.matrixWorld );\r\n\r\n\t// Update the texture matrix\r\n\tthis.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,\r\n\t\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\r\n\t\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\r\n\t\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0 );\r\n\tthis.textureMatrix.multiply( this.mirrorCamera.projectionMatrix );\r\n\tthis.textureMatrix.multiply( this.mirrorCamera.matrixWorldInverse );\r\n\r\n\t// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\r\n\t// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\r\n\tthis.mirrorPlane.setFromNormalAndCoplanarPoint( this.normal, this.mirrorWorldPosition );\r\n\tthis.mirrorPlane.applyMatrix4( this.mirrorCamera.matrixWorldInverse );\r\n\r\n\tthis.clipPlane.set( this.mirrorPlane.normal.x, this.mirrorPlane.normal.y, this.mirrorPlane.normal.z, this.mirrorPlane.constant );\r\n\r\n\tvar q = new THREE.Vector4();\r\n\tvar projectionMatrix = this.mirrorCamera.projectionMatrix;\r\n\r\n\tq.x = ( sign(this.clipPlane.x) + projectionMatrix.elements[8] ) / projectionMatrix.elements[0];\r\n\tq.y = ( sign(this.clipPlane.y) + projectionMatrix.elements[9] ) / projectionMatrix.elements[5];\r\n\tq.z = - 1.0;\r\n\tq.w = ( 1.0 + projectionMatrix.elements[10] ) / projectionMatrix.elements[14];\r\n\r\n\t// Calculate the scaled plane vector\r\n\tvar c = new THREE.Vector4();\r\n\tc = this.clipPlane.multiplyScalar( 2.0 / this.clipPlane.dot(q) );\r\n\r\n\t// Replacing the third row of the projection matrix\r\n\tprojectionMatrix.elements[2] = c.x;\r\n\tprojectionMatrix.elements[6] = c.y;\r\n\tprojectionMatrix.elements[10] = c.z + 1.0 - this.clipBias;\r\n\tprojectionMatrix.elements[14] = c.w;\r\n\r\n};\r\n\r\nTHREE.Mirror.prototype.render = function () {\r\n\r\n\tif ( this.matrixNeedsUpdate ) this.updateTextureMatrix();\r\n\r\n\tthis.matrixNeedsUpdate = true;\r\n\r\n\t// Render the mirrored view of the current scene into the target texture\r\n\tvar scene = this;\r\n\r\n\twhile ( scene.parent !== undefined ) {\r\n\r\n\t\tscene = scene.parent;\r\n\r\n\t}\r\n\r\n\tif ( scene !== undefined && scene instanceof THREE.Scene) {\r\n\r\n\t\tthis.renderer.render( scene, this.mirrorCamera, this.texture, true );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Mirror.prototype.renderTemp = function () {\r\n\r\n\tif ( this.matrixNeedsUpdate ) this.updateTextureMatrix();\r\n\r\n\tthis.matrixNeedsUpdate = true;\r\n\r\n\t// Render the mirrored view of the current scene into the target texture\r\n\tvar scene = this;\r\n\r\n\twhile ( scene.parent !== undefined ) {\r\n\r\n\t\tscene = scene.parent;\r\n\r\n\t}\r\n\r\n\tif ( scene !== undefined && scene instanceof THREE.Scene) {\r\n\r\n\t\tthis.renderer.render( scene, this.mirrorCamera, this.tempTexture, true );\r\n\r\n\t}\r\n\r\n};\r\n"
},
"$:/plugins/rboue/Three.js/Lib/Sparks.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Sparks.js",
"module-type": "library",
"text": "/*\n * @author zz85 (http://github.com/zz85 http://www.lab4games.net/zz85/blog)\n *\n * a simple to use javascript 3d particles system inspired by FliNT and Stardust\n * created with TWEEN.js and THREE.js\n *\n * for feature requests or bugs, please visit https://github.com/zz85/sparks.js\n *\n * licensed under the MIT license\n */\n\nvar SPARKS = {};\n\n/********************************\n* Emitter Class\n*\n* Creates and Manages Particles\n*********************************/\n\nSPARKS.Emitter = function (counter) {\n\n this._counter = counter ? counter : new SPARKS.SteadyCounter(10); // provides number of particles to produce\n\n this._particles = [];\n\n\n this._initializers = []; // use for creation of particles\n this._actions = []; // uses action to update particles\n this._activities = []; // not supported yet\n\n this._handlers = [];\n\n this.callbacks = {};\n};\n\n\nSPARKS.Emitter.prototype = {\n\n\t_TIMESTEP: 15,\n\t_timer: null,\n\t_lastTime: null,\n\t_timerStep: 10,\n\t_velocityVerlet: true,\n\n\t// run its built in timer / stepping\n\tstart: function() {\n\t\tthis._lastTime = Date.now();\n\t\tthis._timer = setTimeout(this.step, this._timerStep, this);\n\t\tthis._isRunning = true;\n\t},\n\n\tstop: function() {\n\t\tthis._isRunning = false;\n\t\tclearTimeout(this._timer);\n\t},\n\n\tisRunning: function() {\n\t\treturn this._isRunning & true;\n\t},\n\n\t// Step gets called upon by the engine\n\t// but attempts to call update() on a regular basics\n\t// This method is also described in http://gameclosure.com/2011/04/11/deterministic-delta-tee-in-js-games/\n\tstep: function(emitter) {\n\n\t\tvar time = Date.now();\n\t\tvar elapsed = time - emitter._lastTime;\n\n\t\tif (!this._velocityVerlet) {\n\t\t\t// if elapsed is way higher than time step, (usually after switching tabs, or excution cached in ff)\n\t\t\t// we will drop cycles. perhaps set to a limit of 10 or something?\n\t\t\tvar maxBlock = emitter._TIMESTEP * 20;\n\n\t\t\tif (elapsed >= maxBlock) {\n\t\t\t\t//console.log('warning: sparks.js is fast fowarding engine, skipping steps', elapsed / emitter._TIMESTEP);\n\t\t\t\t//emitter.update( (elapsed - maxBlock) / 1000);\n\t\t\t\telapsed = maxBlock;\n\t\t\t}\n\n\t\t\twhile(elapsed >= emitter._TIMESTEP) {\n\t\t\t\temitter.update(emitter._TIMESTEP / 1000);\n\t\t\t\telapsed -= emitter._TIMESTEP;\n\t\t\t}\n\t\t\temitter._lastTime = time - elapsed;\n\n\t\t} else {\n\t\t\temitter.update(elapsed/1000);\n\t\t\temitter._lastTime = time;\n\t\t}\n\n\n\n\t\tif (emitter._isRunning)\n\t\tsetTimeout(emitter.step, emitter._timerStep, emitter);\n\n\t},\n\n\n\t// Update particle engine in seconds, not milliseconds\n update: function(time) {\n\n\t\tvar i, j;\n var len = this._counter.updateEmitter( this, time );\n\n // Create particles\n for( i = 0; i < len; i++ ) {\n this.createParticle();\n }\n\n // Update activities\n len = this._activities.length;\n for ( i = 0; i < len; i++ )\n {\n this._activities[i].update( this, time );\n }\n\n\n len = this._actions.length;\n\n\t\tvar particle;\n\t\tvar action;\n var len2 = this._particles.length;\n\n for( j = 0; j < len; j++ )\n {\n action = this._actions[j];\n for ( i = 0; i < len2; ++i )\n {\n particle = this._particles[i];\n action.update( this, particle, time );\n }\n }\n\n\n // remove dead particles\n for ( i = len2; i--; )\n {\n particle = this._particles[i];\n if ( particle.isDead )\n {\n //particle =\n\t\t\t\tthis._particles.splice( i, 1 );\n this.dispatchEvent(\"dead\", particle);\n\t\t\t\tSPARKS.VectorPool.release(particle.position); //\n\t\t\t\tSPARKS.VectorPool.release(particle.velocity);\n\n } else {\n this.dispatchEvent(\"updated\", particle);\n }\n }\n\n\t\tthis.dispatchEvent(\"loopUpdated\");\n\n },\n\n createParticle: function() {\n var particle = new SPARKS.Particle();\n // In future, use a Particle Factory\n var len = this._initializers.length, i;\n\n for ( i = 0; i < len; i++ ) {\n this._initializers[i].initialize( this, particle );\n }\n\n this._particles.push( particle );\n\n this.dispatchEvent(\"created\", particle); // ParticleCreated\n\n return particle;\n },\n\n addInitializer: function (initializer) {\n this._initializers.push(initializer);\n },\n\n addAction: function (action) {\n this._actions.push(action);\n },\n\n removeInitializer: function (initializer) {\n\t\tvar index = this._initializers.indexOf(initializer);\n\t\tif (index > -1) {\n\t\t\tthis._initializers.splice( index, 1 );\n\t\t}\n },\n\n removeAction: function (action) {\n\t\tvar index = this._actions.indexOf(action);\n\t\tif (index > -1) {\n\t\t\tthis._actions.splice( index, 1 );\n\t\t}\n\t\t//console.log('removeAction', index, this._actions);\n },\n\n addCallback: function(name, callback) {\n this.callbacks[name] = callback;\n },\n\n dispatchEvent: function(name, args) {\n var callback = this.callbacks[name];\n if (callback) {\n callback(args);\n }\n\n }\n\n\n};\n\n\n/*\n * Constant Names for\n * Events called by emitter.dispatchEvent()\n *\n */\nSPARKS.EVENT_PARTICLE_CREATED = \"created\"\nSPARKS.EVENT_PARTICLE_UPDATED = \"updated\"\nSPARKS.EVENT_PARTICLE_DEAD = \"dead\";\nSPARKS.EVENT_LOOP_UPDATED = \"loopUpdated\";\n\n\n\n/*\n * Steady Counter attempts to produces a particle rate steadily\n *\n */\n\n// Number of particles per seconds\nSPARKS.SteadyCounter = function(rate) {\n this.rate = rate;\n\n\t// we use a shortfall counter to make up for slow emitters\n\tthis.leftover = 0;\n\n};\n\nSPARKS.SteadyCounter.prototype.updateEmitter = function(emitter, time) {\n\n\tvar targetRelease = time * this.rate + this.leftover;\n\tvar actualRelease = Math.floor(targetRelease);\n\n\tthis.leftover = targetRelease - actualRelease;\n\n\treturn actualRelease;\n};\n\n\n/*\n * Shot Counter produces specified particles\n * on a single impluse or burst\n */\n\nSPARKS.ShotCounter = function(particles) {\n\tthis.particles = particles;\n\tthis.used = false;\n};\n\nSPARKS.ShotCounter.prototype.updateEmitter = function(emitter, time) {\n\n\tif (this.used) {\n\t\treturn 0;\n\t} else {\n\t\tthis.used = true;\n\t}\n\n\treturn this.particles;\n};\n\n\n/********************************\n* Particle Class\n*\n* Represents a single particle\n*********************************/\nSPARKS.Particle = function() {\n\n /**\n * The lifetime of the particle, in seconds.\n */\n this.lifetime = 0;\n\n /**\n * The age of the particle, in seconds.\n */\n this.age = 0;\n\n /**\n * The energy of the particle.\n */\n this.energy = 1;\n\n /**\n * Whether the particle is dead and should be removed from the stage.\n */\n this.isDead = false;\n\n this.target = null; // tag\n\n /**\n * For 3D\n */\n\n this.position = SPARKS.VectorPool.get().set(0,0,0); //new THREE.Vector3( 0, 0, 0 );\n this.velocity = SPARKS.VectorPool.get().set(0,0,0); //new THREE.Vector3( 0, 0, 0 );\n\tthis._oldvelocity = SPARKS.VectorPool.get().set(0,0,0);\n // rotation vec3\n // angVelocity vec3\n // faceAxis vec3\n\n};\n\n\n/********************************\n* Action Classes\n*\n* An abstract class which have\n* update function\n*********************************/\nSPARKS.Action = function() {\n this._priority = 0;\n};\n\n\nSPARKS.Age = function(easing) {\n this._easing = (easing == null) ? TWEEN.Easing.Linear.None : easing;\n};\n\nSPARKS.Age.prototype.update = function (emitter, particle, time) {\n particle.age += time;\n if( particle.age >= particle.lifetime )\n {\n particle.energy = 0;\n particle.isDead = true;\n }\n else\n {\n var t = this._easing(particle.age / particle.lifetime);\n particle.energy = -1 * t + 1;\n }\n};\n\n/*\n// Mark particle as dead when particle's < 0\n\nSPARKS.Death = function(easing) {\n this._easing = (easing == null) ? TWEEN.Linear.None : easing;\n};\n\nSPARKS.Death.prototype.update = function (emitter, particle, time) {\n if (particle.life <= 0) {\n particle.isDead = true;\n }\n};\n*/\n\n\nSPARKS.Move = function() {\n\n};\n\nSPARKS.Move.prototype.update = function(emitter, particle, time) {\n // attempt verlet velocity updating.\n var p = particle.position;\n\tvar v = particle.velocity;\n var old = particle._oldvelocity;\n\n\tif (this._velocityVerlet) {\n\t\tp.x += (v.x + old.x) * 0.5 * time;\n\t\tp.y += (v.y + old.y) * 0.5 * time;\n\t\tp.z += (v.z + old.z) * 0.5 * time;\n\t} else {\n\t\tp.x += v.x * time;\n\t\tp.y += v.y * time;\n\t\tp.z += v.z * time;\n\t}\n\n // OldVel = Vel;\n // Vel = Vel + Accel * dt;\n // Pos = Pos + (vel + Vel + Accel * dt) * 0.5 * dt;\n\n\n\n};\n\n/* Marks particles found in specified zone dead */\nSPARKS.DeathZone = function(zone) {\n this.zone = zone;\n};\n\nSPARKS.DeathZone.prototype.update = function(emitter, particle, time) {\n\n if (this.zone.contains(particle.position)) {\n\t\tparticle.isDead = true;\n\t}\n\n};\n\n/*\n * SPARKS.ActionZone applies an action when particle is found in zone\n */\nSPARKS.ActionZone = function(action, zone) {\n\tthis.action = action;\n this.zone = zone;\n};\n\nSPARKS.ActionZone.prototype.update = function(emitter, particle, time) {\n\n if (this.zone.contains(particle.position)) {\n\t\tthis.action.update( emitter, particle, time );\n\t}\n\n};\n\n/*\n * Accelerate action affects velocity in specified 3d direction\n */\nSPARKS.Accelerate = function(x,y,z) {\n\n\tif (x instanceof THREE.Vector3) {\n\t\tthis.acceleration = x;\n\t\treturn;\n\t}\n\n this.acceleration = new THREE.Vector3(x,y,z);\n\n};\n\nSPARKS.Accelerate.prototype.update = function(emitter, particle, time) {\n var acc = this.acceleration;\n\n var v = particle.velocity;\n\n\tparticle._oldvelocity.set(v.x, v.y, v.z);\n\n v.x += acc.x * time;\n v.y += acc.y * time;\n v.z += acc.z * time;\n\n};\n\n/*\n * Accelerate Factor accelerate based on a factor of particle's velocity.\n */\nSPARKS.AccelerateFactor = function(factor) {\n this.factor = factor;\n};\n\nSPARKS.AccelerateFactor.prototype.update = function(emitter, particle, time) {\n var factor = this.factor;\n\n var v = particle.velocity;\n\tvar len = v.length();\n\tvar adjFactor;\n if (len>0) {\n\n\t\tadjFactor = factor * time / len;\n\t\tadjFactor += 1;\n\n\t\tv.multiplyScalar(adjFactor);\n\t\t// v.x *= adjFactor;\n\t\t// \t v.y *= adjFactor;\n\t\t// \t v.z *= adjFactor;\n\t}\n\n};\n\n/*\nAccelerateNormal\n * AccelerateVelocity affects velocity based on its velocity direction\n */\nSPARKS.AccelerateVelocity = function(factor) {\n\n\tthis.factor = factor;\n\n};\n\nSPARKS.AccelerateVelocity.prototype.update = function(emitter, particle, time) {\n var factor = this.factor;\n\n var v = particle.velocity;\n\n\n v.z += - v.x * factor;\n v.y += v.z * factor;\n v.x += v.y * factor;\n\n};\n\n\n/* Set the max ammount of x,y,z drift movements in a second */\nSPARKS.RandomDrift = function(x,y,z) {\n\tif (x instanceof THREE.Vector3) {\n\t\tthis.drift = x;\n\t\treturn;\n\t}\n\n this.drift = new THREE.Vector3(x,y,z);\n}\n\n\nSPARKS.RandomDrift.prototype.update = function(emitter, particle, time) {\n var drift = this.drift;\n\n var v = particle.velocity;\n\n v.x += ( Math.random() - 0.5 ) * drift.x * time;\n v.y += ( Math.random() - 0.5 ) * drift.y * time;\n v.z += ( Math.random() - 0.5 ) * drift.z * time;\n\n};\n\n/********************************\n* Zone Classes\n*\n* An abstract classes which have\n* getLocation() function\n*********************************/\nSPARKS.Zone = function() {\n};\n\n// TODO, contains() for Zone\n\nSPARKS.PointZone = function(pos) {\n this.pos = pos;\n};\n\nSPARKS.PointZone.prototype.getLocation = function() {\n return this.pos;\n};\n\nSPARKS.PointZone = function(pos) {\n this.pos = pos;\n};\n\nSPARKS.PointZone.prototype.getLocation = function() {\n return this.pos;\n};\n\nSPARKS.LineZone = function(start, end) {\n this.start = start;\n\tthis.end = end;\n\tthis._length = end.clone().sub( start );\n};\n\nSPARKS.LineZone.prototype.getLocation = function() {\n var len = this._length.clone();\n\n\tlen.multiplyScalar( Math.random() );\n\treturn len.add( this.start );\n\n};\n\n// Basically a RectangleZone\nSPARKS.ParallelogramZone = function(corner, side1, side2) {\n this.corner = corner;\n\tthis.side1 = side1;\n\tthis.side2 = side2;\n};\n\nSPARKS.ParallelogramZone.prototype.getLocation = function() {\n\n\tvar d1 = this.side1.clone().multiplyScalar( Math.random() );\n\tvar d2 = this.side2.clone().multiplyScalar( Math.random() );\n\td1.add(d2);\n\treturn d1.add( this.corner );\n\n};\n\nSPARKS.CubeZone = function(position, x, y, z) {\n this.position = position;\n\tthis.x = x;\n\tthis.y = y;\n\tthis.z = z;\n};\n\nSPARKS.CubeZone.prototype.getLocation = function() {\n //TODO use pool?\n\n\tvar location = this.position.clone();\n\tlocation.x += Math.random() * this.x;\n\tlocation.y += Math.random() * this.y;\n\tlocation.z += Math.random() * this.z;\n\n\treturn location;\n\n};\n\n\nSPARKS.CubeZone.prototype.contains = function(position) {\n\n\tvar startX = this.position.x;\n\tvar startY = this.position.y;\n\tvar startZ = this.position.z;\n\tvar x = this.x; // width\n\tvar y = this.y; // depth\n\tvar z = this.z; // height\n\n\tif (x<0) {\n\t\tstartX += x;\n\t\tx = Math.abs(x);\n\t}\n\n\tif (y<0) {\n\t\tstartY += y;\n\t\ty = Math.abs(y);\n\t}\n\n\tif (z<0) {\n\t\tstartZ += z;\n\t\tz = Math.abs(z);\n\t}\n\n\tvar diffX = position.x - startX;\n\tvar diffY = position.y - startY;\n\tvar diffZ = position.z - startZ;\n\n\tif ( (diffX > 0) && (diffX < x) &&\n\t\t\t(diffY > 0) && (diffY < y) &&\n\t\t\t(diffZ > 0) && (diffZ < z) ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n\n};\n\n\n\n/**\n * The constructor creates a DiscZone 3D zone.\n *\n * @param centre The point at the center of the disc.\n * @param normal A vector normal to the disc.\n * @param outerRadius The outer radius of the disc.\n * @param innerRadius The inner radius of the disc. This defines the hole\n * in the center of the disc. If set to zero, there is no hole.\n */\n\n/*\n// BUGGY!!\nSPARKS.DiscZone = function(center, radiusNormal, outerRadius, innerRadius) {\n this.center = center;\n\tthis.radiusNormal = radiusNormal;\n\tthis.outerRadius = (outerRadius==undefined) ? 0 : outerRadius;\n\tthis.innerRadius = (innerRadius==undefined) ? 0 : innerRadius;\n\n};\n\nSPARKS.DiscZone.prototype.getLocation = function() {\n var rand = Math.random();\n\tvar _innerRadius = this.innerRadius;\n\tvar _outerRadius = this.outerRadius;\n\tvar center = this.center;\n\tvar _normal = this.radiusNormal;\n\n\t_distToOrigin = _normal.dot( center );\n\n\tvar radius = _innerRadius + (1 - rand * rand ) * ( _outerRadius - _innerRadius );\n\tvar angle = Math.random() * SPARKS.Utils.TWOPI;\n\n\tvar _distToOrigin = _normal.dot( center );\n\tvar axes = SPARKS.Utils.getPerpendiculars( _normal.clone() );\n\tvar _planeAxis1 = axes[0];\n\tvar _planeAxis2 = axes[1];\n\n\tvar p = _planeAxis1.clone();\n\tp.multiplyScalar( radius * Math.cos( angle ) );\n\tvar p2 = _planeAxis2.clone();\n\tp2.multiplyScalar( radius * Math.sin( angle ) );\n\tp.add( p2 );\n\treturn _center.add( p );\n\n};\n*/\n\nSPARKS.SphereCapZone = function(x, y, z, minr, maxr, angle) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.minr = minr;\n this.maxr = maxr;\n this.angle = angle;\n};\n\nSPARKS.SphereCapZone.prototype.getLocation = function() {\n var theta = Math.PI *2 * SPARKS.Utils.random();\n var r = SPARKS.Utils.random();\n\n //new THREE.Vector3\n var v = SPARKS.VectorPool.get().set(r * Math.cos(theta), -1 / Math.tan(this.angle * SPARKS.Utils.DEGREE_TO_RADIAN), r * Math.sin(theta));\n\n //v.length = StardustMath.interpolate(0, _minRadius, 1, _maxRadius, Math.random());\n\n var i = this.minr - ((this.minr-this.maxr) * Math.random() );\n v.multiplyScalar(i);\n\n\tv.__markedForReleased = true;\n\n return v;\n};\n\n\n/********************************\n* Initializer Classes\n*\n* Classes which initializes\n* particles. Implements initialize( emitter:Emitter, particle:Particle )\n*********************************/\n\n// Specifies random life between max and min\nSPARKS.Lifetime = function(min, max) {\n this._min = min;\n\n this._max = max ? max : min;\n\n};\n\nSPARKS.Lifetime.prototype.initialize = function( emitter/*Emitter*/, particle/*Particle*/ ) {\n particle.lifetime = this._min + SPARKS.Utils.random() * ( this._max - this._min );\n};\n\n\nSPARKS.Position = function(zone) {\n this.zone = zone;\n};\n\nSPARKS.Position.prototype.initialize = function( emitter/*Emitter*/, particle/*Particle*/ ) {\n var pos = this.zone.getLocation();\n particle.position.set(pos.x, pos.y, pos.z);\n};\n\nSPARKS.Velocity = function(zone) {\n this.zone = zone;\n};\n\nSPARKS.Velocity.prototype.initialize = function( emitter/*Emitter*/, particle/*Particle*/ ) {\n var pos = this.zone.getLocation();\n particle.velocity.set(pos.x, pos.y, pos.z);\n\tif (pos.__markedForReleased) {\n\t\t//console.log(\"release\");\n\t\tSPARKS.VectorPool.release(pos);\n\t\tpos.__markedForReleased = false;\n\t}\n};\n\nSPARKS.Target = function(target, callback) {\n this.target = target;\n this.callback = callback;\n};\n\nSPARKS.Target.prototype.initialize = function( emitter, particle ) {\n\n if (this.callback) {\n particle.target = this.callback();\n } else {\n particle.target = this.target;\n }\n\n};\n\n/********************************\n* VectorPool\n*\n* Reuse much of Vectors if possible\n*********************************/\n\nSPARKS.VectorPool = {\n\t__pools: [],\n\n\t// Get a new Vector\n\tget: function() {\n\t\tif (this.__pools.length>0) {\n\t\t\treturn this.__pools.pop();\n\t\t}\n\n\t\treturn this._addToPool();\n\n\t},\n\n\t// Release a vector back into the pool\n\trelease: function(v) {\n\t\tthis.__pools.push(v);\n\t},\n\n\t// Create a bunch of vectors and add to the pool\n\t_addToPool: function() {\n\t\t//console.log(\"creating some pools\");\n\n\t\tfor (var i=0, size = 100; i < size; i++) {\n\t\t\tthis.__pools.push(new THREE.Vector3());\n\t\t}\n\n\t\treturn new THREE.Vector3();\n\n\t}\n\n\n\n};\n\n\n/********************************\n* Util Classes\n*\n* Classes which initializes\n* particles. Implements initialize( emitter:Emitter, particle:Particle )\n*********************************/\nSPARKS.Utils = {\n random: function() {\n return Math.random();\n },\n DEGREE_TO_RADIAN: Math.PI / 180,\n\tTWOPI: Math.PI * 2,\n\n\tgetPerpendiculars: function(normal) {\n\t\tvar p1 = this.getPerpendicular( normal );\n\t\tvar p2 = normal.cross( p1 );\n\t\tp2.normalize();\n\t\treturn [ p1, p2 ];\n\t},\n\n\tgetPerpendicular: function( v )\n\t{\n\t\tif( v.x == 0 )\n\t\t{\n\t\t\treturn new THREE.Vector3D( 1, 0, 0 );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar temp = new THREE.Vector3( v.y, -v.x, 0 );\n\t\t\treturn temp.normalize();\n\t\t}\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Cameras/CombinedCamera.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Cameras/CombinedCamera.js",
"module-type": "library",
"text": "/**\n *\t@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog\n *\n *\tA general perpose camera, for setting FOV, Lens Focal Length,\n *\t\tand switching between perspective and orthographic views easily.\n *\t\tUse this only if you do not wish to manage\n *\t\tboth a Orthographic and Perspective Camera\n *\n */\n\n\nTHREE.CombinedCamera = function ( width, height, fov, near, far, orthoNear, orthoFar ) {\n\n\tTHREE.Camera.call( this );\n\n\tthis.fov = fov;\n\n\tthis.left = -width / 2;\n\tthis.right = width / 2\n\tthis.top = height / 2;\n\tthis.bottom = -height / 2;\n\n\t// We could also handle the projectionMatrix internally, but just wanted to test nested camera objects\n\n\tthis.cameraO = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, \torthoNear, orthoFar );\n\tthis.cameraP = new THREE.PerspectiveCamera( fov, width / height, near, far );\n\n\tthis.zoom = 1;\n\n\tthis.toPerspective();\n\n\tvar aspect = width/height;\n\n};\n\nTHREE.CombinedCamera.prototype = Object.create( THREE.Camera.prototype );\n\nTHREE.CombinedCamera.prototype.toPerspective = function () {\n\n\t// Switches to the Perspective Camera\n\n\tthis.near = this.cameraP.near;\n\tthis.far = this.cameraP.far;\n\n\tthis.cameraP.fov = this.fov / this.zoom ;\n\n\tthis.cameraP.updateProjectionMatrix();\n\n\tthis.projectionMatrix = this.cameraP.projectionMatrix;\n\n\tthis.inPerspectiveMode = true;\n\tthis.inOrthographicMode = false;\n\n};\n\nTHREE.CombinedCamera.prototype.toOrthographic = function () {\n\n\t// Switches to the Orthographic camera estimating viewport from Perspective\n\n\tvar fov = this.fov;\n\tvar aspect = this.cameraP.aspect;\n\tvar near = this.cameraP.near;\n\tvar far = this.cameraP.far;\n\n\t// The size that we set is the mid plane of the viewing frustum\n\n\tvar hyperfocus = ( near + far ) / 2;\n\n\tvar halfHeight = Math.tan( fov / 2 ) * hyperfocus;\n\tvar planeHeight = 2 * halfHeight;\n\tvar planeWidth = planeHeight * aspect;\n\tvar halfWidth = planeWidth / 2;\n\n\thalfHeight /= this.zoom;\n\thalfWidth /= this.zoom;\n\n\tthis.cameraO.left = -halfWidth;\n\tthis.cameraO.right = halfWidth;\n\tthis.cameraO.top = halfHeight;\n\tthis.cameraO.bottom = -halfHeight;\n\n\t// this.cameraO.left = -farHalfWidth;\n\t// this.cameraO.right = farHalfWidth;\n\t// this.cameraO.top = farHalfHeight;\n\t// this.cameraO.bottom = -farHalfHeight;\n\n\t// this.cameraO.left = this.left / this.zoom;\n\t// this.cameraO.right = this.right / this.zoom;\n\t// this.cameraO.top = this.top / this.zoom;\n\t// this.cameraO.bottom = this.bottom / this.zoom;\n\n\tthis.cameraO.updateProjectionMatrix();\n\n\tthis.near = this.cameraO.near;\n\tthis.far = this.cameraO.far;\n\tthis.projectionMatrix = this.cameraO.projectionMatrix;\n\n\tthis.inPerspectiveMode = false;\n\tthis.inOrthographicMode = true;\n\n};\n\n\nTHREE.CombinedCamera.prototype.setSize = function( width, height ) {\n\n\tthis.cameraP.aspect = width / height;\n\tthis.left = -width / 2;\n\tthis.right = width / 2\n\tthis.top = height / 2;\n\tthis.bottom = -height / 2;\n\n};\n\n\nTHREE.CombinedCamera.prototype.setFov = function( fov ) {\n\n\tthis.fov = fov;\n\n\tif ( this.inPerspectiveMode ) {\n\n\t\tthis.toPerspective();\n\n\t} else {\n\n\t\tthis.toOrthographic();\n\n\t}\n\n};\n\n// For mantaining similar API with PerspectiveCamera\n\nTHREE.CombinedCamera.prototype.updateProjectionMatrix = function() {\n\n\tif ( this.inPerspectiveMode ) {\n\n\t\tthis.toPerspective();\n\n\t} else {\n\n\t\tthis.toPerspective();\n\t\tthis.toOrthographic();\n\n\t}\n\n};\n\n/*\n* Uses Focal Length (in mm) to estimate and set FOV\n* 35mm (fullframe) camera is used if frame size is not specified;\n* Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html\n*/\nTHREE.CombinedCamera.prototype.setLens = function ( focalLength, frameHeight ) {\n\n\tif ( frameHeight === undefined ) frameHeight = 24;\n\n\tvar fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) );\n\n\tthis.setFov( fov );\n\n\treturn fov;\n};\n\n\nTHREE.CombinedCamera.prototype.setZoom = function( zoom ) {\n\n\tthis.zoom = zoom;\n\n\tif ( this.inPerspectiveMode ) {\n\n\t\tthis.toPerspective();\n\n\t} else {\n\n\t\tthis.toOrthographic();\n\n\t}\n\n};\n\nTHREE.CombinedCamera.prototype.toFrontView = function() {\n\n\tthis.rotation.x = 0;\n\tthis.rotation.y = 0;\n\tthis.rotation.z = 0;\n\n\t// should we be modifing the matrix instead?\n\n\tthis.rotationAutoUpdate = false;\n\n};\n\nTHREE.CombinedCamera.prototype.toBackView = function() {\n\n\tthis.rotation.x = 0;\n\tthis.rotation.y = Math.PI;\n\tthis.rotation.z = 0;\n\tthis.rotationAutoUpdate = false;\n\n};\n\nTHREE.CombinedCamera.prototype.toLeftView = function() {\n\n\tthis.rotation.x = 0;\n\tthis.rotation.y = - Math.PI / 2;\n\tthis.rotation.z = 0;\n\tthis.rotationAutoUpdate = false;\n\n};\n\nTHREE.CombinedCamera.prototype.toRightView = function() {\n\n\tthis.rotation.x = 0;\n\tthis.rotation.y = Math.PI / 2;\n\tthis.rotation.z = 0;\n\tthis.rotationAutoUpdate = false;\n\n};\n\nTHREE.CombinedCamera.prototype.toTopView = function() {\n\n\tthis.rotation.x = - Math.PI / 2;\n\tthis.rotation.y = 0;\n\tthis.rotation.z = 0;\n\tthis.rotationAutoUpdate = false;\n\n};\n\nTHREE.CombinedCamera.prototype.toBottomView = function() {\n\n\tthis.rotation.x = Math.PI / 2;\n\tthis.rotation.y = 0;\n\tthis.rotation.z = 0;\n\tthis.rotationAutoUpdate = false;\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/ProxyGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/ProxyGeometry.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author bhouston / http://exocortex.com\n * @author jbaicoianu / http://baicoianu.com\n */\n\nTHREE.ProxyGeometry = function ( ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tthis.addEventListener( 'allocate', this.onGeometryAllocate);\n\n\t// TODO - implement as BufferGeometry attributes\n\tthis.morphTargets = [];\n\tthis.morphColors = [];\n\n};\n\nTHREE.ProxyGeometry.prototype = Object.create( THREE.IndexedGeometry2.prototype );\n\nObject.defineProperties(THREE.ProxyGeometry.prototype, {\n\tvertices: { \n\t\tenumerable: true, \n\t\tconfigurable: true, \n\t\tget: function() { return this.createVertexProxies(); }\n\t},\n\tfaces: {\n\t\tenumerable: true,\t\n\t\tget: function() { return this.createFaceProxies() } \n\t},\n\tfaceVertexUvs: {\n\t\tenumerable: true,\t\n\t\tget: function() { return this.createUvProxies() } \n\t},\n\tcolors: {\n\t\tenumerable: true,\t\n\t\tget: function() { return this.createColorProxies() } \n\t},\n\tskinIndices: {\n\t\tenumerable: true,\t\n\t\tget: function() { return this.createSkinIndexProxies() } \n\t},\n\tskinWeights: {\n\t\tenumerable: true,\t\n\t\tget: function() { return this.createSkinWeightProxies() } \n\t},\n\t// TODO - fill in additional proxies:\n\t// - morphColors\n\t// - morphNormals\n\t// - morphTargets\n\n\tverticesNeedUpdate: {\n\t\tenumerable: true,\t\n\t\tget: function() { if (this.attributes[ 'position' ]) return this.attributes[ 'position' ].needsUpdate; } ,\n\t\tset: function(v) { if (this.attributes[ 'position' ]) this.attributes[ 'position' ].needsUpdate = v; } \n\t},\n\tcolorsNeedUpdate: {\n\t\tenumerable: true,\t\n\t\tget: function() { if (this.attributes[ 'color' ]) return this.attributes[ 'color' ].needsUpdate; } ,\n\t\tset: function(v) { if (this.attributes[ 'color' ]) this.attributes[ 'color' ].needsUpdate = v; } \n\t},\n\tnormalsNeedUpdate: {\n\t\tenumerable: true,\t\n\t\tget: function() { if (this.attributes[ 'normal' ]) return this.attributes[ 'normal' ].needsUpdate; } ,\n\t\tset: function(v) { if (this.attributes[ 'normal' ]) this.attributes[ 'normal' ].needsUpdate = v; } \n\t},\n});\n\nTHREE.ProxyGeometry.prototype.createVertexProxies = function(values) {\n\n\tif (!this.hasOwnProperty('vertices')) {\n\n\t\t// Replace the prototype getter with a local array property\n\n\t\tObject.defineProperty( this, \"vertices\", { value: [], writable: true } );\n\n\t} else {\n\n\t\t// Start with a new, empty array\n\n\t\tthis.vertices = [];\n\n\t}\n\n\t// If the attribute buffer has already been populated, set up proxy objects\n\n\tthis.populateProxyFromBuffer(this.vertices, \"position\", THREE.ProxyVector3, 3);\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0; i < values.length; i++) {\n\n\t\t\tthis.vertices[i].copy(values[i]);\n\n\t\t}\n\t}\n\n\t// Return a reference to the newly-created array\n\n\treturn this.vertices;\n\n}\n\nTHREE.ProxyGeometry.prototype.createFaceProxies = function(values) {\n\n\tif (!this.hasOwnProperty(\"faces\")) {\n\n\t\t// Replace the prototype getter with a local array property\n\n\t\tObject.defineProperty( this, \"faces\", { value: [], writable: true } );\n\n\t} else {\n\n\t\t// Start with a new, empty array\n\n\t\tthis.faces = [];\n\t}\n\n\t// If the attribute buffer has already been populated, set up proxy objects\n\n\tvar faces = this.faces,\n\t\t\tindexarray = false,\n\t\t\tpositionarray = false,\n\t\t\tnormalarray = false,\n\t\t\tcolorarray = false,\n\t\t\ttangentarray = false;\n\n\tif ( this.attributes[ 'index' ] ) {\n\t\tindexarray = this.attributes[ 'index' ].array;\n\t}\n\tif ( this.attributes[ 'position' ] ) {\n\t\tpositionarray = this.attributes[ 'position' ].array;\n\t}\n\tif (this.attributes[ 'normal' ]) {\n\t\tnormalarray = this.attributes[ 'normal' ].array;\n\t}\n\tif (this.attributes[ 'color' ]) {\n\t\tcolorarray = this.attributes[ 'color' ].array;\n\t}\n\tif (this.attributes[ 'tangent' ]) {\n\t\ttangentarray = this.attributes[ 'tangent' ].array;\n\t}\n\n\t// TODO - this should be accomplished using \"virtual\" functions on various classes (IndexedGeometry, SmoothGeometry, etc)\n\n\tif (indexarray) {\n\n\t\tfor ( var i = 0, l = indexarray.length / 3; i < l; i ++ ) {\n\n\t\t\tvar o = i * 3;\n\n\t\t\tvar face = new THREE.ProxyFace3( indexarray, i * 3 );\n\t\t\tfaces.push(face);\n\n\t\t}\n\n\t} else if (positionarray) {\n\n\t\tfor ( var i = 0, l = positionarray.length / 3; i < l; i += 3 ) {\n\n\t\t\tvar o = i * 3;\n\t\t\tvar v1 = i, v2 = i+1, v3 = i+2;\n\n\t\t\tvar face = new THREE.ProxyFace3( v1, v2, v3 );\n\t\t\tfaces.push(face);\n\n\t\t}\n\n\t}\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0, l = values.length; i < l; i++) {\n\n\t\t\tvar f = faces[i],\n\t\t\t v = values[i];\n\n\t\t\tf.a = v.a;\n\t\t\tf.b = v.b;\n\t\t\tf.c = v.c;\n\n\t\t}\n\n\t}\n\n\tif (normalarray) {\n\n\t\tthis.createFaceVertexNormalProxies(values);\n\n\t}\n\n\tif (colorarray) {\n\n\t\tthis.createFaceVertexColorProxies(values);\n\n\t}\n\n\tif (tangentarray) {\n\n\t\tthis.createFaceVertexTangentProxies(values);\n\n\t}\n\n\t// Return a reference to the newly-created array\n\n\treturn this.faces;\n\n}\n\nTHREE.ProxyGeometry.prototype.createFaceVertexNormalProxies = function(values) {\n\n\tif ( this.attributes[ 'normal' ] && this.attributes[ 'normal' ].array ) {\n\n\t\tvar normalarray = this.attributes[ 'normal' ].array;\n\n\t\tfor (var i = 0, l = this.faces.length; i < l; i++) {\n\n\t\t\tvar f = this.faces[i];\n\n\t\t\tf.vertexNormals = [\n\t\t\t\tnew THREE.ProxyVector3(normalarray, f.a * 3),\n\t\t\t\tnew THREE.ProxyVector3(normalarray, f.b * 3),\n\t\t\t\tnew THREE.ProxyVector3(normalarray, f.c * 3),\n\t\t\t];\n\t\t\tf.normal = new THREE.MultiVector3(f.vertexNormals);\n\n\t\t}\n\t}\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0, l = values.length; i < l; i++) {\n\n\t\t\tvar f = this.faces[i],\n\t\t\t v = values[i];\n\n\t\t\tif (v.vertexNormals.length > 0) {\n\n\t\t\t\tfor (var j = 0, l2 = f.vertexNormals.length; j < l2; j++) {\n\n\t\t\t\t\tf.vertexNormals[j].copy(v.vertexNormals[j]);\n\n\t\t\t\t}\n\n\t\t\t} else if (v.normal) {\n\n\t\t\t\tf.normal.copy(v.normal);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTHREE.ProxyGeometry.prototype.createFaceVertexColorProxies = function(values) {\n\n\tif ( this.attributes[ 'color' ] && this.attributes[ 'color' ].array ) {\n\n\t\tvar colorarray = this.attributes[ 'color' ].array;\n\n\t\tfor (var i = 0, l = this.faces.length; i < l; i++) {\n\t\t\tvar f = this.faces[i];\n\n\t\t\tif ( this.attributes[ 'index' ] ) {\n\t\t\t\tf.vertexColors = [\n\t\t\t\t\t\tnew THREE.ProxyColor(colorarray, f.a * 3),\n\t\t\t\t\t\tnew THREE.ProxyColor(colorarray, f.b * 3),\n\t\t\t\t\t\tnew THREE.ProxyColor(colorarray, f.c * 3),\n\t\t\t\t\t];\n\t\t\t} else {\n\t\t\t\tvar o = i * 9;\n\n\t\t\t\tf.vertexColors = [\n\t\t\t\t\t\tnew THREE.ProxyColor(colorarray, o),\n\t\t\t\t\t\tnew THREE.ProxyColor(colorarray, o + 3),\n\t\t\t\t\t\tnew THREE.ProxyColor(colorarray, o + 6),\n\t\t\t\t\t];\n\t\t\t}\n\t\t\tf.color = new THREE.MultiColor(f.vertexColors);\n\n\t\t}\n\t}\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0, l = values.length; i < l; i++) {\n\n\t\t\tvar f = this.faces[i],\n\t\t\t v = values[i];\n\n\t\t\tfor (var j = 0, l2 = f.vertexColors.length; j < l2; j++) {\n\n\t\t\t\tif (v.vertexColors.length > 0) {\n\n\t\t\t\t\tf.vertexColors[j].copy(v.vertexColors[j]);\n\n\t\t\t\t} else if (v.color) {\n\n\t\t\t\t\tf.color.copy(v.color);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTHREE.ProxyGeometry.prototype.createFaceVertexTangentProxies = function(values) {\n\n\tif ( this.attributes[ 'tangent' ] && this.attributes[ 'tangent' ].array ) {\n\n\t\tvar tangentarray = this.attributes[ 'tangent' ].array;\n\n\t\tfor (var i = 0, l = this.faces.length; i < l; i++) {\n\n\t\t\tvar f = this.faces[i];\n\n\t\t\tf.vertexTangents = [\n\t\t\t\tnew THREE.ProxyVector3(tangentarray, f.a * 3),\n\t\t\t\tnew THREE.ProxyVector3(tangentarray, f.b * 3),\n\t\t\t\tnew THREE.ProxyVector3(tangentarray, f.c * 3),\n\t\t\t];\n\n\t\t}\n\t}\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0, l = values.length; i < l; i++) {\n\n\t\t\tvar f = this.faces[i],\n\t\t\t v = values[i];\n\n\t\t\tif (v.vertexTangents.length > 0) {\n\n\t\t\t\tfor (var j = 0, l2 = f.vertexTangents.length; j < l2; j++) {\n\n\t\t\t\t\tf.vertexTangents[j].copy(v.vertexTangents[j]);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTHREE.ProxyGeometry.prototype.createUvProxies = function(values) {\n\n\t// Replace the prototype getter with a local array property\n\n\tif (!this.hasOwnProperty(\"faceVertexUvs\")) {\n\t\tObject.defineProperty( this, \"faceVertexUvs\", { value: [[]], writable: true } );\n\t} else {\n\t\tthis.faceVertexUvs = [[]];\n\t}\n\n\t// If the attribute buffer has already been populated, set up proxy objects\n\n\tif ( this.attributes[ 'uv' ] && this.attributes[ 'uv' ].array ) {\n\n\t\tvar faces = this.faces;\n\t\tvar uvarray = this.attributes[ 'uv' ].array;\n\n\t\tfor (var i = 0, l = faces.length; i < l; i++) {\n\t\t\tvar f = faces[i];\n\n\t\t\tthis.faceVertexUvs[0][i] = [];\n\n\t\t\tif ( this.attributes[ 'index' ] ) {\n\t\t\t\tthis.faceVertexUvs[0][i][0] = new THREE.ProxyVector2(uvarray, f.a * 2);\n\t\t\t\tthis.faceVertexUvs[0][i][1] = new THREE.ProxyVector2(uvarray, f.b * 2);\n\t\t\t\tthis.faceVertexUvs[0][i][2] = new THREE.ProxyVector2(uvarray, f.c * 2);\n\t\t\t} else {\n\t\t\t\tvar o = i * 6;\n\t\t\t\tthis.faceVertexUvs[0][i][0] = new THREE.ProxyVector2(uvarray, o);\n\t\t\t\tthis.faceVertexUvs[0][i][1] = new THREE.ProxyVector2(uvarray, o + 2);\n\t\t\t\tthis.faceVertexUvs[0][i][2] = new THREE.ProxyVector2(uvarray, o + 4);\n\t\t\t}\n\n\t\t}\n\t\n\t}\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0, l = values.length; i < l; i++) {\n\n\t\t\tfor (var j = 0, l2 = values[i].length; j < l2; j++) {\n\n\t\t\t\tvar uv = values[i][j];\n\t\t\t\tthis.faceVertexUvs[0][i][j].copy(uv);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Return a reference to the newly-created array\n\n\treturn this.faceVertexUvs;\n\n}\n\nTHREE.ProxyGeometry.prototype.createSkinIndexProxies = function(values) {\n\n\t// Replace the prototype getter with a local array property\n\n\tif (!this.hasOwnProperty('skinIndices')) {\n\t\tObject.defineProperty( this, \"skinIndices\", { value: [], writable: true } );\n\t} else {\n\t\tthis.skinIndices = [];\n\t}\n\n\t// If the attribute buffer has already been populated, set up proxy objects\n\n\tthis.populateProxyFromBuffer(this.skinIndices, \"skinIndex\", THREE.ProxyVector4, 4);\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0; i < values.length; i++) {\n\n\t\t\tthis.skinIndices[i].copy(values[i]);\n\n\t\t}\n\n\t}\n\n\t// Return a reference to the newly-created array\n\n\treturn this.skinIndices;\n\n}\n\nTHREE.ProxyGeometry.prototype.createSkinWeightProxies = function(values) {\n\n\t// Replace the prototype getter with a local array property\n\n\tif (!this.hasOwnProperty('skinWeights')) {\n\t\tObject.defineProperty( this, \"skinWeights\", { value: [], writable: true } );\n\t} else {\n\t\tthis.skinWeights = [];\n\t}\n\n\t// If the attribute buffer has already been populated, set up proxy objects\n\n\tthis.populateProxyFromBuffer(this.skinWeights, \"skinWeight\", THREE.ProxyVector4, 4);\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0; i < values.length; i++) {\n\n\t\t\tthis.skinWeights[i].copy(values[i]);\n\n\t\t}\n\n\t}\n\n\t// Return a reference to the newly-created array\n\n\treturn this.skinWeights;\n\n}\n\nTHREE.ProxyGeometry.prototype.createColorProxies = function(values) {\n\n\t// Replace the prototype getter with a local array property\n\n\tif (!this.hasOwnProperty('colors')) {\n\t\tObject.defineProperty( this, \"colors\", { value: [], writable: true } );\n\t} else {\n\t\tthis.colors = [];\n\t}\n\n\t// If the attribute buffer has already been populated, set up proxy objects\n\n\tthis.populateProxyFromBuffer(this.colors, \"color\", THREE.ProxyColor, 3);\n\n\t// If values were passed in, store them in the buffer via the proxy objects\n\n\tif (values) {\n\n\t\tfor (var i = 0; i < values.length; i++) {\n\n\t\t\tthis.colors[i].copy(values[i]);\n\n\t\t}\n\n\t}\n\n\t// Return a reference to the newly-created array\n\n\treturn this.colors;\n\n}\n\nTHREE.ProxyGeometry.prototype.populateProxyFromBuffer = function(attr, buffername, proxytype, itemsize, offset, count) {\n\n\tif ( this.attributes[ buffername ] && this.attributes[ buffername ].array ) {\n\n\t\tvar array = this.attributes[ buffername ].array;\n\t\tvar size = itemsize || this.attributes[ buffername ].itemSize;\n\t\tvar start = offset || 0;\n\t\t\n\t\tcount = count || (array.length / size - start);\n\n\t\tfor ( var i = start, l = start + count; i < l; i ++ ) {\n\n\t\t\tattr.push( new proxytype( array, i * size ) );\n\n\t\t}\n\n\t}\n\n}\n\n/*\n * Checks for duplicate vertices with hashmap.\n * Duplicated vertices are removed\n * and faces' vertices are updated.\n */\n\nTHREE.ProxyGeometry.prototype.mergeVertices = function () {\n\n\tvar verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique)\n\tvar unique = [], changes = [];\n\n\tvar v, key;\n\tvar precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001\n\tvar precision = Math.pow( 10, precisionPoints );\n\tvar i,il, face;\n\tvar indices, k, j, jl, u;\n\n\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\tv = this.vertices[ i ];\n\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\tverticesMap[ key ] = i;\n\t\t\tunique.push( this.vertices[ i ] );\n\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t} else {\n\n\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t}\n\n\t};\n\n\n\t// if faces are completely degenerate after merging vertices, we\n\t// have to remove them from the geometry.\n\tvar faceIndicesToRemove = [];\n\n\tfor( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\tface = this.faces[ i ];\n\n\t\tface.a = changes[ face.a ];\n\t\tface.b = changes[ face.b ];\n\t\tface.c = changes[ face.c ];\n\n\t\tindices = [ face.a, face.b, face.c ];\n\n\t\tvar dupIndex = -1;\n\n\t\t// if any duplicate vertices are found in a Face3\n\t\t// we have to remove the face as nothing can be saved\n\t\tfor ( var n = 0; n < 3; n ++ ) {\n\t\t\tif ( indices[ n ] == indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\tdupIndex = n;\n\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\tthis.faces.splice( idx, 1 );\n\n\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t}\n\n\t}\n\n\t// Use unique set of vertices\n\n\tvar diff = this.vertices.length - unique.length;\n\tthis.vertices = unique;\n\treturn diff;\n\n}\n\nTHREE.ProxyGeometry.prototype.onGeometryAllocate = function (ev) {\n\n\t// Prevent allocate event listener from firing multiple times\n\tthis.removeEventListener( 'allocate', this.onGeometryAllocate);\n\n\tif (this.hasOwnProperty('vertices')) {\n\t\tvar attr = new THREE.Float32Attribute(this.vertices.length, 3);\n\t\tthis.addAttribute('position', attr);\n\t\tthis.createVertexProxies(this.vertices);\n\t}\n\tif (this.hasOwnProperty('faces')) {\n\t\tvar idxattr = new THREE.Uint16Attribute(this.faces.length, 3);\n\t\tthis.addAttribute('index', idxattr);\n\n\t\tif (this.faces.length > 0) {\n\t\t\tvar hasnormals = (this.hasOwnProperty('normals') || this.faces[0].normal || this.faces[0].vertexNormals.length > 0);\n\t\t\tvar hascolors = (this.hasOwnProperty('colors') || this.faces[0].color || this.faces[0].vertexColors.length > 0);\n\t\t\tvar hastangents = (this.faces[0].vertexTangents.length > 0);\n\n\t\t\tif (hasnormals) {\n\t\t\t\tvar normalattr = new THREE.Float32Attribute(this.vertices.length, 3);\n\t\t\t\tthis.addAttribute('normal', normalattr);\n\t\t\t}\n\n\t\t\tif (hascolors) {\n\t\t\t\tvar colorattr = new THREE.Float32Attribute(this.faces.length * 3, 3);\n\t\t\t\tthis.addAttribute('color', colorattr);\n\t\t\t}\n\n\t\t\tif (hastangents) {\n\t\t\t\tvar tangentattr = new THREE.Float32Attribute(this.faces.length * 3, 3);\n\t\t\t\tthis.addAttribute('tangent', tangentattr);\n\t\t\t}\n\t\t}\n\n\t\tthis.createFaceProxies(this.faces);\n\t}\n\n\tif (this.hasOwnProperty('faceVertexUvs')) {\n\n\t\tvar uvattr = new THREE.Float32Attribute(this.faces.length * 3, 2);\n\t\tthis.addAttribute('uv', uvattr);\n\t\tthis.createUvProxies(this.faceVertexUvs[0]);\n\n\t}\n\n\tif (this.hasOwnProperty('skinIndices')) {\n\n\t\tvar skinidxattr = new THREE.Float32Attribute(this.skinIndices.length, 4);\n\t\tthis.addAttribute('skinIndex', skinidxattr);\n\t\tthis.createSkinIndexProxies(this.skinIndices);\n\n\t}\n\n\tif (this.hasOwnProperty('skinWeights')) {\n\n\t\tvar skinweightattr = new THREE.Float32Attribute(this.skinWeights.length, 4);\n\t\tthis.addAttribute('skinWeight', skinweightattr);\n\t\tthis.createSkinWeightProxies(this.skinWeights);\n\n\t}\n}\n\nTHREE.ProxyGeometry.prototype.computeFaceNormals = function() {\n\n\tthis.dispatchEvent( { type: 'allocate' } );\n\n\treturn THREE.BufferGeometry.prototype.computeFaceNormals.call(this);\n\n}\n\nTHREE.ProxyGeometry.prototype.computeVertexNormals = function() {\n\n\tthis.dispatchEvent( { type: 'allocate' } );\n\n\treturn THREE.BufferGeometry.prototype.computeVertexNormals.call(this);\n\n}\n\nTHREE.ProxyGeometry.prototype.computeTangents = function() {\n\n\tthis.dispatchEvent( { type: 'allocate' } );\n\n\tvar ret = THREE.BufferGeometry.prototype.computeTangents.call(this);\n\n\t// FIXME - this doesn't work yet\n\t//this.createFaceVertexTangentProxies();\n\n\treturn ret;\n\n}\n\nTHREE.ProxyGeometry.prototype.computeBoundingSphere = function() {\n\n\tthis.dispatchEvent( { type: 'allocate' } );\n\n\treturn THREE.BufferGeometry.prototype.computeBoundingSphere.call(this);\n\n}\n\nTHREE.ProxyGeometry.prototype.computeBoundingBox = function () {\n\n\tthis.dispatchEvent( { type: 'allocate' } );\n\n\treturn THREE.BufferGeometry.prototype.computeBoundingBox.call(this);\n\n}\nTHREE.ProxyGeometry.prototype.clone = function () {\n\n\tvar buff = THREE.BufferGeometry.prototype.clone.call(this);\n\tvar geo = new THREE.ProxyGeometry();\n\tgeo.attributes = buff.attributes;\n\tgeo.offsets = buff.offsets;\n\n\treturn geo;\n\n}\n\nTHREE.EventDispatcher.prototype.apply( THREE.ProxyGeometry.prototype );\n\nTHREE.ProxyGeometryIdCount = 0;\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/IndexedTypedGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/IndexedTypedGeometry.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.IndexedTypedGeometry = function () {\n\n\tTHREE.BufferGeometry.call( this );\n\n};\n\nTHREE.IndexedTypedGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\n\nTHREE.IndexedTypedGeometry.prototype.setArrays = function ( indices, vertices, normals, uvs ) {\n\n\tthis.indices = indices;\n\tthis.vertices = vertices;\n\tthis.normals = normals;\n\tthis.uvs = uvs;\n\n\tthis.attributes[ 'index' ] = { array: indices, itemSize: 1 };\n\tthis.attributes[ 'position' ] = { array: vertices, itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: normals, itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: uvs, itemSize: 2 };\n\n\treturn this;\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/TypedGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/TypedGeometry.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.TypedGeometry = function ( size ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tif ( size !== undefined ) {\n\n\t\tthis.vertices = new Float32Array( size * 3 * 3 );\n\t\tthis.normals = new Float32Array( size * 3 * 3 );\n\t\tthis.uvs = new Float32Array( size * 3 * 2 );\n\n\t\tthis.attributes[ 'position' ] = { array: this.vertices, itemSize: 3 };\n\t\tthis.attributes[ 'normal' ] = { array: this.normals, itemSize: 3 };\n\t\tthis.attributes[ 'uv' ] = { array: this.uvs, itemSize: 2 };\n\n\t}\n\n};\n\nTHREE.TypedGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\n\nTHREE.TypedGeometry.prototype.setArrays = function ( vertices, normals, uvs ) {\n\n\tthis.vertices = vertices;\n\tthis.normals = normals;\n\tthis.uvs = uvs;\n\n\tthis.attributes[ 'position' ] = { array: vertices, itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: normals, itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: uvs, itemSize: 2 };\n\n\treturn this;\n\n};\n\nTHREE.TypedGeometry.prototype.merge = ( function () {\n\n\tvar offset = 0;\n\tvar normalMatrix = new THREE.Matrix3();\n\n\treturn function ( geometry, matrix, startOffset ) {\n\n\t\tif ( startOffset !== undefined ) offset = startOffset;\n\n\t\tvar offset2 = offset * 2;\n\t\tvar offset3 = offset * 3;\n\n\t\tvar vertices = this.attributes[ 'position' ].array;\n\t\tvar normals = this.attributes[ 'normal' ].array;\n\t\tvar uvs = this.attributes[ 'uv' ].array;\n\n\t\tif ( geometry instanceof THREE.TypedGeometry ) {\n\n\t\t\tvar vertices2 = geometry.attributes[ 'position' ].array;\n\t\t\tvar normals2 = geometry.attributes[ 'normal' ].array;\n\t\t\tvar uvs2 = geometry.attributes[ 'uv' ].array;\n\n\t\t\tfor ( var i = 0, l = vertices2.length; i < l; i += 3 ) {\n\n\t\t\t\tvertices[ i + offset3 ] = vertices2[ i ];\n\t\t\t\tvertices[ i + offset3 + 1 ] = vertices2[ i + 1 ];\n\t\t\t\tvertices[ i + offset3 + 2 ] = vertices2[ i + 2 ];\n\n\t\t\t\tnormals[ i + offset3 ] = normals2[ i ];\n\t\t\t\tnormals[ i + offset3 + 1 ] = normals2[ i + 1 ];\n\t\t\t\tnormals[ i + offset3 + 2 ] = normals2[ i + 2 ];\n\n\t\t\t\tuvs[ i + offset2 ] = uvs2[ i ];\n\t\t\t\tuvs[ i + offset2 + 1 ] = uvs2[ i + 1 ];\n\n\t\t\t}\n\n\t\t} else if ( geometry instanceof THREE.IndexedTypedGeometry ) {\n\n\t\t\tvar indices2 = geometry.attributes[ 'index' ].array;\n\t\t\tvar vertices2 = geometry.attributes[ 'position' ].array;\n\t\t\tvar normals2 = geometry.attributes[ 'normal' ].array;\n\t\t\tvar uvs2 = geometry.attributes[ 'uv' ].array;\n\n\t\t\tfor ( var i = 0, l = indices2.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices2[ i ];\n\n\t\t\t\tvar index3 = index * 3;\n\t\t\t\tvar i3 = i * 3;\n\n\t\t\t\tvertices[ i3 + offset3 ] = vertices2[ index3 ];\n\t\t\t\tvertices[ i3 + offset3 + 1 ] = vertices2[ index3 + 1 ];\n\t\t\t\tvertices[ i3 + offset3 + 2 ] = vertices2[ index3 + 2 ];\n\n\t\t\t\tnormals[ i3 + offset3 ] = normals2[ index3 ];\n\t\t\t\tnormals[ i3 + offset3 + 1 ] = normals2[ index3 + 1 ];\n\t\t\t\tnormals[ i3 + offset3 + 2 ] = normals2[ index3 + 2 ];\n\n\t\t\t\tvar index2 = index * 2;\n\t\t\t\tvar i2 = i * 2;\n\n\t\t\t\tuvs[ i2 + offset2 ] = uvs2[ index2 ];\n\t\t\t\tuvs[ i2 + offset2 + 1 ] = uvs2[ index2 + 1 ];\n\n\t\t\t}\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( vertices, offset3, indices2.length * 3 );\n\n\t\t\t\tnormalMatrix.getNormalMatrix( matrix );\n\t\t\t\tnormalMatrix.applyToVector3Array( normals, offset3, indices2.length * 3 );\n\n\t\t\t}\n\n\t\t\toffset += indices2.length;\n\n\t\t}\n\n\t};\n\n} )();"
},
"$:/plugins/rboue/Three.js/Lib/Wip/PlaneTypedGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/PlaneTypedGeometry.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneTypedGeometry = function ( width, height, widthSegments, heightSegments ) {\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = widthSegments || 1;\n\tvar gridY = heightSegments || 1;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = width / gridX;\n\tvar segment_height = height / gridY;\n\n\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\tvar offset = 0;\n\tvar offset2 = 0;\n\n\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tvertices[ offset ] = x;\n\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\toffset += 3;\n\t\t\toffset2 += 2;\n\n\t\t}\n\n\t}\n\n\toffset = 0;\n\n\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\tindices[ offset ] = a;\n\t\t\tindices[ offset + 1 ] = b;\n\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\tindices[ offset + 3 ] = b;\n\t\t\tindices[ offset + 4 ] = c;\n\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\toffset += 6;\n\n\t\t}\n\n\t}\n\n\tTHREE.IndexedTypedGeometry.call( this );\n\n\tthis.setArrays( indices, vertices, normals, uvs );\n\tthis.computeBoundingSphere();\n\n};\n\nTHREE.PlaneTypedGeometry.prototype = Object.create( THREE.IndexedTypedGeometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry4.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry4.js",
"module-type": "library",
"text": "THREE.Geometry4 = function ( size ) {\n\n THREE.BufferGeometry.call( this );\n\n var verticesBuffer = new ArrayBuffer( size * 3 * 4 );\n var normalsBuffer = new ArrayBuffer( size * 3 * 4 );\n var uvsBuffer = new ArrayBuffer( size * 2 * 4 );\n\n this.attributes[ 'position' ] = { array: new Float32Array( verticesBuffer, 0, size * 3 ), itemSize: 3 };\n this.attributes[ 'normal' ] = { array: new Float32Array( normalsBuffer, 0, size * 3 ), itemSize: 3 };\n this.attributes[ 'uv' ] = { array: new Float32Array( uvsBuffer, 0, size * 2 ), itemSize: 2 };\n\n this.vertices = new THREE.VectorArrayProxy( this.attributes[ 'position' ] );\n this.normals = new THREE.VectorArrayProxy( this.attributes[ 'normal' ] );\n this.uvs = new THREE.VectorArrayProxy( this.attributes[ 'uv' ] );\n\n};\nTHREE.Geometry4.prototype = Object.create( THREE.BufferGeometry.prototype );\n\nTHREE.VectorArrayProxy = function(attribute) {\n\n // Acts as a proxy for an array of vectors, by setting up accessors which return THREE.Vector*Proxy objects\n\n this.attribute = attribute;\n\n for (var i = 0, l = this.attribute.array.length / this.attribute.itemSize; i < l; i++) {\n\n Object.defineProperty(this, i, {\n get: (function(i) { return function() { return this.getValue(i); }})(i),\n set: (function(i) { return function(v) { return this.setValue(i, v); }})(i),\n });\n\n }\n\n}\n\nTHREE.VectorArrayProxy.prototype.getValue = function(i) {\n\n // Allocates a new THREE.Vector2Proxy or THREE.Vector3Proxy depending on the itemSize of our attribute\n\n var subarray = this.attribute.array.subarray(i * this.attribute.itemSize, (i + 1) * this.attribute.itemSize);\n\n switch (this.attribute.itemSize) {\n\n case 2:\n return new THREE.Vector2Proxy(subarray);\n\n case 3:\n return new THREE.Vector3Proxy(subarray);\n\n }\n\n}\nTHREE.VectorArrayProxy.prototype.setValue = function(i, v) {\n\n var vec = this[i];\n vec.copy(v);\n\n}\n\n// Vector Proxy Objects\n\nTHREE.Vector2Proxy = function(subarray) {\n\n this.subarray = subarray;\n\n}\nTHREE.Vector2Proxy.prototype = Object.create( THREE.Vector2.prototype );\nObject.defineProperty(THREE.Vector2Proxy.prototype, 'x', { get: function() { return this.subarray[0]; }, set: function(v) { this.subarray[0] = v; } });\nObject.defineProperty(THREE.Vector2Proxy.prototype, 'y', { get: function() { return this.subarray[1]; }, set: function(v) { this.subarray[1] = v; } });\n\n\nTHREE.Vector3Proxy = function(subarray) {\n\n this.subarray = subarray;\n\n}\nTHREE.Vector3Proxy.prototype = Object.create( THREE.Vector3.prototype );\n\nObject.defineProperty(THREE.Vector3Proxy.prototype, 'x', { get: function() { return this.subarray[0]; }, set: function(v) { this.subarray[0] = v; } });\nObject.defineProperty(THREE.Vector3Proxy.prototype, 'y', { get: function() { return this.subarray[1]; }, set: function(v) { this.subarray[1] = v; } });\nObject.defineProperty(THREE.Vector3Proxy.prototype, 'z', { get: function() { return this.subarray[2]; }, set: function(v) { this.subarray[2] = v; } });"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneBufferGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneBufferGeometry.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneBufferGeometry = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = widthSegments || 1;\n\tvar gridY = heightSegments || 1;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = width / gridX;\n\tvar segment_height = height / gridY;\n\n\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\tvar offset = 0;\n\tvar offset2 = 0;\n\n\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tvertices[ offset ] = x;\n\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\toffset += 3;\n\t\t\toffset2 += 2;\n\n\t\t}\n\n\t}\n\n\toffset = 0;\n\n\tvar indices = new Uint16Array( gridX * gridY * 6 );\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\tindices[ offset ] = a;\n\t\t\tindices[ offset + 1 ] = b;\n\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\tindices[ offset + 3 ] = b;\n\t\t\tindices[ offset + 4 ] = c;\n\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\toffset += 6;\n\n\t\t}\n\n\t}\n\n\tthis.attributes[ 'index' ] = { array: indices, itemSize: 1 };\n\tthis.attributes[ 'position' ] = { array: vertices, itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: normals, itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: uvs, itemSize: 2 };\n\n};\n\nTHREE.PlaneBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry3.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneGeometry3 = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.Geometry3.call( this, ( widthSegments * heightSegments ) * 2 * 3 );\n\n\tvar vertices = this.vertices;\n\tvar normals = this.normals;\n\tvar uvs = this.uvs;\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\n\tvar widthHalf = width / 2;\n\tvar heightHalf = height / 2;\n\n\tvar gridX = this.widthSegments;\n\tvar gridY = this.heightSegments;\n\n\tvar segmentWidth = this.width / gridX;\n\tvar segmentHeight = this.height / gridY;\n\n\tvar offset = 0;\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tvar y1 = iy * segmentHeight - heightHalf;\n\t\tvar y2 = ( iy + 1 ) * segmentHeight - heightHalf;\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar x1 = ix * segmentWidth - widthHalf;\n\t\t\tvar x2 = ( ix + 1 ) * segmentWidth - widthHalf;\n\n\t\t\tvertices[ offset + 0 ][ 0 ] = x1;\n\t\t\tvertices[ offset + 0 ][ 1 ] = y1;\n\n\t\t\tvertices[ offset + 1 ][ 0 ] = x2;\n\t\t\tvertices[ offset + 1 ][ 1 ] = y1;\n\n\t\t\tvertices[ offset + 2 ][ 0 ] = x1;\n\t\t\tvertices[ offset + 2 ][ 1 ] = y2;\n\n\t\t\tnormals[ offset + 0 ][ 2 ] = 1;\n\t\t\tnormals[ offset + 1 ][ 2 ] = 1;\n\t\t\tnormals[ offset + 2 ][ 2 ] = 1;\n\n\t\t\tvertices[ offset + 3 ][ 0 ] = x2;\n\t\t\tvertices[ offset + 3 ][ 1 ] = y1;\n\n\t\t\tvertices[ offset + 4 ][ 0 ] = x2;\n\t\t\tvertices[ offset + 4 ][ 1 ] = y2;\n\n\t\t\tvertices[ offset + 5 ][ 0 ] = x1;\n\t\t\tvertices[ offset + 5 ][ 1 ] = y2;\n\n\t\t\tnormals[ offset + 3 ][ 2 ] = 1;\n\t\t\tnormals[ offset + 4 ][ 2 ] = 1;\n\t\t\tnormals[ offset + 5 ][ 2 ] = 1;\n\n\t\t\toffset += 6;\n\n\t\t}\n\n\t}\n\n};\n\nTHREE.PlaneGeometry3.prototype = Object.create( THREE.Geometry3.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry2Loader.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry2Loader.js",
"module-type": "library",
"text": "/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Geometry2Loader = function ( manager ) {\r\n\r\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\r\n\r\n};\r\n\r\nTHREE.Geometry2Loader.prototype = {\r\n\r\n\tconstructor: THREE.Geometry2Loader,\r\n\r\n\tload: function ( url, onLoad, onProgress, onError ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.XHRLoader();\r\n\t\tloader.setCrossOrigin( this.crossOrigin );\r\n\t\tloader.load( url, function ( text ) {\r\n\r\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\r\n\r\n\t\t} );\r\n\r\n\t},\r\n\r\n\tsetCrossOrigin: function ( value ) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t},\r\n\r\n\tparse: function ( json ) {\r\n\r\n\t\tvar geometry = new THREE.Geometry2( json.vertices.length / 3 );\r\n\r\n\t\tvar attributes = [ 'vertices', 'normals', 'uvs' ];\r\n\t\tvar boundingSphere = json.boundingSphere;\r\n\r\n\t\tfor ( var key in attributes ) {\r\n\r\n\t\t\tvar attribute = attributes[ key ];\r\n\t\t\tgeometry[ attribute ].set( json[ attribute ] );\r\n\r\n\t\t}\r\n\r\n\t\tif ( boundingSphere !== undefined ) {\r\n\r\n\t\t\tgeometry.boundingSphere = new THREE.Sphere(\r\n\t\t\t\tnew THREE.Vector3().fromArray( boundingSphere.center !== undefined ? boundingSphere.center : [ 0, 0, 0 ] ),\r\n\t\t\t\tboundingSphere.radius\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\treturn geometry;\r\n\r\n\t}\r\n\r\n};\r\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/IndexedGeometry5.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/IndexedGeometry5.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.IndexedGeometry5 = function ( indices, size ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tvar verticesBuffer = new Float32Array( size * 3 );\n\tvar normalsBuffer = new Float32Array( size * 3 );\n\tvar uvsBuffer = new Float32Array( size * 2 );\n\n\tthis.indices = new Uint16Array( indices );\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.uvs = [];\n\n\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\tthis.vertices.push( new THREE.TypedVector3( verticesBuffer, i * 3 ) );\n\t\tthis.normals.push( new THREE.TypedVector3( normalsBuffer, i * 3 ) );\n\t\tthis.uvs.push( new THREE.TypedVector2( uvsBuffer, i * 2 ) );\n\n\t}\n\n\tthis.attributes[ 'index' ] = { array: this.indices, itemSize: 1 };\n\tthis.attributes[ 'position' ] = { array: verticesBuffer, itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: normalsBuffer, itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: uvsBuffer, itemSize: 2 };\n\n};\n\nTHREE.IndexedGeometry5.prototype = Object.create( THREE.BufferGeometry.prototype );\n\nTHREE.TypedVector2 = function ( array, offset ) {\n\n\tthis.array = array;\n\tthis.offset = offset;\n\t\n};\n\nTHREE.TypedVector2.prototype = Object.create( THREE.Vector2.prototype );\n\nObject.defineProperties( THREE.TypedVector2.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t}\n} );\n\nTHREE.TypedVector3 = function ( array, offset ) {\n\t\n\tthis.array = array;\n\tthis.offset = offset;\n\n};\n\nTHREE.TypedVector3.prototype = Object.create( THREE.Vector3.prototype );\n\nObject.defineProperties( THREE.TypedVector3.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'z': {\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t}\n} );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry2.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry2.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.Geometry2 = function ( size ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tthis.vertices = new THREE.Float32Attribute( size, 3 );\n\tthis.normals = new THREE.Float32Attribute( size, 3 );\n\tthis.uvs = new THREE.Float32Attribute( size, 2 );\n\n\tthis.addAttribute( 'position', this.vertices );\n\tthis.addAttribute( 'normal', this.normals );\n\tthis.addAttribute( 'uv', this.uvs );\n\n};\n\nTHREE.Geometry2.prototype = Object.create( THREE.BufferGeometry.prototype );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry6.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry6.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.PlaneGeometry6 = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.PlaneBufferGeometry.call( this, width, height, widthSegments, heightSegments );\n\n\tvar indices = this.attributes.index.array;\n\tvar vertices = this.attributes.position.array;\n\tvar normals = this.attributes.normal.array;\n\tvar uvs = this.attributes.uv.array;\n\n\tthis.indices = indices;\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.uvs = [];\n\n\tfor ( var i = 0, l = vertices.length / 3; i < l; i ++ ) {\n\n\t\tthis.vertices.push( new THREE.TypedVector3( vertices, i * 3 ) );\n\t\tthis.normals.push( new THREE.TypedVector3( normals, i * 3 ) );\n\t\tthis.uvs.push( new THREE.TypedVector2( uvs, i * 2 ) );\n\n\t}\n\n};\n\nTHREE.PlaneGeometry6.prototype = Object.create( THREE.PlaneBufferGeometry.prototype );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry2.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry2.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneGeometry2 = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.Geometry2.call( this, ( widthSegments * heightSegments ) * 2 * 3 );\n\n\tvar vertices = this.vertices.array;\n\tvar normals = this.normals.array;\n\tvar uvs = this.uvs.array;\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\n\tvar widthHalf = width / 2;\n\tvar heightHalf = height / 2;\n\n\tvar gridX = this.widthSegments;\n\tvar gridY = this.heightSegments;\n\n\tvar segmentWidth = this.width / gridX;\n\tvar segmentHeight = this.height / gridY;\n\n\tvar offset = 0;\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tvar y1 = iy * segmentHeight - heightHalf;\n\t\tvar y2 = ( iy + 1 ) * segmentHeight - heightHalf;\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar x1 = ix * segmentWidth - widthHalf;\n\t\t\tvar x2 = ( ix + 1 ) * segmentWidth - widthHalf;\n\n\t\t\tvertices[ offset + 0 ] = x1;\n\t\t\tvertices[ offset + 1 ] = y1;\n\n\t\t\tvertices[ offset + 3 ] = x2;\n\t\t\tvertices[ offset + 4 ] = y1;\n\n\t\t\tvertices[ offset + 6 ] = x1;\n\t\t\tvertices[ offset + 7 ] = y2;\n\n\t\t\tnormals[ offset + 2 ] = 1;\n\t\t\tnormals[ offset + 5 ] = 1;\n\t\t\tnormals[ offset + 8 ] = 1;\n\n\t\t\tvertices[ offset + 9 ] = x2;\n\t\t\tvertices[ offset + 10 ] = y1;\n\n\t\t\tvertices[ offset + 12 ] = x2;\n\t\t\tvertices[ offset + 13 ] = y2;\n\n\t\t\tvertices[ offset + 15 ] = x1;\n\t\t\tvertices[ offset + 16 ] = y2;\n\n\t\t\tnormals[ offset + 11 ] = 1;\n\t\t\tnormals[ offset + 13 ] = 1;\n\t\t\tnormals[ offset + 17 ] = 1;\n\n\t\t\toffset += 18;\n\n\t\t}\n\n\t}\n\n};\n\nTHREE.PlaneGeometry2.prototype = Object.create( THREE.Geometry2.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry5b.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry5b.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.Geometry5b = function ( bufferGeometry ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tthis.attributes = bufferGeometry.attributes;\n\n\tvar verticesBuffer = this.attributes.position.array;\n\tvar normalsBuffer = this.attributes.normal.array;\n\tvar uvsBuffer = this.attributes.uv.array;\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.uvs = [];\n\n\tfor ( var i = 0, l = verticesBuffer.length / 3; i < l; i ++ ) {\n\n\t\tthis.vertices.push( new THREE.TypedVector3( verticesBuffer, i * 3 ) );\n\t\tthis.normals.push( new THREE.TypedVector3( normalsBuffer, i * 3 ) );\n\t\tthis.uvs.push( new THREE.TypedVector2( uvsBuffer, i * 2 ) );\n\n\t}\n\n};\n\nTHREE.Geometry5b.prototype = Object.create( THREE.BufferGeometry.prototype );\n\nTHREE.TypedVector2 = function ( array, offset ) {\n\n\tthis.array = array;\n\tthis.offset = offset;\n\t\n};\n\nTHREE.TypedVector2.prototype = Object.create( THREE.Vector2.prototype );\n\nObject.defineProperties( THREE.TypedVector2.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t}\n} );\n\nTHREE.TypedVector3 = function ( array, offset ) {\n\t\n\tthis.array = array;\n\tthis.offset = offset;\n\n};\n\nTHREE.TypedVector3.prototype = Object.create( THREE.Vector3.prototype );\n\nObject.defineProperties( THREE.TypedVector3.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'z': {\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t}\n} );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/IndexedGeometry3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/IndexedGeometry3.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.IndexedGeometry3 = function ( indices, size ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tvar verticesBuffer = new ArrayBuffer( size * 3 * 4 );\n\tvar normalsBuffer = new ArrayBuffer( size * 3 * 4 );\n\tvar uvsBuffer = new ArrayBuffer( size * 2 * 4 );\n\n\tthis.indices = new Uint16Array( indices );\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.uvs = [];\n\n\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\tthis.vertices.push( new Float32Array( verticesBuffer, i * 3 * 4, 3 ) );\n\t\tthis.normals.push( new Float32Array( normalsBuffer, i * 3 * 4, 3 ) );\n\t\tthis.uvs.push( new Float32Array( uvsBuffer, i * 2 * 4, 2 ) );\n\n\t}\n\n\tthis.attributes[ 'index' ] = { array: this.indices, itemSize: 1 };\n\tthis.attributes[ 'position' ] = { array: new Float32Array( verticesBuffer, 0, size * 3 ), itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: new Float32Array( normalsBuffer, 0, size * 3 ), itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: new Float32Array( uvsBuffer, 0, size * 2 ), itemSize: 2 };\n\n};\n\nTHREE.Geometry3.prototype = Object.create( THREE.BufferGeometry.prototype );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry2b.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry2b.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneGeometry2b = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.Geometry2.call( this, ( widthSegments * heightSegments ) * 2 * 3 );\n\n\tvar vertices = this.vertices;\n\tvar normals = this.normals;\n\tvar uvs = this.uvs;\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\n\tvar widthHalf = width / 2;\n\tvar heightHalf = height / 2;\n\n\tvar gridX = this.widthSegments;\n\tvar gridY = this.heightSegments;\n\n\tvar segmentWidth = this.width / gridX;\n\tvar segmentHeight = this.height / gridY;\n\n\tvar index = 0;\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tvar y1 = iy * segmentHeight - heightHalf;\n\t\tvar y2 = ( iy + 1 ) * segmentHeight - heightHalf;\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar x1 = ix * segmentWidth - widthHalf;\n\t\t\tvar x2 = ( ix + 1 ) * segmentWidth - widthHalf;\n\n\t\t\tthis.vertices.setXY( index + 0, x1, y1 );\n\t\t\tthis.vertices.setXY( index + 1, x2, y1 );\n\t\t\tthis.vertices.setXY( index + 2, x1, y2 );\n\n\t\t\tthis.vertices.setXY( index + 3, x2, y1 );\n\t\t\tthis.vertices.setXY( index + 4, x2, y2 );\n\t\t\tthis.vertices.setXY( index + 5, x1, y2 );\n\n\t\t\tthis.normals.setZ( index + 0, 1 );\n\t\t\tthis.normals.setZ( index + 1, 1 );\n\t\t\tthis.normals.setZ( index + 2, 1 );\n\n\t\t\tthis.normals.setZ( index + 3, 1 );\n\t\t\tthis.normals.setZ( index + 4, 1 );\n\t\t\tthis.normals.setZ( index + 5, 1 );\n\n\t\t\tindex += 6;\n\n\t\t}\n\n\t}\n\n};\n\nTHREE.PlaneGeometry2b.prototype = Object.create( THREE.Geometry2.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/BoxGeometry2.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/BoxGeometry2.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n */\n\nTHREE.BoxGeometry2 = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tvar scope = this;\n\n\tthis.width = width;\n\tthis.height = height;\n\tthis.depth = depth;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\tthis.depthSegments = depthSegments || 1;\n\n\tvar width_half = this.width / 2;\n\tvar height_half = this.height / 2;\n\tvar depth_half = this.depth / 2;\n\n\tvar vector = new THREE.Vector3();\n\n\tvar vectors = [];\n\tvar vertices = [];\n\n\tvar addVertex = function ( a, b, c ) {\n\n\t\tvertices.push( vectors[ a ], vectors[ a + 1 ], vectors[ a + 2 ] );\n\t\tvertices.push( vectors[ b ], vectors[ b + 1 ], vectors[ b + 2 ] );\n\t\tvertices.push( vectors[ c ], vectors[ c + 1 ], vectors[ c + 2 ] );\n\n\t};\n\n\tbuildPlane( 'z', 'y', - 1, - 1, this.depth, this.height, width_half, 0 ); // px\n\tbuildPlane( 'z', 'y', 1, - 1, this.depth, this.height, - width_half, 1 ); // nx\n\tbuildPlane( 'x', 'z', 1, 1, this.width, this.depth, height_half, 2 ); // py\n\tbuildPlane( 'x', 'z', 1, - 1, this.width, this.depth, - height_half, 3 ); // ny\n\tbuildPlane( 'x', 'y', 1, - 1, this.width, this.height, depth_half, 4 ); // pz\n\tbuildPlane( 'x', 'y', - 1, - 1, this.width, this.height, - depth_half, 5 ); // nz\n\n\tfunction buildPlane( u, v, udir, vdir, width, height, depth, materialIndex ) {\n\n\t\tvar w, ix, iy,\n\t\tgridX = scope.widthSegments,\n\t\tgridY = scope.heightSegments,\n\t\twidth_half = width / 2,\n\t\theight_half = height / 2,\n\t\toffset = vectors.length;\n\n\t\tif ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) {\n\n\t\t\tw = 'z';\n\n\t\t} else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) {\n\n\t\t\tw = 'y';\n\t\t\tgridY = scope.depthSegments;\n\n\t\t} else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) {\n\n\t\t\tw = 'x';\n\t\t\tgridX = scope.depthSegments;\n\n\t\t}\n\n\t\tvar gridX1 = gridX + 1,\n\t\tgridY1 = gridY + 1,\n\t\tsegment_width = width / gridX,\n\t\tsegment_height = height / gridY,\n\t\tnormal = new THREE.Vector3();\n\n\t\tnormal[ w ] = depth > 0 ? 1 : - 1;\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvector[ u ] = ( ix * segment_width - width_half ) * udir;\n\t\t\t\tvector[ v ] = ( iy * segment_height - height_half ) * vdir;\n\t\t\t\tvector[ w ] = depth;\n\n\t\t\t\tvectors.push( vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( iy = 0; iy < gridY; iy++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\taddVertex( a * 3 + offset, b * 3 + offset, d * 3 + offset );\n\t\t\t\taddVertex( b * 3 + offset, c * 3 + offset, d * 3 + offset );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTHREE.Geometry2.call( this, vertices.length / 3 );\n\n\tthis.vertices.set( vertices );\n\n};\n\nTHREE.BoxGeometry2.prototype = Object.create( THREE.Geometry2.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry99.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry99.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.PlaneGeometry99 = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.Geometry99.call( this );\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = widthSegments || 1;\n\tvar gridY = heightSegments || 1;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = width / gridX;\n\tvar segment_height = height / gridY;\n\n\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\tvar offset = 0;\n\tvar offset2 = 0;\n\n\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tvertices[ offset ] = x;\n\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\toffset += 3;\n\t\t\toffset2 += 2;\n\n\t\t}\n\n\t}\n\n\toffset = 0;\n\n\tvar indices = new Uint16Array( gridX * gridY * 6 );\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\tindices[ offset ] = a;\n\t\t\tindices[ offset + 1 ] = b;\n\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\tindices[ offset + 3 ] = b;\n\t\t\tindices[ offset + 4 ] = c;\n\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\toffset += 6;\n\n\t\t}\n\n\t}\n\n\tthis.attributes[ 'index' ] = { array: indices, itemSize: 1 };\n\tthis.attributes[ 'position' ] = { array: vertices, itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: normals, itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: uvs, itemSize: 2 };\n\n};\n\nTHREE.PlaneGeometry99.prototype = Object.create( THREE.Geometry99.prototype );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/TypedGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/TypedGeometry.js",
"module-type": "library",
"text": "THREE.TypedVector2 = function ( array, offset ) {\n\n\tthis.array = array;\n\tthis.offset = offset * 2;\n\n};\n\nTHREE.TypedVector2.prototype = {\n\n\tconstructor: THREE.TypedVector3,\n\n\tget x () {\n\n\t\treturn this.array[ this.offset ];\n\n\t},\n\n\tset x ( value ) {\n\n\t\tthis.array[ this.offset ] = value;\n\n\t},\n\n\tget y () {\n\n\t\treturn this.array[ this.offset + 1 ];\n\n\t},\n\n\tset y ( value ) {\n\n\t\tthis.array[ this.offset + 1 ] = value;\n\n\t},\n\n\tset: function ( x, y ) {\n\n\t\tthis.array[ this.offset ] = x;\n\t\tthis.array[ this.offset + 1 ] = y;\n\t\treturn this;\n\n\t}\n\n};\n\nTHREE.TypedVector3 = function ( array, offset ) {\n\n\tthis.array = array;\n\tthis.offset = offset * 3;\n\n};\n\nTHREE.TypedVector3.prototype = {\n\n\tconstructor: THREE.TypedVector3,\n\n\tget x () {\n\n\t\treturn this.array[ this.offset ];\n\n\t},\n\n\tset x ( value ) {\n\n\t\tthis.array[ this.offset ] = value;\n\n\t},\n\n\tget y () {\n\n\t\treturn this.array[ this.offset + 1 ];\n\n\t},\n\n\tset y ( value ) {\n\n\t\tthis.array[ this.offset + 1 ] = value;\n\n\t},\n\n\tget z () {\n\n\t\treturn this.array[ this.offset + 2 ];\n\n\t},\n\n\tset z ( value ) {\n\n\t\tthis.array[ this.offset + 2 ] = value;\n\n\t},\n\n\tset: function ( x, y, z ) {\n\n\t\tthis.array[ this.offset ] = x;\n\t\tthis.array[ this.offset + 1 ] = y;\n\t\tthis.array[ this.offset + 2 ] = z;\n\t\treturn this;\n\n\t},\n\n\ttoString: function () {\n\n\t\treturn '[' + this.array[ this.offset ] + ',' + this.array[ this.offset + 1 ] + ',' + this.array[ this.offset + 2 ] + ']';\n\n\t}\n\n};\n\nTHREE.TypedFace = function ( positions, normals, uvs, offset ) {\n\n\tthis.positions = positions;\n\tthis.normals = normals;\n\tthis.uvs = uvs;\n\tthis.offset = offset * 3;\n\n};\n\nTHREE.TypedFace.prototype = {\n\n\tconstructor: THREE.TypedFace,\n\n\tvertex: function ( index ) {\n\n\t\treturn new THREE.TypedVector3( this.positions, this.offset + index );\n\n\t},\n\n\tnormal: function ( index ) {\n\n\t\treturn new THREE.TypedVector3( this.normals, this.offset + index );\n\n\t},\n\n\tuv: function ( index ) {\n\n\t\treturn new THREE.TypedVector2( this.uvs, this.offset + index );\n\n\t}\n\n}\n\n\nTHREE.TypedGeometry = function ( size ) {\n\n\tthis.id = THREE.GeometryIdCount ++;\n\tthis.uuid = THREE.Math.generateUUID();\n\n\tthis.name = '';\n\n\tthis.positions = new Float32Array( size * 3 * 3 );\n\tthis.normals = new Float32Array( size * 3 * 3 );\n\tthis.uvs = new Float32Array( size * 3 * 2 );\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n};\n\nTHREE.TypedGeometry.prototype = {\n\n\tconstructor: THREE.TypedGeometry,\n\n\tface: function ( index ) {\n\n\t\treturn new THREE.TypedFace( this.positions, this.normals, this.uvs, index );\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n};\n\nTHREE.EventDispatcher.prototype.apply( THREE.TypedGeometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry3.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.Geometry3 = function ( size ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tvar verticesBuffer = new ArrayBuffer( size * 3 * 4 );\n\tvar normalsBuffer = new ArrayBuffer( size * 3 * 4 );\n\tvar uvsBuffer = new ArrayBuffer( size * 2 * 4 );\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.uvs = [];\n\n\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\tthis.vertices.push( new Float32Array( verticesBuffer, i * 3 * 4, 3 ) );\n\t\tthis.normals.push( new Float32Array( normalsBuffer, i * 3 * 4, 3 ) );\n\t\tthis.uvs.push( new Float32Array( uvsBuffer, i * 2 * 4, 2 ) );\n\n\t}\n\n\tthis.attributes[ 'position' ] = { array: new Float32Array( verticesBuffer, 0, size * 3 ), itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: new Float32Array( normalsBuffer, 0, size * 3 ), itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: new Float32Array( uvsBuffer, 0, size * 2 ), itemSize: 2 };\n\n};\n\nTHREE.Geometry3.prototype = Object.create( THREE.BufferGeometry.prototype );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry5.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry5.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneGeometry5 = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.Geometry5.call( this, ( widthSegments * heightSegments ) * 2 * 3 );\n\n\tvar vertices = this.vertices;\n\tvar normals = this.normals;\n\tvar uvs = this.uvs;\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\n\tvar widthHalf = width / 2;\n\tvar heightHalf = height / 2;\n\n\tvar gridX = this.widthSegments;\n\tvar gridY = this.heightSegments;\n\n\tvar segmentWidth = this.width / gridX;\n\tvar segmentHeight = this.height / gridY;\n\n\tvar offset = 0;\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tvar y1 = iy * segmentHeight - heightHalf;\n\t\tvar y2 = ( iy + 1 ) * segmentHeight - heightHalf;\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar x1 = ix * segmentWidth - widthHalf;\n\t\t\tvar x2 = ( ix + 1 ) * segmentWidth - widthHalf;\n\n\t\t\tvertices[ offset + 0 ].set( x1, y1, 0 );\n\t\t\tvertices[ offset + 1 ].set( x2, y1, 0 );\n\t\t\tvertices[ offset + 2 ].set( x1, y2, 0 );\n\n\t\t\tnormals[ offset + 0 ].z = 1;\n\t\t\tnormals[ offset + 1 ].z = 1;\n\t\t\tnormals[ offset + 2 ].z = 1;\n\n\t\t\tvertices[ offset + 3 ].set( x2, y1, 0 );\n\t\t\tvertices[ offset + 4 ].set( x2, y2, 0 );\n\t\t\tvertices[ offset + 5 ].set( x1, y2, 0 );\n\n\t\t\tnormals[ offset + 3 ].z = 1;\n\t\t\tnormals[ offset + 4 ].z = 1;\n\t\t\tnormals[ offset + 5 ].z = 1;\n\n\t\t\toffset += 6;\n\n\t\t}\n\n\t}\n\n};\n\nTHREE.PlaneGeometry5.prototype = Object.create( THREE.Geometry5.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/PlaneGeometry.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.PlaneGeometry = function ( width, height, widthSegments, heightSegments ) {\n\n\tTHREE.Geometry.call( this );\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\n\tvar ix, iz;\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = this.widthSegments;\n\tvar gridZ = this.heightSegments;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridZ1 = gridZ + 1;\n\n\tvar segment_width = this.width / gridX;\n\tvar segment_height = this.height / gridZ;\n\n\tvar normal = new THREE.Vector3( 0, 0, 1 );\n\n\tfor ( iz = 0; iz < gridZ1; iz ++ ) {\n\n\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\t\t\tvar y = iz * segment_height - height_half;\n\n\t\t\tthis.vertices.push( new THREE.Vector3( x, - y, 0 ) );\n\n\t\t}\n\n\t}\n\n\tfor ( iz = 0; iz < gridZ; iz ++ ) {\n\n\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iz;\n\t\t\tvar b = ix + gridX1 * ( iz + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iz + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iz;\n\n\t\t\tvar uva = new THREE.Vector2( ix / gridX, 1 - iz / gridZ );\n\t\t\tvar uvb = new THREE.Vector2( ix / gridX, 1 - ( iz + 1 ) / gridZ );\n\t\t\tvar uvc = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - ( iz + 1 ) / gridZ );\n\t\t\tvar uvd = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - iz / gridZ );\n\n\t\t\tvar face = new THREE.Face3( a, b, d );\n\t\t\tface.normal.copy( normal );\n\t\t\tface.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() );\n\n\t\t\tthis.faces.push( face );\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] );\n\n\t\t\tface = new THREE.Face3( b, c, d );\n\t\t\tface.normal.copy( normal );\n\t\t\tface.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() );\n\n\t\t\tthis.faces.push( face );\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] );\n\n\t\t}\n\n\t}\n\n};\n\nTHREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry5.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/Geometry5.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.Geometry5 = function ( size ) {\n\n\tTHREE.BufferGeometry.call( this );\n\n\tvar verticesBuffer = new Float32Array( size * 3 );\n\tvar normalsBuffer = new Float32Array( size * 3 );\n\tvar uvsBuffer = new Float32Array( size * 2 );\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.uvs = [];\n\n\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\tthis.vertices.push( new THREE.TypedVector3( verticesBuffer, i * 3 ) );\n\t\tthis.normals.push( new THREE.TypedVector3( normalsBuffer, i * 3 ) );\n\t\tthis.uvs.push( new THREE.TypedVector2( uvsBuffer, i * 2 ) );\n\n\t}\n\n\tthis.attributes[ 'position' ] = { array: verticesBuffer, itemSize: 3 };\n\tthis.attributes[ 'normal' ] = { array: normalsBuffer, itemSize: 3 };\n\tthis.attributes[ 'uv' ] = { array: uvsBuffer, itemSize: 2 };\n\n};\n\nTHREE.Geometry5.prototype = Object.create( THREE.BufferGeometry.prototype );\n\nTHREE.TypedVector2 = function ( array, offset ) {\n\n\tthis.array = array;\n\tthis.offset = offset;\n\t\n};\n\nTHREE.TypedVector2.prototype = Object.create( THREE.Vector2.prototype );\n\nObject.defineProperties( THREE.TypedVector2.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t}\n} );\n\nTHREE.TypedVector3 = function ( array, offset ) {\n\t\n\tthis.array = array;\n\tthis.offset = offset;\n\n};\n\nTHREE.TypedVector3.prototype = Object.create( THREE.Vector3.prototype );\n\nObject.defineProperties( THREE.TypedVector3.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'z': {\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t}\n} );"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/IndexedPlaneGeometry5.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Benchmark/IndexedPlaneGeometry5.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n */\n\nTHREE.IndexedPlaneGeometry5 = function ( width, height, widthSegments, heightSegments ) {\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.widthSegments = widthSegments || 1;\n\tthis.heightSegments = heightSegments || 1;\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = this.widthSegments;\n\tvar gridY = this.heightSegments;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = this.width / gridX;\n\tvar segment_height = this.height / gridY;\n\n\tvar indices = gridX * gridY * 6;\n\tvar vertices = gridX1 * gridY1;\n\n\tTHREE.IndexedGeometry5.call( this, indices, vertices );\n\n\tvar offset = 0;\n\n\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tthis.vertices[ offset ].x = x;\n\t\t\tthis.vertices[ offset ].y = - y;\n\n\t\t\tthis.normals[ offset ].z = 1;\n\n\t\t\tthis.uvs[ offset ].x = ix / gridX;\n\t\t\tthis.uvs[ offset ].y = iy / gridY;\n\n\t\t\toffset ++;\n\n\t\t}\n\n\t}\n\n\tvar offset = 0;\n\n\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\tthis.indices[ offset ] = a;\n\t\t\tthis.indices[ offset + 1 ] = b;\n\t\t\tthis.indices[ offset + 2 ] = d;\n\n\t\t\tthis.indices[ offset + 3 ] = b;\n\t\t\tthis.indices[ offset + 4 ] = c;\n\t\t\tthis.indices[ offset + 5 ] = d;\n\n\t\t\toffset += 6;\n\n\t\t}\n\n\t}\n\n};\n\nTHREE.IndexedPlaneGeometry5.prototype = Object.create( THREE.IndexedGeometry5.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/CircleTypedGeometry.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/CircleTypedGeometry.js",
"module-type": "library",
"text": "/**\n * @author hughes\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.CircleTypedGeometry = function ( radius, segments, thetaStart, thetaLength ) {\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 50;\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t//\n\n\tvar elements = segments + 2;\n\n\tvar indices = new Uint16Array( segments * 3 );\n\tvar vertices = new Float32Array( elements * 3 );\n\tvar normals = new Float32Array( elements * 3 );\n\tvar uvs = new Float32Array( elements * 2 );\n\n\t// center\n\n\tnormals[ 2 ] = 1;\n\n\tuvs[ 0 ] = 0.5;\n\tuvs[ 1 ] = 0.5;\n\n\tvar offset = 0, offset2 = 2, offset3 = 3;\n\n\tfor ( var i = 0; i <= segments; i ++ ) {\n\n\t\tvar segment = thetaStart + i / segments * thetaLength;\n\n\t\tvar x = radius * Math.cos( segment );\n\t\tvar y = radius * Math.sin( segment );\n\n\t\tvertices[ offset3 ] = x;\n\t\tvertices[ offset3 + 1 ] = y;\n\n\t\tnormals[ offset3 + 2 ] = 1;\n\n\t\tuvs[ offset2 ] = ( x / radius + 1 ) / 2;\n\t\tuvs[ offset2 + 1 ] = ( y / radius + 1 ) / 2;\n\n\t\toffset2 += 2;\n\t\toffset3 += 3;\n\n\t\t//\n\n\t\tindices[ offset ] = 0;\n\t\tindices[ offset + 1 ] = i + 1;\n\t\tindices[ offset + 2 ] = i + 2;\n\n\t\toffset += 3;\n\n\t}\n\n\tTHREE.IndexedTypedGeometry.call( this );\n\n\tthis.setArrays( indices, vertices, normals, uvs );\n\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\n\n};\n\nTHREE.CircleTypedGeometry.prototype = Object.create( THREE.IndexedTypedGeometry.prototype );\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyVector2.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyVector2.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author jbaicoianu / http://baicoianu.com/\n */\n\nTHREE.ProxyVector2 = function ( array, offset ) {\n\t\n\tthis.array = array;\n\tthis.offset = offset;\n\n};\n\nTHREE.ProxyVector2.prototype = Object.create( THREE.Vector2.prototype );\n\nObject.defineProperties( THREE.ProxyVector2.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t}\n} );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyFace3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyFace3.js",
"module-type": "library",
"text": "/**\n * @author jbaicoianu / http://baicoianu.com/\n */\n\nTHREE.ProxyFace3 = function ( array, offset, vertexNormals, vertexColors, vertexTangents ) {\n\n\tthis.array = array;\n\tthis.offset = offset;\n\tthis.vertexNormals = vertexNormals || [];\n\tthis.vertexColors = vertexColors || [];\n\tthis.vertexTangents = vertexTangents || [];\n\n\tthis.normal = new THREE.MultiVector3( this.vertexNormals );\n\tthis.color = new THREE.MultiColor( this.vertexColors );\n\n\t//THREE.Face3.call( this, array[offset], array[offset+1], array[offset+2] /*, normal, color, materialIndex */);\n\n}\n\nTHREE.ProxyFace3.prototype = Object.create( THREE.Face3.prototype );\n\nObject.defineProperties( THREE.ProxyFace3.prototype, {\n\t'a': {\n\t\tenumerable: true,\t\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'b': {\n\t\tenumerable: true,\t\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'c': {\n\t\tenumerable: true,\t\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t},\n} );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/MultiColor.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/MultiColor.js",
"module-type": "library",
"text": "// Allows updating of multiple THREE.Color objects with the same value\n// Used for face.color -> face.vertexColor[] compatibility layer for non-indexed geometry\n\nTHREE.MultiColor = function(links) {\n\n\tthis.links = links;\n\n}\n\nTHREE.MultiColor.prototype = Object.create( THREE.Color.prototype );\n\nTHREE.MultiColor.prototype.setAll = function(axis, value) {\n\n\tfor (var i = 0, l = this.links.length; i < l; i++) {\n\n\t\tthis.links[i][axis] = value;\n\n\t}\n\n}\n\n// Getters return value from the first linked color\n// Setters set the same value for all linked colors\nObject.defineProperties( THREE.MultiColor.prototype, {\n\t'r': {\n\t\tget: function () { return (this.links[0] ? this.links[0].r : 0); },\n\t\tset: function ( v ) { this.setAll('r', v); }\n\t},\n\t'g': {\n\t\tget: function () { return (this.links[0] ? this.links[0].g : 0); },\n\t\tset: function ( v ) { this.setAll('g', v); }\n\t},\n\t'b': {\n\t\tget: function () { return (this.links[0] ? this.links[0].b : 0); },\n\t\tset: function ( v ) { this.setAll('b', v); }\n\t}\n} );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyColor.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyColor.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author jbaicoianu / http://baicoianu.com/\n */\n\nTHREE.ProxyColor = function ( array, offset ) {\n\n\tthis.array = array;\n\tthis.offset = offset;\n\n}\n\nTHREE.ProxyColor.prototype = Object.create( THREE.Color.prototype );\n\nObject.defineProperties( THREE.ProxyColor.prototype, {\n\t'r': {\n\t\tenumerable: true,\t\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'g': {\n\t\tenumerable: true,\t\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'b': {\n\t\tenumerable: true,\t\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t}\n} );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/MultiVector3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/MultiVector3.js",
"module-type": "library",
"text": "// Allows updating of multiple THREE.Vector3 objects with the same value\n// Used for face.normal -> face.vertexNormal[] compatibility layer for FlatShading\n\nTHREE.MultiVector3 = function(links) {\n\n\tthis.links = links;\n\n}\n\nTHREE.MultiVector3.prototype = Object.create( THREE.Vector3.prototype );\n\nTHREE.MultiVector3.prototype.setAll = function(axis, value) {\n\n\tfor (var i = 0, l = this.links.length; i < l; i++) {\n\n\t\tthis.links[i][axis] = value;\n\n\t}\n\n}\n\n// Getters return value from the first linked vector\n// Setters set the same value for all linked vectors\nObject.defineProperties( THREE.MultiVector3.prototype, {\n\t'x': {\n\t\tget: function () { return (this.links[0] ? this.links[0].x : 0); },\n\t\tset: function ( v ) { this.setAll('x', v); }\n\t},\n\t'y': {\n\t\tget: function () { return (this.links[0] ? this.links[0].y : 0); },\n\t\tset: function ( v ) { this.setAll('y', v); }\n\t},\n\t'z': {\n\t\tget: function () { return (this.links[0] ? this.links[0].z : 0); },\n\t\tset: function ( v ) { this.setAll('z', v); }\n\t}\n} );\n\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyVector3.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyVector3.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author jbaicoianu / http://baicoianu.com/\n */\n\nTHREE.ProxyVector3 = function ( array, offset ) {\n\t\n\tthis.array = array;\n\tthis.offset = offset;\n\n};\n\nTHREE.ProxyVector3.prototype = Object.create( THREE.Vector3.prototype );\n\nObject.defineProperties( THREE.ProxyVector3.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'z': {\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t}\n} );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyVector4.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/Proxies/ProxyVector4.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n * @author jbaicoianu / http://baicoianu.com/\n */\n\nTHREE.ProxyVector4 = function ( array, offset ) {\n\t\n\tthis.array = array;\n\tthis.offset = offset;\n\n};\n\nTHREE.ProxyVector4.prototype = Object.create( THREE.Vector4.prototype );\n\nObject.defineProperties( THREE.ProxyVector4.prototype, {\n\t'x': {\n\t\tget: function () { return this.array[ this.offset ]; },\n\t\tset: function ( v ) { this.array[ this.offset ] = v; }\n\t},\n\t'y': {\n\t\tget: function () { return this.array[ this.offset + 1 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 1 ] = v; }\n\t},\n\t'z': {\n\t\tget: function () { return this.array[ this.offset + 2 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 2 ] = v; }\n\t},\n\t'w': {\n\t\tget: function () { return this.array[ this.offset + 3 ]; },\n\t\tset: function ( v ) { this.array[ this.offset + 3 ] = v; }\n\t}\n} );\n\n"
},
"$:/plugins/rboue/Three.js/Lib/Wip/GeometryEditor.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/Wip/GeometryEditor.js",
"module-type": "library",
"text": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.GeometryEditor = function ( geometry ) {\n\n\tthis.geometry = geometry;\n\n};\n\nObject.defineProperties( THREE.GeometryEditor.prototype, {\n\tvertices: { \n\t\tenumerable: true,\n\t\tget: function() { return this.createVertexProxies(); }\n\t},\n\tnormals: {\n\t\tenumerable: true,\n\t\tget: function() { return this.createNormalProxies(); } \n\t},\n\tuvs: {\n\t\tenumerable: true,\n\t\tget: function() { return this.createUVProxies(); } \n\t}\n} );\n\nTHREE.GeometryEditor.prototype.createVertexProxies = function () {\n\n\tObject.defineProperty( this, 'vertices', { value: [], writable: true } );\n\n\tvar attributes = this.geometry.attributes;\n\tvar length = attributes.position.array.length / 3;\n\n\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\tthis.vertices.push( new THREE.ProxyVector3( attributes.position.array, i * 3 ) );\n\n\t}\n\n\treturn this.vertices;\n\n};\n\nTHREE.GeometryEditor.prototype.createNormalProxies = function () {\n\n\tObject.defineProperty( this, 'normals', { value: [], writable: true } );\n\n\tvar attributes = this.geometry.attributes;\n\tvar length = attributes.position.array.length / 3;\n\n\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\tthis.normals.push( new THREE.ProxyVector3( attributes.normal.array, i * 3 ) );\n\n\t}\n\n\treturn this.normals;\n\n};\n\nTHREE.GeometryEditor.prototype.createUVProxies = function () {\n\n\tObject.defineProperty( this, 'uvs', { value: [], writable: true } );\n\n\tvar attributes = this.geometry.attributes;\n\tvar length = attributes.position.array.length / 3;\n\n\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\tthis.uvs.push( new THREE.ProxyVector2( attributes.uv.array, i * 2 ) );\n\n\t}\n\n\treturn this.uvs;\n\n};"
},
"$:/plugins/rboue/Three.js/Lib/ShaderGodRays.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ShaderGodRays.js",
"module-type": "library",
"text": "/**\n * @author huwb / http://huwbowles.com/\n *\n * God-rays (crepuscular rays)\n *\n * Similar implementation to the one used by Crytek for CryEngine 2 [Sousa2008].\n * Blurs a mask generated from the depth map along radial lines emanating from the light\n * source. The blur repeatedly applies a blur filter of increasing support but constant\n * sample count to produce a blur filter with large support.\n *\n * My implementation performs 3 passes, similar to the implementation from Sousa. I found\n * just 6 samples per pass produced acceptible results. The blur is applied three times,\n * with decreasing filter support. The result is equivalent to a single pass with\n * 6*6*6 = 216 samples.\n *\n * References:\n *\n * Sousa2008 - Crysis Next Gen Effects, GDC2008, http://www.crytek.com/sites/default/files/GDC08_SousaT_CrysisEffects.ppt\n */\n\nTHREE.ShaderGodRays = {\n\n\t/**\n\t * The god-ray generation shader.\n\t *\n\t * First pass:\n\t *\n\t * The input is the depth map. I found that the output from the\n\t * THREE.MeshDepthMaterial material was directly suitable without\n\t * requiring any treatment whatsoever.\n\t *\n\t * The depth map is blurred along radial lines towards the \"sun\". The\n\t * output is written to a temporary render target (I used a 1/4 sized\n\t * target).\n\t *\n\t * Pass two & three:\n\t *\n\t * The results of the previous pass are re-blurred, each time with a\n\t * decreased distance between samples.\n\t */\n\n\t'godrays_generate': {\n\n\t\tuniforms: {\n\n\t\t\ttInput: {\n\t\t\t\ttype: \"t\",\n\t\t\t\tvalue: null\n\t\t\t},\n\n\t\t\tfStepSize: {\n\t\t\t\ttype: \"f\",\n\t\t\t\tvalue: 1.0\n\t\t\t},\n\n\t\t\tvSunPositionScreenSpace: {\n\t\t\t\ttype: \"v2\",\n\t\t\t\tvalue: new THREE.Vector2( 0.5, 0.5 )\n\t\t\t}\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"#define TAPS_PER_PASS 6.0\",\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"uniform sampler2D tInput;\",\n\n\t\t\t\"uniform vec2 vSunPositionScreenSpace;\",\n\t\t\t\"uniform float fStepSize;\", // filter step size\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// delta from current pixel to \"sun\" position\n\n\t\t\t\t\"vec2 delta = vSunPositionScreenSpace - vUv;\",\n\t\t\t\t\"float dist = length( delta );\",\n\n\t\t\t\t// Step vector (uv space)\n\n\t\t\t\t\"vec2 stepv = fStepSize * delta / dist;\",\n\n\t\t\t\t// Number of iterations between pixel and sun\n\n\t\t\t\t\"float iters = dist/fStepSize;\",\n\n\t\t\t\t\"vec2 uv = vUv.xy;\",\n\t\t\t\t\"float col = 0.0;\",\n\n\t\t\t\t// This breaks ANGLE in Chrome 22\n\t\t\t\t//\t- see http://code.google.com/p/chromium/issues/detail?id=153105\n\n\t\t\t\t/*\n\t\t\t\t// Unrolling didnt do much on my hardware (ATI Mobility Radeon 3450),\n\t\t\t\t// so i've just left the loop\n\n\t\t\t\t\"for ( float i = 0.0; i < TAPS_PER_PASS; i += 1.0 ) {\",\n\n\t\t\t\t\t// Accumulate samples, making sure we dont walk past the light source.\n\n\t\t\t\t\t// The check for uv.y < 1 would not be necessary with \"border\" UV wrap\n\t\t\t\t\t// mode, with a black border colour. I don't think this is currently\n\t\t\t\t\t// exposed by three.js. As a result there might be artifacts when the\n\t\t\t\t\t// sun is to the left, right or bottom of screen as these cases are\n\t\t\t\t\t// not specifically handled.\n\n\t\t\t\t\t\"col += ( i <= iters && uv.y < 1.0 ? texture2D( tInput, uv ).r : 0.0 );\",\n\t\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t\"}\",\n\t\t\t\t*/\n\n\t\t\t\t// Unrolling loop manually makes it work in ANGLE\n\n\t\t\t\t\"if ( 0.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;\",\n\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t\"if ( 1.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;\",\n\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t\"if ( 2.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;\",\n\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t\"if ( 3.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;\",\n\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t\"if ( 4.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;\",\n\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t\"if ( 5.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;\",\n\t\t\t\t\"uv += stepv;\",\n\n\t\t\t\t// Should technically be dividing by 'iters', but 'TAPS_PER_PASS' smooths out\n\t\t\t\t// objectionable artifacts, in particular near the sun position. The side\n\t\t\t\t// effect is that the result is darker than it should be around the sun, as\n\t\t\t\t// TAPS_PER_PASS is greater than the number of samples actually accumulated.\n\t\t\t\t// When the result is inverted (in the shader 'godrays_combine', this produces\n\t\t\t\t// a slight bright spot at the position of the sun, even when it is occluded.\n\n\t\t\t\t\"gl_FragColor = vec4( col/TAPS_PER_PASS );\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t/**\n\t * Additively applies god rays from texture tGodRays to a background (tColors).\n\t * fGodRayIntensity attenuates the god rays.\n\t */\n\n\t'godrays_combine': {\n\n\t\tuniforms: {\n\n\t\t\ttColors: {\n\t\t\t\ttype: \"t\",\n\t\t\t\tvalue: null\n\t\t\t},\n\n\t\t\ttGodRays: {\n\t\t\t\ttype: \"t\",\n\t\t\t\tvalue: null\n\t\t\t},\n\n\t\t\tfGodRayIntensity: {\n\t\t\t\ttype: \"f\",\n\t\t\t\tvalue: 0.69\n\t\t\t},\n\n\t\t\tvSunPositionScreenSpace: {\n\t\t\t\ttype: \"v2\",\n\t\t\t\tvalue: new THREE.Vector2( 0.5, 0.5 )\n\t\t\t}\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"uniform sampler2D tColors;\",\n\t\t\t\"uniform sampler2D tGodRays;\",\n\n\t\t\t\"uniform vec2 vSunPositionScreenSpace;\",\n\t\t\t\"uniform float fGodRayIntensity;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// Since THREE.MeshDepthMaterial renders foreground objects white and background\n\t\t\t\t// objects black, the god-rays will be white streaks. Therefore value is inverted\n\t\t\t\t// before being combined with tColors\n\n\t\t\t\t\"gl_FragColor = texture2D( tColors, vUv ) + fGodRayIntensity * vec4( 1.0 - texture2D( tGodRays, vUv ).r );\",\n\t\t\t\t\"gl_FragColor.a = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\n\t/**\n\t * A dodgy sun/sky shader. Makes a bright spot at the sun location. Would be\n\t * cheaper/faster/simpler to implement this as a simple sun sprite.\n\t */\n\n\t'godrays_fake_sun': {\n\n\t\tuniforms: {\n\n\t\t\tvSunPositionScreenSpace: {\n\t\t\t\ttype: \"v2\",\n\t\t\t\tvalue: new THREE.Vector2( 0.5, 0.5 )\n\t\t\t},\n\n\t\t\tfAspect: {\n\t\t\t\ttype: \"f\",\n\t\t\t\tvalue: 1.0\n\t\t\t},\n\n\t\t\tsunColor: {\n\t\t\t\ttype: \"c\",\n\t\t\t\tvalue: new THREE.Color( 0xffee00 )\n\t\t\t},\n\n\t\t\tbgColor: {\n\t\t\t\ttype: \"c\",\n\t\t\t\tvalue: new THREE.Color( 0x000000 )\n\t\t\t}\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vUv = uv;\",\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tfragmentShader: [\n\n\t\t\t\"varying vec2 vUv;\",\n\n\t\t\t\"uniform vec2 vSunPositionScreenSpace;\",\n\t\t\t\"uniform float fAspect;\",\n\n\t\t\t\"uniform vec3 sunColor;\",\n\t\t\t\"uniform vec3 bgColor;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 diff = vUv - vSunPositionScreenSpace;\",\n\n\t\t\t\t// Correct for aspect ratio\n\n\t\t\t\t\"diff.x *= fAspect;\",\n\n\t\t\t\t\"float prop = clamp( length( diff ) / 0.5, 0.0, 1.0 );\",\n\t\t\t\t\"prop = 0.35 * pow( 1.0 - prop, 3.0 );\",\n\n\t\t\t\t\"gl_FragColor.xyz = mix( sunColor, bgColor, 1.0 - prop );\",\n\t\t\t\t\"gl_FragColor.w = 1.0;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js/Lib/CurveExtras.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/CurveExtras.js",
"module-type": "library",
"text": "/*\n * A bunch of parametric curves\n * @author zz85\n *\n * Formulas collected from various sources\n *\thttp://mathworld.wolfram.com/HeartCurve.html\n *\thttp://mathdl.maa.org/images/upload_library/23/stemkoski/knots/page6.html\n *\thttp://en.wikipedia.org/wiki/Viviani%27s_curve\n *\thttp://mathdl.maa.org/images/upload_library/23/stemkoski/knots/page4.html\n *\thttp://www.mi.sanu.ac.rs/vismath/taylorapril2011/Taylor.pdf\n *\thttp://prideout.net/blog/?p=44\n */\n\n// Lets define some curves\nTHREE.Curves = {};\n\n\n THREE.Curves.GrannyKnot = THREE.Curve.create( function(){},\n\n\t function(t) {\n\t t = 2 * Math.PI * t;\n\n\t var x = -0.22 * Math.cos(t) - 1.28 * Math.sin(t) - 0.44 * Math.cos(3 * t) - 0.78 * Math.sin(3 * t);\n\t var y = -0.1 * Math.cos(2 * t) - 0.27 * Math.sin(2 * t) + 0.38 * Math.cos(4 * t) + 0.46 * Math.sin(4 * t);\n\t var z = 0.7 * Math.cos(3 * t) - 0.4 * Math.sin(3 * t);\n\t return new THREE.Vector3(x, y, z).multiplyScalar(20);\n\t}\n);\n\nTHREE.Curves.HeartCurve = THREE.Curve.create(\n\nfunction(s) {\n\n\tthis.scale = (s === undefined) ? 5 : s;\n\n},\n\nfunction(t) {\n\n\tt *= 2 * Math.PI;\n\n\tvar tx = 16 * Math.pow(Math.sin(t), 3);\n\tvar ty = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t), tz = 0;\n\n\treturn new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n\n}\n\n);\n\n\n\n// Viviani's Curve\nTHREE.Curves.VivianiCurve = THREE.Curve.create(\n\n\tfunction(radius) {\n\n\t\tthis.radius = radius;\n\t},\n\n\tfunction(t) {\n\n\t\tt = t * 4 * Math.PI; // Normalized to 0..1\n\t\tvar a = this.radius / 2;\n\t\tvar tx = a * (1 + Math.cos(t)),\n\t\t\tty = a * Math.sin(t),\n\t\t\ttz = 2 * a * Math.sin(t / 2);\n\n\t\treturn new THREE.Vector3(tx, ty, tz);\n\n\t}\n\n);\n\n\nTHREE.Curves.KnotCurve = THREE.Curve.create(\n\n\tfunction() {\n\n\t},\n\n\tfunction(t) {\n\n\t\tt *= 2 * Math.PI;\n\n\t\tvar R = 10;\n\t\tvar s = 50;\n\t\tvar tx = s * Math.sin(t),\n\t\t\tty = Math.cos(t) * (R + s * Math.cos(t)),\n\t\t\ttz = Math.sin(t) * (R + s * Math.cos(t));\n\n\t\treturn new THREE.Vector3(tx, ty, tz);\n\n\t}\n\n);\n\nTHREE.Curves.HelixCurve = THREE.Curve.create(\n\n\tfunction() {\n\n\t},\n\n\tfunction(t) {\n\n\t\tvar a = 30; // radius\n\t\tvar b = 150; //height\n\t\tvar t2 = 2 * Math.PI * t * b / 30;\n\t\tvar tx = Math.cos(t2) * a,\n\t\t\tty = Math.sin(t2) * a,\n\t\t\ttz = b * t;\n\n\t\treturn new THREE.Vector3(tx, ty, tz);\n\n\t}\n\n);\n\nTHREE.Curves.TrefoilKnot = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 10 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tt *= Math.PI * 2;\n\t\tvar tx = (2 + Math.cos(3 * t)) * Math.cos(2 * t),\n\t\t\tty = (2 + Math.cos(3 * t)) * Math.sin(2 * t),\n\t\t\ttz = Math.sin(3 * t);\n\n\t\treturn new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n\n\t}\n\n);\n\nTHREE.Curves.TorusKnot = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 10 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tvar p = 3,\n\t\t\tq = 4;\n\t\tt *= Math.PI * 2;\n\t\tvar tx = (2 + Math.cos(q * t)) * Math.cos(p * t),\n\t\t\tty = (2 + Math.cos(q * t)) * Math.sin(p * t),\n\t\t\ttz = Math.sin(q * t);\n\n\t\treturn new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n\n\t}\n\n);\n\n\nTHREE.Curves.CinquefoilKnot = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 10 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tvar p = 2,\n\t\t\tq = 5;\n\t\tt *= Math.PI * 2;\n\t\tvar tx = (2 + Math.cos(q * t)) * Math.cos(p * t),\n\t\t\tty = (2 + Math.cos(q * t)) * Math.sin(p * t),\n\t\t\ttz = Math.sin(q * t);\n\n\t\treturn new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n\n\t}\n\n);\n\n\nTHREE.Curves.TrefoilPolynomialKnot = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 10 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tt = t * 4 - 2;\n\t\tvar tx = Math.pow(t, 3) - 3 * t,\n\t\t\tty = Math.pow(t, 4) - 4 * t * t,\n\t\t\ttz = 1 / 5 * Math.pow(t, 5) - 2 * t;\n\n\t\treturn new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n\n\t}\n\n);\n\n// var scaleTo = function(x, y) {\n// var r = y - x;\n// return function(t) {\n// t * r + x;\n// };\n// }\nvar scaleTo = function(x, y, t) {\n\n\t\tvar r = y - x;\n\t\treturn t * r + x;\n\n\t}\n\nTHREE.Curves.FigureEightPolynomialKnot = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 1 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tt = scaleTo(-4, 4, t);\n\t\tvar tx = 2 / 5 * t * (t * t - 7) * (t * t - 10),\n\t\t\tty = Math.pow(t, 4) - 13 * t * t,\n\t\t\ttz = 1 / 10 * t * (t * t - 4) * (t * t - 9) * (t * t - 12);\n\n\t\treturn new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n\n\t}\n\n);\n\nTHREE.Curves.DecoratedTorusKnot4a = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 40 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tt *= Math.PI * 2;\n\t\tvar\n\t\tx = Math.cos(2 * t) * (1 + 0.6 * (Math.cos(5 * t) + 0.75 * Math.cos(10 * t))),\n\t\t\ty = Math.sin(2 * t) * (1 + 0.6 * (Math.cos(5 * t) + 0.75 * Math.cos(10 * t))),\n\t\t\tz = 0.35 * Math.sin(5 * t);\n\n\t\treturn new THREE.Vector3(x, y, z).multiplyScalar(this.scale);\n\n\t}\n\n);\n\n\nTHREE.Curves.DecoratedTorusKnot4b = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 40 : s;\n\n\t},\n\n\tfunction(t) {\n\t\tvar fi = t * Math.PI * 2;\n\t\tvar x = Math.cos(2 * fi) * (1 + 0.45 * Math.cos(3 * fi) + 0.4 * Math.cos(9 * fi)),\n\t\t\ty = Math.sin(2 * fi) * (1 + 0.45 * Math.cos(3 * fi) + 0.4 * Math.cos(9 * fi)),\n\t\t\tz = 0.2 * Math.sin(9 * fi);\n\n\t\treturn new THREE.Vector3(x, y, z).multiplyScalar(this.scale);\n\n\t}\n\n);\n\n\nTHREE.Curves.DecoratedTorusKnot5a = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 40 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tvar fi = t * Math.PI * 2;\n\t\tvar x = Math.cos(3 * fi) * (1 + 0.3 * Math.cos(5 * fi) + 0.5 * Math.cos(10 * fi)),\n\t\t\ty = Math.sin(3 * fi) * (1 + 0.3 * Math.cos(5 * fi) + 0.5 * Math.cos(10 * fi)),\n\t\t\tz = 0.2 * Math.sin(20 * fi);\n\n\t\treturn new THREE.Vector3(x, y, z).multiplyScalar(this.scale);\n\n\t}\n\n);\n\nTHREE.Curves.DecoratedTorusKnot5c = THREE.Curve.create(\n\n\tfunction(s) {\n\n\t\tthis.scale = (s === undefined) ? 40 : s;\n\n\t},\n\n\tfunction(t) {\n\n\t\tvar fi = t * Math.PI * 2;\n\t\tvar x = Math.cos(4 * fi) * (1 + 0.5 * (Math.cos(5 * fi) + 0.4 * Math.cos(20 * fi))),\n\t\t\ty = Math.sin(4 * fi) * (1 + 0.5 * (Math.cos(5 * fi) + 0.4 * Math.cos(20 * fi))),\n\t\t\tz = 0.35 * Math.sin(15 * fi);\n\n\t\treturn new THREE.Vector3(x, y, z).multiplyScalar(this.scale);\n\n\t}\n\n);"
},
"$:/plugins/rboue/Three.js/Lib/UCSCharacter.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/UCSCharacter.js",
"module-type": "library",
"text": "THREE.UCSCharacter = function() {\n\n\tvar scope = this;\n\t\n\tvar mesh;\n\n\tthis.scale = 1;\n\n\tthis.root = new THREE.Object3D();\n\t\n\tthis.numSkins;\n\tthis.numMorphs;\n\t\n\tthis.skins = [];\n\tthis.materials = [];\n\tthis.morphs = [];\n\n\tthis.onLoadComplete = function () {};\n\t\n\tthis.loadCounter = 0;\n\n\tthis.loadParts = function ( config ) {\n\t\t\n\t\tthis.numSkins = config.skins.length;\n\t\tthis.numMorphs = config.morphs.length;\n\t\t\n\t\t// Character geometry + number of skins\n\t\tthis.loadCounter = 1 + config.skins.length;\n\t\t\n\t\t// SKINS\n\t\tthis.skins = loadTextures( config.baseUrl + \"skins/\", config.skins );\n\t\tthis.materials = createMaterials( this.skins );\n\t\t\n\t\t// MORPHS\n\t\tthis.morphs = config.morphs;\n\t\t\n\t\t// CHARACTER\n\t\tvar loader = new THREE.JSONLoader();\n\t\tconsole.log( config.baseUrl + config.character );\n\t\tloader.load( config.baseUrl + config.character, function( geometry ) {\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tgeometry.computeVertexNormals();\n\n\t\t\t//THREE.AnimationHandler.add( geometry.animation );\n\n\t\t\tmesh = new THREE.SkinnedMesh( geometry, new THREE.MeshFaceMaterial() );\n\t\t\tscope.root.add( mesh );\n\t\t\t\n\t\t\tvar bb = geometry.boundingBox;\n\t\t\tscope.root.scale.set( config.s, config.s, config.s );\n\t\t\tscope.root.position.set( config.x, config.y - bb.min.y * config.s, config.z );\n\n\t\t\tmesh.castShadow = true;\n\t\t\tmesh.receiveShadow = true;\n\n\t\t\tanimation = new THREE.Animation( mesh, geometry.animation );\n\t\t\tanimation.play();\n\t\t\t\n\t\t\tscope.setSkin(0);\n\t\t\t\n\t\t\tscope.checkLoadComplete();\n\t\t} );\n\n\t};\n\t\n\tthis.setSkin = function( index ) {\n\t\tif ( mesh && scope.materials ) {\n\t\t\tmesh.material = scope.materials[ index ];\n\t\t}\n\t};\n\t\n\tthis.updateMorphs = function( influences ) {\n\t\tif ( mesh ) {\n\t\t\tfor ( var i = 0; i < scope.numMorphs; i ++ ) {\n\t\t\t\tmesh.morphTargetInfluences[ i ] = influences[ scope.morphs[ i ] ] / 100;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction loadTextures( baseUrl, textureUrls ) {\n\t\tvar mapping = new THREE.UVMapping();\n\t\tvar textures = [];\n\n\t\tfor ( var i = 0; i < textureUrls.length; i ++ ) {\n\n\t\t\ttextures[ i ] = THREE.ImageUtils.loadTexture( baseUrl + textureUrls[ i ], mapping, scope.checkLoadComplete );\n\t\t\ttextures[ i ].name = textureUrls[ i ];\n\n\t\t}\n\n\t\treturn textures;\n\t};\n\n\tfunction createMaterials( skins ) {\n\t\tvar materials = [];\n\t\t\n\t\tfor ( var i = 0; i < skins.length; i ++ ) {\n\n\t\t\tmaterials[ i ] = new THREE.MeshLambertMaterial( {\n\t\t\t\tcolor: 0xeeeeee,\n\t\t\t\tspecular: 10.0,\n\t\t\t\tmap: skins[ i ],\n\t\t\t\tskinning: true,\n\t\t\t\tmorphTargets: true,\n\t\t\t\twrapAround: true\n\t\t\t} );\n\n\t\t}\n\t\t\n\t\treturn materials;\n\t}\n\n\tthis.checkLoadComplete = function () {\n\n\t\tscope.loadCounter -= 1;\n\n\t\tif ( scope.loadCounter === 0 ) {\n\n\t\t\tscope.onLoadComplete();\n\n\t\t}\n\n\t}\n\n}\n"
},
"$:/plugins/rboue/Three.js/Lib/ShaderDeferred.js": {
"type": "application/javascript",
"title": "$:/plugins/rboue/Three.js/Lib/ShaderDeferred.js",
"module-type": "library",
"text": "/**\n * @author alteredq / http://alteredqualia.com/\n * @author MPanknin / http://www.redplant.de/\n * @author benaadams / http://blog.illyriad.co.uk/\n *\n */\n\n\nTHREE.DeferredShaderChunk = {\n\n\t// decode float to vec3\n\n\tunpackFloat: [\n\n\t\t\"vec3 float_to_vec3( float data ) {\",\n\n\t\t\t\"vec3 uncompressed;\",\n\t\t\t\"uncompressed.x = fract( data );\",\n\t\t\t\"float zInt = floor( data / 255.0 );\",\n\t\t\t\"uncompressed.z = fract( zInt / 255.0 );\",\n\t\t\t\"uncompressed.y = fract( floor( data - ( zInt * 255.0 ) ) / 255.0 );\",\n\t\t\t\"return uncompressed;\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tcomputeVertexPositionVS: [\n\n\t\t\"vec2 texCoord = gl_FragCoord.xy / vec2( viewWidth, viewHeight );\",\n\n\t\t\"vec4 normalDepth = texture2D( samplerNormalDepth, texCoord );\",\n\t\t\"float z = normalDepth.w;\",\n\n\t\t\"if ( z == 0.0 ) discard;\",\n\n\t\t\"vec2 xy = texCoord * 2.0 - 1.0;\",\n\n\t\t\"vec4 vertexPositionProjected = vec4( xy, z, 1.0 );\",\n\t\t\"vec4 vertexPositionVS = matProjInverse * vertexPositionProjected;\",\n\t\t\"vertexPositionVS.xyz /= vertexPositionVS.w;\",\n\t\t\"vertexPositionVS.w = 1.0;\"\n\n\t].join(\"\\n\"),\n\n\tcomputeNormal: [\n\n\t\t\"vec3 normal = normalDepth.xyz * 2.0 - 1.0;\"\n\n\t].join(\"\\n\"),\n\n\tunpackColorMap: [\n\n\t\t\"vec4 colorMap = texture2D( samplerColor, texCoord );\",\n\n\t\t\"vec3 albedo = float_to_vec3( abs( colorMap.x ) );\",\n\t\t\"vec3 specularColor = float_to_vec3( abs( colorMap.y ) );\",\n\t\t\"float shininess = abs( colorMap.z );\",\n\t\t\"float wrapAround = sign( colorMap.z );\",\n\t\t\"float additiveSpecular = sign( colorMap.y );\"\n\n\t].join(\"\\n\"),\n\n\tcomputeDiffuse: [\n\n\t\t\"float dotProduct = dot( normal, lightVector );\",\n\t\t\"float diffuseFull = max( dotProduct, 0.0 );\",\n\n\t\t\"vec3 diffuse;\",\n\n\t\t\"if ( wrapAround < 0.0 ) {\",\n\n\t\t\t// wrap around lighting\n\n\t\t\t\"float diffuseHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\",\n\n\t\t\t\"const vec3 wrapRGB = vec3( 1.0, 1.0, 1.0 );\",\n\t\t\t\"diffuse = mix( vec3( diffuseFull ), vec3( diffuseHalf ), wrapRGB );\",\n\n\t\t\"} else {\",\n\n\t\t\t// simple lighting\n\n\t\t\t\"diffuse = vec3( diffuseFull );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tcomputeSpecular: [\n\n\t\t\"vec3 halfVector = normalize( lightVector - normalize( vertexPositionVS.xyz ) );\",\n\t\t\"float dotNormalHalf = max( dot( normal, halfVector ), 0.0 );\",\n\n\t\t// simple specular\n\n\t\t//\"vec3 specular = specularColor * max( pow( dotNormalHalf, shininess ), 0.0 ) * diffuse;\",\n\n\t\t// physically based specular\n\n\t\t\"float specularNormalization = ( shininess + 2.0001 ) / 8.0;\",\n\n\t\t\"vec3 schlick = specularColor + vec3( 1.0 - specularColor ) * pow( 1.0 - dot( lightVector, halfVector ), 5.0 );\",\n\t\t\"vec3 specular = schlick * max( pow( dotNormalHalf, shininess ), 0.0 ) * diffuse * specularNormalization;\"\n\n\t].join(\"\\n\"),\n\n\tcombine: [\n\n\t\t\"vec3 light = lightIntensity * lightColor;\",\n\t\t\"gl_FragColor = vec4( light * ( albedo * diffuse + specular ), attenuation );\"\n\n\t].join(\"\\n\")\n\n};\n\nTHREE.ShaderDeferred = {\n\n\t\"color\" : {\n\n\t\tuniforms: THREE.UniformsUtils.merge( [\n\n\t\t\tTHREE.UniformsLib[ \"common\" ],\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ],\n\n\t\t\t{\n\t\t\t\t\"emissive\" : { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\t\t\"specular\" : { type: \"c\", value: new THREE.Color( 0x111111 ) },\n\t\t\t\t\"shininess\": { type: \"f\", value: 30 },\n\t\t\t\t\"wrapAround\": \t\t{ type: \"f\", value: 1 },\n\t\t\t\t\"additiveSpecular\": { type: \"f\", value: 1 },\n\n\t\t\t\t\"samplerNormalDepth\": { type: \"t\", value: null },\n\t\t\t\t\"viewWidth\": \t\t{ type: \"f\", value: 800 },\n\t\t\t\t\"viewHeight\": \t\t{ type: \"f\", value: 600 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform vec3 diffuse;\",\n\t\t\t\"uniform vec3 specular;\",\n\t\t\t\"uniform vec3 emissive;\",\n\t\t\t\"uniform float shininess;\",\n\t\t\t\"uniform float wrapAround;\",\n\t\t\t\"uniform float additiveSpecular;\",\n\n\t\t\tTHREE.ShaderChunk[ \"color_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"map_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_fragment\" ],\n\n\t\t\t\"#ifdef USE_ENVMAP\",\n\n\t\t\t\t\"varying vec3 vWorldPosition;\",\n\n\t\t\t\t\"uniform float reflectivity;\",\n\t\t\t\t\"uniform samplerCube envMap;\",\n\t\t\t\t\"uniform float flipEnvMap;\",\n\t\t\t\t\"uniform int combine;\",\n\n\t\t\t\t\"uniform bool useRefract;\",\n\t\t\t\t\"uniform float refractionRatio;\",\n\n\t\t\t\t\"uniform sampler2D samplerNormalDepth;\",\n\t\t\t\t\"uniform float viewHeight;\",\n\t\t\t\t\"uniform float viewWidth;\",\n\n\t\t\t\"#endif\",\n\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\n\t\t\tTHREE.ShaderChunk[ \"specularmap_pars_fragment\" ],\n\n\t\t\t\"const float unit = 255.0/256.0;\",\n\n\t\t\t\"float vec3_to_float( vec3 data ) {\",\n\n\t\t\t\t\"highp float compressed = fract( data.x * unit ) + floor( data.y * unit * 255.0 ) + floor( data.z * unit * 255.0 ) * 255.0;\",\n\t\t\t\t\"return compressed;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"const float opacity = 1.0;\",\n\n\t\t\t\t\"gl_FragColor = vec4( diffuse, opacity );\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"map_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"alphatest_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"specularmap_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"color_fragment\" ],\n\n\t\t\t\t\"#ifdef USE_ENVMAP\",\n\n\t\t\t\t\t\"vec2 texCoord = gl_FragCoord.xy / vec2( viewWidth, viewHeight );\",\n\t\t\t\t\t\"vec4 normalDepth = texture2D( samplerNormalDepth, texCoord );\",\n\t\t\t\t\t\"vec3 normal = normalDepth.xyz * 2.0 - 1.0;\",\n\n\t\t\t\t\t\"vec3 reflectVec;\",\n\n\t\t\t\t\t\"vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\",\n\n\t\t\t\t\t\"if ( useRefract ) {\",\n\n\t\t\t\t\t\t\"reflectVec = refract( cameraToVertex, normal, refractionRatio );\",\n\n\t\t\t\t\t\"} else { \",\n\n\t\t\t\t\t\t\"reflectVec = reflect( cameraToVertex, normal );\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"#ifdef DOUBLE_SIDED\",\n\n\t\t\t\t\t\t\"float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\",\n\t\t\t\t\t\t\"vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\",\n\n\t\t\t\t\t\"#else\",\n\n\t\t\t\t\t\t\"vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\",\n\n\t\t\t\t\t\"#endif\",\n\n\t\t\t\t\t\"#ifdef GAMMA_INPUT\",\n\n\t\t\t\t\t\t\"cubeColor.xyz *= cubeColor.xyz;\",\n\n\t\t\t\t\t\"#endif\",\n\n\t\t\t\t\t\"if ( combine == 1 ) {\",\n\n\t\t\t\t\t\t\"gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\",\n\n\t\t\t\t\t\"} else if ( combine == 2 ) {\",\n\n\t\t\t\t\t\t\"gl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;\",\n\n\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\"gl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\n\n\t\t\t\t//\n\n\t\t\t\t\"const float compressionScale = 0.999;\",\n\n\t\t\t\t//\n\n\t\t\t\t\"vec3 diffuseMapColor;\",\n\n\t\t\t\t\"#ifdef USE_MAP\",\n\n\t\t\t\t\t\"diffuseMapColor = texelColor.xyz;\",\n\n\t\t\t\t\"#else\",\n\n\t\t\t\t\t\"diffuseMapColor = vec3( 1.0 );\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t// diffuse color\n\n\t\t\t\t\"gl_FragColor.x = vec3_to_float( compressionScale * gl_FragColor.xyz );\",\n\n\t\t\t\t// specular color\n\n\t\t\t\t\"if ( additiveSpecular < 0.0 ) {\",\n\n\t\t\t\t\t\"gl_FragColor.y = vec3_to_float( compressionScale * specular );\",\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"gl_FragColor.y = vec3_to_float( compressionScale * specular * diffuseMapColor );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\t\"gl_FragColor.y *= additiveSpecular;\",\n\n\t\t\t\t// shininess\n\n\t\t\t\t\"gl_FragColor.z = wrapAround * shininess;\",\n\n\t\t\t\t// emissive color\n\n\t\t\t\t\"#ifdef USE_COLOR\",\n\n\t\t\t\t\t\"gl_FragColor.w = vec3_to_float( compressionScale * emissive * diffuseMapColor * vColor );\",\n\n\t\t\t\t\"#else\",\n\n\t\t\t\t\t\"gl_FragColor.w = vec3_to_float( compressionScale * emissive * diffuseMapColor );\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\tTHREE.ShaderChunk[ \"map_pars_vertex\" ],\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_vertex\" ],\n\t\t\tTHREE.ShaderChunk[ \"color_pars_vertex\" ],\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\n\n\t\t\t\"#ifdef USE_ENVMAP\",\n\n\t\t\t\t\"varying vec3 vWorldPosition;\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"map_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"color_vertex\" ],\n\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\n\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"skinning_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\n\n\t\t\t\tTHREE.ShaderChunk[ \"worldpos_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\n\n\t\t\t\t\"#ifdef USE_ENVMAP\",\n\n\t\t\t\t\t\"vWorldPosition = worldPosition.xyz;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"normalDepth\" : {\n\n\t\tuniforms: {\n\n\t\t\tbumpMap: \t { type: \"t\", value: null },\n\t\t\tbumpScale:\t { type: \"f\", value: 1 },\n\t\t\toffsetRepeat: { type: \"v4\", value: new THREE.Vector4( 0, 0, 1, 1 ) }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"#ifdef USE_BUMPMAP\",\n\n\t\t\t\t\"#extension GL_OES_standard_derivatives : enable\\n\",\n\n\t\t\t\t\"varying vec2 vUv;\",\n\t\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"bumpmap_pars_fragment\" ],\n\n\t\t\t\"#endif\",\n\n\t\t\t\"varying vec3 normalView;\",\n\t\t\t\"varying vec4 clipPos;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 normal = normalize( normalView );\",\n\n\t\t\t\t\"#ifdef USE_BUMPMAP\",\n\n\t\t\t\t\t\"normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"gl_FragColor.xyz = normal * 0.5 + 0.5;\",\n\t\t\t\t\"gl_FragColor.w = clipPos.z / clipPos.w;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"varying vec3 normalView;\",\n\t\t\t\"varying vec4 clipPos;\",\n\n\t\t\t\"#ifdef USE_BUMPMAP\",\n\n\t\t\t\t\"varying vec2 vUv;\",\n\t\t\t\t\"varying vec3 vViewPosition;\",\n\n\t\t\t\t\"uniform vec4 offsetRepeat;\",\n\n\t\t\t\"#endif\",\n\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.ShaderChunk[ \"morphnormal_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"skinnormal_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"defaultnormal_vertex\" ],\n\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"skinning_vertex\" ],\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\n\n\t\t\t\t\"normalView = normalize( normalMatrix * objectNormal );\",\n\n\t\t\t\t\"#ifdef USE_BUMPMAP\",\n\n\t\t\t\t\t\"vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\",\n\t\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"clipPos = gl_Position;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"composite\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerLight: \t{ type: \"t\", value: null },\n\t\t\tbrightness:\t\t{ type: \"f\", value: 1 }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"varying vec2 texCoord;\",\n\t\t\t\"uniform sampler2D samplerLight;\",\n\t\t\t\"uniform float brightness;\",\n\n\t\t\t// tonemapping operators\n\t\t\t// based on John Hable's HLSL snippets\n\t\t\t// from http://filmicgames.com/archives/75\n\n\t\t\t\"#ifdef TONEMAP_UNCHARTED\",\n\n\t\t\t\t\"const float A = 0.15;\",\n\t\t\t\t\"const float B = 0.50;\",\n\t\t\t\t\"const float C = 0.10;\",\n\t\t\t\t\"const float D = 0.20;\",\n\t\t\t\t\"const float E = 0.02;\",\n\t\t\t\t\"const float F = 0.30;\",\n\t\t\t\t\"const float W = 11.2;\",\n\n\t\t\t\t\"vec3 Uncharted2Tonemap( vec3 x ) {\",\n\n\t\t\t\t \"return ( ( x * ( A * x + C * B ) + D * E ) / ( x * ( A * x + B ) + D * F ) ) - E / F;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"#endif\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec3 inColor = texture2D( samplerLight, texCoord ).xyz;\",\n\t\t\t\t\"inColor *= brightness;\",\n\n\t\t\t\t\"vec3 outColor;\",\n\n\t\t\t\t\"#if defined( TONEMAP_SIMPLE )\",\n\n\t\t\t\t\t\"outColor = sqrt( inColor );\",\n\n\t\t\t\t\"#elif defined( TONEMAP_LINEAR )\",\n\n\t\t\t\t\t// simple linear to gamma conversion\n\n\t\t\t\t\t\"outColor = pow( inColor, vec3( 1.0 / 2.2 ) );\",\n\n\t\t\t\t\"#elif defined( TONEMAP_REINHARD )\",\n\n\t\t\t\t\t// Reinhard operator\n\n\t\t\t\t\t\"inColor = inColor / ( 1.0 + inColor );\",\n\t\t\t\t\t\"outColor = pow( inColor, vec3( 1.0 / 2.2 ) );\",\n\n\t\t\t\t\"#elif defined( TONEMAP_FILMIC )\",\n\n\t\t\t\t\t// filmic operator by Jim Hejl and Richard Burgess-Dawson\n\n\t\t\t\t\t\"vec3 x = max( vec3( 0.0 ), inColor - 0.004 );\",\n\t\t\t\t\t\"outColor = ( x * ( 6.2 * x + 0.5 ) ) / ( x * ( 6.2 * x + 1.7 ) + 0.06 );\",\n\n\t\t\t\t\"#elif defined( TONEMAP_UNCHARTED )\",\n\n\t\t\t\t\t// tonemapping operator from Uncharted 2 by John Hable\n\n\t\t\t\t\t\"float ExposureBias = 2.0;\",\n\t\t\t\t\t\"vec3 curr = Uncharted2Tonemap( ExposureBias * inColor );\",\n\n\t\t\t\t\t\"vec3 whiteScale = vec3( 1.0 ) / Uncharted2Tonemap( vec3( W ) );\",\n\t\t\t\t\t\"vec3 color = curr * whiteScale;\",\n\n\t\t\t\t\t\"outColor = pow( color, vec3( 1.0 / 2.2 ) );\",\n\n\t\t\t\t\"#else\",\n\n\t\t\t\t\t\"outColor = inColor;\",\n\n\t\t\t\t\"#endif\",\n\n\t\t\t\t\"gl_FragColor = vec4( outColor, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"varying vec2 texCoord;\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec4 pos = vec4( sign( position.xy ), 0.0, 1.0 );\",\n\t\t\t\t\"texCoord = pos.xy * vec2( 0.5 ) + 0.5;\",\n\t\t\t\t\"gl_Position = pos;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"pointLight\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerNormalDepth: { type: \"t\", value: null },\n\t\t\tsamplerColor: \t\t{ type: \"t\", value: null },\n\t\t\tmatProjInverse: { type: \"m4\", value: new THREE.Matrix4() },\n\t\t\tviewWidth: \t\t{ type: \"f\", value: 800 },\n\t\t\tviewHeight: \t{ type: \"f\", value: 600 },\n\n\t\t\tlightPositionVS:{ type: \"v3\", value: new THREE.Vector3( 0, 0, 0 ) },\n\t\t\tlightColor: \t{ type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\tlightIntensity: { type: \"f\", value: 1.0 },\n\t\t\tlightRadius: \t{ type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform sampler2D samplerColor;\",\n\t\t\t\"uniform sampler2D samplerNormalDepth;\",\n\n\t\t\t\"uniform float lightRadius;\",\n\t\t\t\"uniform float lightIntensity;\",\n\t\t\t\"uniform float viewHeight;\",\n\t\t\t\"uniform float viewWidth;\",\n\n\t\t\t\"uniform vec3 lightColor;\",\n\t\t\t\"uniform vec3 lightPositionVS;\",\n\n\t\t\t\"uniform mat4 matProjInverse;\",\n\n\t\t\tTHREE.DeferredShaderChunk[ \"unpackFloat\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeVertexPositionVS\" ],\n\n\t\t\t\t// bail out early when pixel outside of light sphere\n\n\t\t\t\t\"vec3 lightVector = lightPositionVS - vertexPositionVS.xyz;\",\n\t\t\t\t\"float distance = length( lightVector );\",\n\n\t\t\t\t\"if ( distance > lightRadius ) discard;\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeNormal\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"unpackColorMap\" ],\n\n\t\t\t\t// compute light\n\n\t\t\t\t\"lightVector = normalize( lightVector );\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeDiffuse\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeSpecular\" ],\n\n\t\t\t\t// combine\n\n\t\t\t\t\"float cutoff = 0.3;\",\n\t\t\t\t\"float denom = distance / lightRadius + 1.0;\",\n\t\t\t\t\"float attenuation = 1.0 / ( denom * denom );\",\n\t\t\t\t\"attenuation = ( attenuation - cutoff ) / ( 1.0 - cutoff );\",\n\t\t\t\t\"attenuation = max( attenuation, 0.0 );\",\n\t\t\t\t\"attenuation *= attenuation;\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"combine\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"void main() { \",\n\n\t\t\t\t// sphere proxy needs real position\n\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"spotLight\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerNormalDepth: { type: \"t\", value: null },\n\t\t\tsamplerColor: \t\t{ type: \"t\", value: null },\n\t\t\tmatProjInverse: { type: \"m4\", value: new THREE.Matrix4() },\n\t\t\tviewWidth: \t\t{ type: \"f\", value: 800 },\n\t\t\tviewHeight: \t{ type: \"f\", value: 600 },\n\n\t\t\tlightPositionVS :{ type: \"v3\", value: new THREE.Vector3( 0, 1, 0 ) },\n\t\t\tlightDirectionVS:{ type: \"v3\", value: new THREE.Vector3( 0, 1, 0 ) },\n\t\t\tlightColor: \t{ type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\tlightIntensity: { type: \"f\", value: 1.0 },\n\t\t\tlightDistance: \t{ type: \"f\", value: 1.0 },\n\t\t\tlightAngle: \t{ type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform vec3 lightPositionVS;\",\n\t\t\t\"uniform vec3 lightDirectionVS;\",\n\n\t\t\t\"uniform sampler2D samplerColor;\",\n\t\t\t\"uniform sampler2D samplerNormalDepth;\",\n\n\t\t\t\"uniform float viewHeight;\",\n\t\t\t\"uniform float viewWidth;\",\n\n\t\t\t\"uniform float lightAngle;\",\n\t\t\t\"uniform float lightIntensity;\",\n\t\t\t\"uniform vec3 lightColor;\",\n\n\t\t\t\"uniform mat4 matProjInverse;\",\n\n\t\t\tTHREE.DeferredShaderChunk[ \"unpackFloat\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeVertexPositionVS\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeNormal\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"unpackColorMap\" ],\n\n\t\t\t\t// compute light\n\n\t\t\t\t\"vec3 lightVector = normalize( lightPositionVS.xyz - vertexPositionVS.xyz );\",\n\n\t\t\t\t\"float rho = dot( lightDirectionVS, lightVector );\",\n\t\t\t\t\"float rhoMax = cos( lightAngle * 0.5 );\",\n\n\t\t\t\t\"if ( rho <= rhoMax ) discard;\",\n\n\t\t\t\t\"float theta = rhoMax + 0.0001;\",\n\t\t\t\t\"float phi = rhoMax + 0.05;\",\n\t\t\t\t\"float falloff = 4.0;\",\n\n\t\t\t\t\"float spot = 0.0;\",\n\n\t\t\t\t\"if ( rho >= phi ) {\",\n\n\t\t\t\t\t\"spot = 1.0;\",\n\n\t\t\t\t\"} else if ( rho <= theta ) {\",\n\n\t\t\t\t\t\"spot = 0.0;\",\n\n\t\t\t\t\"} else { \",\n\n\t\t\t\t\t\"spot = pow( ( rho - theta ) / ( phi - theta ), falloff );\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeDiffuse\" ],\n\n\t\t\t\t\"diffuse *= spot;\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeSpecular\" ],\n\n\t\t\t\t// combine\n\n\t\t\t\t\"const float attenuation = 1.0;\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"combine\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"void main() { \",\n\n\t\t\t\t// full screen quad proxy\n\n\t\t\t\t\"gl_Position = vec4( sign( position.xy ), 0.0, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"directionalLight\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerNormalDepth: { type: \"t\", value: null },\n\t\t\tsamplerColor: \t\t{ type: \"t\", value: null },\n\t\t\tmatProjInverse: { type: \"m4\", value: new THREE.Matrix4() },\n\t\t\tviewWidth: \t\t{ type: \"f\", value: 800 },\n\t\t\tviewHeight: \t{ type: \"f\", value: 600 },\n\n\t\t\tlightDirectionVS: { type: \"v3\", value: new THREE.Vector3( 0, 1, 0 ) },\n\t\t\tlightColor: \t{ type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\tlightIntensity: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform sampler2D samplerColor;\",\n\t\t\t\"uniform sampler2D samplerNormalDepth;\",\n\n\t\t\t\"uniform float lightRadius;\",\n\t\t\t\"uniform float lightIntensity;\",\n\t\t\t\"uniform float viewHeight;\",\n\t\t\t\"uniform float viewWidth;\",\n\n\t\t\t\"uniform vec3 lightColor;\",\n\t\t\t\"uniform vec3 lightDirectionVS;\",\n\n\t\t\t\"uniform mat4 matProjInverse;\",\n\n\t\t\tTHREE.DeferredShaderChunk[ \"unpackFloat\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeVertexPositionVS\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeNormal\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"unpackColorMap\" ],\n\n\t\t\t\t// compute light\n\n\t\t\t\t\"vec3 lightVector = lightDirectionVS;\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeDiffuse\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeSpecular\" ],\n\n\t\t\t\t// combine\n\n\t\t\t\t\"const float attenuation = 1.0;\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"combine\" ],\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"void main() { \",\n\n\t\t\t\t// full screen quad proxy\n\n\t\t\t\t\"gl_Position = vec4( sign( position.xy ), 0.0, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"hemisphereLight\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerNormalDepth: { type: \"t\", value: null },\n\t\t\tsamplerColor: \t\t{ type: \"t\", value: null },\n\t\t\tmatProjInverse: { type: \"m4\", value: new THREE.Matrix4() },\n\t\t\tviewWidth: \t\t{ type: \"f\", value: 800 },\n\t\t\tviewHeight: \t{ type: \"f\", value: 600 },\n\n\t\t\tlightDirectionVS: { type: \"v3\", value: new THREE.Vector3( 0, 1, 0 ) },\n\t\t\tlightColorSky: \t { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\tlightColorGround: { type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\tlightIntensity: { type: \"f\", value: 1.0 }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform sampler2D samplerColor;\",\n\t\t\t\"uniform sampler2D samplerNormalDepth;\",\n\n\t\t\t\"uniform float lightRadius;\",\n\t\t\t\"uniform float lightIntensity;\",\n\t\t\t\"uniform float viewHeight;\",\n\t\t\t\"uniform float viewWidth;\",\n\n\t\t\t\"uniform vec3 lightColorSky;\",\n\t\t\t\"uniform vec3 lightColorGround;\",\n\t\t\t\"uniform vec3 lightDirectionVS;\",\n\n\t\t\t\"uniform mat4 matProjInverse;\",\n\n\t\t\tTHREE.DeferredShaderChunk[ \"unpackFloat\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeVertexPositionVS\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeNormal\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"unpackColorMap\" ],\n\n\t\t\t\t// compute light\n\n\t\t\t\t\"vec3 lightVector = lightDirectionVS;\",\n\n\t\t\t\t// diffuse\n\n\t\t\t\t\"float dotProduct = dot( normal, lightVector );\",\n\t\t\t\t\"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\",\n\n\t\t\t\t\"vec3 hemiColor = mix( lightColorGround, lightColorSky, hemiDiffuseWeight );\",\n\n\t\t\t\t\"vec3 diffuse = hemiColor;\",\n\n\t\t\t\t// specular (sky light)\n\n\t\t\t\t\"vec3 hemiHalfVectorSky = normalize( lightVector - vertexPositionVS.xyz );\",\n\t\t\t\t\"float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\",\n\t\t\t\t\"float hemiSpecularWeightSky = max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\",\n\n\t\t\t\t// specular (ground light)\n\n\t\t\t\t\"vec3 lVectorGround = -lightVector;\",\n\n\t\t\t\t\"vec3 hemiHalfVectorGround = normalize( lVectorGround - vertexPositionVS.xyz );\",\n\t\t\t\t\"float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\",\n\t\t\t\t\"float hemiSpecularWeightGround = max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\",\n\n\t\t\t\t\"float dotProductGround = dot( normal, lVectorGround );\",\n\n\t\t\t\t\"float specularNormalization = ( shininess + 2.0001 ) / 8.0;\",\n\n\t\t\t\t\"vec3 schlickSky = specularColor + vec3( 1.0 - specularColor ) * pow( 1.0 - dot( lightVector, hemiHalfVectorSky ), 5.0 );\",\n\t\t\t\t\"vec3 schlickGround = specularColor + vec3( 1.0 - specularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\",\n\t\t\t\t\"vec3 specular = hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\",\n\n\t\t\t\t// combine\n\n\t\t\t\t\"gl_FragColor = vec4( lightIntensity * ( albedo * diffuse + specular ), 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"void main() { \",\n\n\t\t\t\t// full screen quad proxy\n\n\t\t\t\t\"gl_Position = vec4( sign( position.xy ), 0.0, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"areaLight\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerNormalDepth: { type: \"t\", value: null },\n\t\t\tsamplerColor: \t\t{ type: \"t\", value: null },\n\t\t\tmatProjInverse: { type: \"m4\", value: new THREE.Matrix4() },\n\t\t\tviewWidth: \t\t{ type: \"f\", value: 800 },\n\t\t\tviewHeight: \t{ type: \"f\", value: 600 },\n\n\t\t\tlightPositionVS: { type: \"v3\", value: new THREE.Vector3( 0, 1, 0 ) },\n\t\t\tlightNormalVS: \t { type: \"v3\", value: new THREE.Vector3( 0, -1, 0 ) },\n\t\t\tlightRightVS: \t { type: \"v3\", value: new THREE.Vector3( 1, 0, 0 ) },\n\t\t\tlightUpVS: \t { type: \"v3\", value: new THREE.Vector3( 1, 0, 0 ) },\n\n\t\t\tlightColor: \t{ type: \"c\", value: new THREE.Color( 0x000000 ) },\n\t\t\tlightIntensity: { type: \"f\", value: 1.0 },\n\n\t\t\tlightWidth: { type: \"f\", value: 1.0 },\n\t\t\tlightHeight: { type: \"f\", value: 1.0 },\n\n\t\t\tconstantAttenuation: { type: \"f\", value: 1.5 },\n\t\t\tlinearAttenuation: { type: \"f\", value: 0.5 },\n\t\t\tquadraticAttenuation: { type: \"f\", value: 0.1 }\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform vec3 lightPositionVS;\",\n\t\t\t\"uniform vec3 lightNormalVS;\",\n\t\t\t\"uniform vec3 lightRightVS;\",\n\t\t\t\"uniform vec3 lightUpVS;\",\n\n\t\t\t\"uniform sampler2D samplerColor;\",\n\t\t\t\"uniform sampler2D samplerNormalDepth;\",\n\n\t\t\t\"uniform float lightWidth;\",\n\t\t\t\"uniform float lightHeight;\",\n\n\t\t\t\"uniform float constantAttenuation;\",\n\t\t\t\"uniform float linearAttenuation;\",\n\t\t\t\"uniform float quadraticAttenuation;\",\n\n\t\t\t\"uniform float lightIntensity;\",\n\t\t\t\"uniform vec3 lightColor;\",\n\n\t\t\t\"uniform float viewHeight;\",\n\t\t\t\"uniform float viewWidth;\",\n\n\t\t\t\"uniform mat4 matProjInverse;\",\n\n\t\t\tTHREE.DeferredShaderChunk[ \"unpackFloat\" ],\n\n\t\t\t\"vec3 projectOnPlane( vec3 point, vec3 planeCenter, vec3 planeNorm ) {\",\n\n\t\t\t\t\"return point - dot( point - planeCenter, planeNorm ) * planeNorm;\",\n\n\t\t\t\"}\",\n\n\t\t\t\"bool sideOfPlane( vec3 point, vec3 planeCenter, vec3 planeNorm ) {\",\n\n\t\t\t\t\"return ( dot( point - planeCenter, planeNorm ) >= 0.0 );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"vec3 linePlaneIntersect( vec3 lp, vec3 lv, vec3 pc, vec3 pn ) {\",\n\n\t\t\t\t\"return lp + lv * ( dot( pn, pc - lp ) / dot( pn, lv ) );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"float calculateAttenuation( float dist ) {\",\n\n\t\t\t\t\"return ( 1.0 / ( constantAttenuation + linearAttenuation * dist + quadraticAttenuation * dist * dist ) );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeVertexPositionVS\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"computeNormal\" ],\n\t\t\t\tTHREE.DeferredShaderChunk[ \"unpackColorMap\" ],\n\n\t\t\t\t\"float w = lightWidth;\",\n\t\t\t\t\"float h = lightHeight;\",\n\n\t\t\t\t\"vec3 proj = projectOnPlane( vertexPositionVS.xyz, lightPositionVS, lightNormalVS );\",\n\t\t\t\t\"vec3 dir = proj - lightPositionVS;\",\n\n\t\t\t\t\"vec2 diagonal = vec2( dot( dir, lightRightVS ), dot( dir, lightUpVS ) );\",\n\t\t\t\t\"vec2 nearest2D = vec2( clamp( diagonal.x, -w, w ), clamp( diagonal.y, -h, h ) );\",\n\t\t\t\t\"vec3 nearestPointInside = vec3( lightPositionVS ) + ( lightRightVS * nearest2D.x + lightUpVS * nearest2D.y );\",\n\n\t\t\t\t\"vec3 lightDir = normalize( nearestPointInside - vertexPositionVS.xyz );\",\n\t\t\t\t\"float NdotL = max( dot( lightNormalVS, -lightDir ), 0.0 );\",\n\t\t\t\t\"float NdotL2 = max( dot( normal, lightDir ), 0.0 );\",\n\n\t\t\t\t//\"if ( NdotL2 * NdotL > 0.0 && sideOfPlane( vertexPositionVS.xyz, lightPositionVS, lightNormalVS ) ) {\",\n\t\t\t\t\"if ( NdotL2 * NdotL > 0.0 ) {\",\n\n\t\t\t\t\t// diffuse\n\n\t\t\t\t\t\"vec3 diffuse = vec3( sqrt( NdotL * NdotL2 ) );\",\n\n\t\t\t\t\t// specular\n\n\t\t\t\t\t\"vec3 specular = vec3( 0.0 );\",\n\n\t\t\t\t\t\"vec3 R = reflect( normalize( -vertexPositionVS.xyz ), normal );\",\n\t\t\t\t\t\"vec3 E = linePlaneIntersect( vertexPositionVS.xyz, R, vec3( lightPositionVS ), lightNormalVS );\",\n\n\t\t\t\t\t\"float specAngle = dot( R, lightNormalVS );\",\n\n\t\t\t\t\t\"if ( specAngle > 0.0 ) {\",\n\n\t\t\t\t\t\t\"vec3 dirSpec = E - vec3( lightPositionVS );\",\n\t\t\t\t\t\t\"vec2 dirSpec2D = vec2( dot( dirSpec, lightRightVS ), dot( dirSpec, lightUpVS ) );\",\n\t\t\t\t\t\t\"vec2 nearestSpec2D = vec2( clamp( dirSpec2D.x, -w, w ), clamp( dirSpec2D.y, -h, h ) );\",\n\t\t\t\t\t\t\"float specFactor = 1.0 - clamp( length( nearestSpec2D - dirSpec2D ) * 0.05 * shininess, 0.0, 1.0 );\",\n\t\t\t\t\t\t\"specular = specularColor * specFactor * specAngle * diffuse;\",\n\n\t\t\t\t\t\"}\",\n\n\t\t\t\t\t// combine\n\n\t\t\t\t\t\"float dist = distance( vertexPositionVS.xyz, nearestPointInside );\",\n\t\t\t\t\t\"float attenuation = calculateAttenuation( dist );\",\n\n\t\t\t\t\tTHREE.DeferredShaderChunk[ \"combine\" ],\n\n\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\"discard;\",\n\n\t\t\t\t\"}\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t// full screen quad proxy\n\n\t\t\t\t\"gl_Position = vec4( sign( position.xy ), 0.0, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t},\n\n\t\"emissiveLight\" : {\n\n\t\tuniforms: {\n\n\t\t\tsamplerColor: \t{ type: \"t\", value: null },\n\t\t\tviewWidth: \t\t{ type: \"f\", value: 800 },\n\t\t\tviewHeight: \t{ type: \"f\", value: 600 },\n\n\t\t},\n\n\t\tfragmentShader : [\n\n\t\t\t\"uniform sampler2D samplerColor;\",\n\n\t\t\t\"uniform float viewHeight;\",\n\t\t\t\"uniform float viewWidth;\",\n\n\t\t\tTHREE.DeferredShaderChunk[ \"unpackFloat\" ],\n\n\t\t\t\"void main() {\",\n\n\t\t\t\t\"vec2 texCoord = gl_FragCoord.xy / vec2( viewWidth, viewHeight );\",\n\n\t\t\t\t\"vec4 colorMap = texture2D( samplerColor, texCoord );\",\n\t\t\t\t\"vec3 emissiveColor = float_to_vec3( abs( colorMap.w ) );\",\n\n\t\t\t\t\"gl_FragColor = vec4( emissiveColor, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\"),\n\n\t\tvertexShader : [\n\n\t\t\t\"void main() { \",\n\n\t\t\t\t// full screen quad proxy\n\n\t\t\t\t\"gl_Position = vec4( sign( position.xy ), 0.0, 1.0 );\",\n\n\t\t\t\"}\"\n\n\t\t].join(\"\\n\")\n\n\t}\n\n};\n"
},
"$:/plugins/rboue/Three.js-plus/icon": {
"created": "20150122113649353",
"modified": "20150122113650949",
"title": "$:/plugins/rboue/Three.js-plus/icon",
"type": "image/png",
"text": "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\n"
},
"$:/plugins/rboue/Three.js-plus/license": {
"title": "$:/plugins/rboue/Three.js-plus/license",
"text": "!Plugin license\nCopyright (C) 2015 René Boué (rboue) <rboue01 (at) gmail (dot) com><br>\nAll rights reserved.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n\n!Three.js r69 license\nThe Three.js r69 LICENSE file is as follows :\n\n```\nThe MIT License\n\nCopyright © 2010-2014 three.js authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n```"
},
"$:/plugins/rboue/Three.js-plus/readme": {
"title": "$:/plugins/rboue/Three.js-plus/readme",
"text": "Three.js r69 extras for ~TiddlyWiki (needs Three.js plugin)."
}
}
}
{
"tiddlers": {
"$:/config/EditorTypeMappings/application/javascript": {
"title": "$:/config/EditorTypeMappings/application/javascript",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/json": {
"title": "$:/config/EditorTypeMappings/application/json",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/x-tiddler-dictionary": {
"title": "$:/config/EditorTypeMappings/application/x-tiddler-dictionary",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/css": {
"title": "$:/config/EditorTypeMappings/text/css",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/html": {
"title": "$:/config/EditorTypeMappings/text/html",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/plain": {
"title": "$:/config/EditorTypeMappings/text/plain",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/x-tiddlywiki",
"text": "codemirror"
},
"$:/core/modules/widgets/edit-codemirror.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-codemirror.js\ntype: application/javascript\nmodule-type: widget\n\nCodemirror-based text editor widget\n\nConfig options \"$:/config/CodeMirror\" e.g. to allow vim key bindings\n {\n\t\"require\": [\n\t\t\"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js\",\n\t\t\"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js\",\n\t\t\"$:/plugins/tiddlywiki/codemirror/keymap/vim.js\"\n\t],\n\t\"configuration\": {\n\t\t\t\"keyMap\": \"vim\",\n\t\t\t\"showCursorWhenSelecting\": true\n\t}\n}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CODEMIRROR_OPTIONS = \"$:/config/CodeMirror\";\n\n// Install CodeMirror\nif($tw.browser && !window.CodeMirror) {\n\twindow.CodeMirror = require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js\");\n\t// Install required CodeMirror plugins\n\tvar configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}),\n\t\treq = configOptions.require;\n\tif(req) {\n\t\tif($tw.utils.isArray(req)) {\n\t\t\tfor(var index=0; index<req.length; index++) {\n\t\t\t\trequire(req[index]);\n\t\t\t}\n\t\t} else {\n\t\t\trequire(req);\n\t\t}\n\t}\n}\n\nvar MIN_TEXT_AREA_HEIGHT = 100; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditCodeMirrorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditCodeMirrorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditCodeMirrorWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the configuration options for the CodeMirror object\n\tvar config = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}).configuration || {},\n\t\teditInfo = this.getEditInfo();\n\tif(!(\"lineWrapping\" in config)) {\n\t\tconfig.lineWrapping = true;\n\t}\n\tif(!(\"lineNumbers\" in config)) {\n\t\tconfig.lineNumbers = true;\n\t}\n\tconfig.mode = editInfo.type;\n\tconfig.value = editInfo.value;\n\t// Create the CodeMirror instance\n\tvar cm = window.CodeMirror(function(domNode) {\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tself.domNodes.push(domNode);\n\t},config);\n\t// Set up a change event handler\n\tcm.on(\"change\",function() {\n\t\tself.saveChanges(cm.getValue());\n\t});\n\tthis.codeMirrorInstance = cm;\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditCodeMirrorWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\ttype = \"text/plain\",\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\tif(this.editField === \"text\") {\n\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t}\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\tif(this.editType) {\n\t\ttype = this.editType;\n\t}\n\treturn {value: value || \"\", type: type, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditCodeMirrorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editType = this.getAttribute(\"type\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditCodeMirrorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely rerender if any of our attributes have changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\tthis.updateEditor(this.getEditInfo().value);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditCodeMirrorWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditCodeMirrorWidget.prototype.updateEditorDomNode = function(text) {\n\tif(this.codeMirrorInstance) {\n\t\tif(!this.codeMirrorInstance.hasFocus()) {\n\t\t\tthis.codeMirrorInstance.setValue(text);\n\t\t}\n\t}\n};\n\nEditCodeMirrorWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\nexports[\"edit-codemirror\"] = EditCodeMirrorWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-codemirror.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.js",
"module-type": "library",
"text": "// This is CodeMirror (http://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n module.exports = mod();\n else if (typeof define == \"function\" && define.amd) // AMD\n return define([], mod);\n else // Plain browser env\n this.CodeMirror = mod();\n})(function() {\n \"use strict\";\n\n // BROWSER SNIFFING\n\n // Kludges for bugs and behavior differences that can't be feature\n // detected are enabled based on userAgent etc sniffing.\n\n var gecko = /gecko\\/\\d/i.test(navigator.userAgent);\n // ie_uptoN means Internet Explorer version N or lower\n var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n var ie_upto7 = ie_upto10 && (document.documentMode == null || document.documentMode < 8);\n var ie_upto8 = ie_upto10 && (document.documentMode == null || document.documentMode < 9);\n var ie_upto9 = ie_upto10 && (document.documentMode == null || document.documentMode < 10);\n var ie_11up = /Trident\\/([7-9]|\\d{2,})\\./.test(navigator.userAgent);\n var ie = ie_upto10 || ie_11up;\n var webkit = /WebKit\\//.test(navigator.userAgent);\n var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(navigator.userAgent);\n var chrome = /Chrome\\//.test(navigator.userAgent);\n var presto = /Opera\\//.test(navigator.userAgent);\n var safari = /Apple Computer/.test(navigator.vendor);\n var khtml = /KHTML\\//.test(navigator.userAgent);\n var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(navigator.userAgent);\n var phantom = /PhantomJS/.test(navigator.userAgent);\n\n var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\\/\\w+/.test(navigator.userAgent);\n // This is woefully incomplete. Suggestions for alternative methods welcome.\n var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);\n var mac = ios || /Mac/.test(navigator.platform);\n var windows = /win/i.test(navigator.platform);\n\n var presto_version = presto && navigator.userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n if (presto_version) presto_version = Number(presto_version[1]);\n if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n var captureRightClick = gecko || (ie && !ie_upto8);\n\n // Optimize some code when these features are not used.\n var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n // EDITOR CONSTRUCTOR\n\n // A CodeMirror instance represents an editor. This is the object\n // that user code is usually dealing with.\n\n function CodeMirror(place, options) {\n if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);\n\n this.options = options = options || {};\n // Determine effective options based on given values and defaults.\n copyObj(defaults, options, false);\n setGuttersForLineNumbers(options);\n\n var doc = options.value;\n if (typeof doc == \"string\") doc = new Doc(doc, options.mode);\n this.doc = doc;\n\n var display = this.display = new Display(place, doc);\n display.wrapper.CodeMirror = this;\n updateGutters(this);\n themeChanged(this);\n if (options.lineWrapping)\n this.display.wrapper.className += \" CodeMirror-wrap\";\n if (options.autofocus && !mobile) focusInput(this);\n\n this.state = {\n keyMaps: [], // stores maps added by addKeyMap\n overlays: [], // highlighting overlays, as added by addOverlay\n modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info\n overwrite: false, focused: false,\n suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in readInput\n draggingText: false,\n highlight: new Delayed() // stores highlight worker timeout\n };\n\n // Override magic textarea content restore that IE sometimes does\n // on our hidden textarea on reload\n if (ie_upto10) setTimeout(bind(resetInput, this, true), 20);\n\n registerEventHandlers(this);\n ensureGlobalHandlers();\n\n var cm = this;\n runInOp(this, function() {\n cm.curOp.forceUpdate = true;\n attachDoc(cm, doc);\n\n if ((options.autofocus && !mobile) || activeElt() == display.input)\n setTimeout(bind(onFocus, cm), 20);\n else\n onBlur(cm);\n\n for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))\n optionHandlers[opt](cm, options[opt], Init);\n for (var i = 0; i < initHooks.length; ++i) initHooks[i](cm);\n });\n }\n\n // DISPLAY CONSTRUCTOR\n\n // The display handles the DOM integration, both for input reading\n // and content drawing. It holds references to DOM nodes and\n // display-related state.\n\n function Display(place, doc) {\n var d = this;\n\n // The semihidden textarea that is focused when the editor is\n // focused, and receives input.\n var input = d.input = elt(\"textarea\", null, null, \"position: absolute; padding: 0; width: 1px; height: 1em; outline: none\");\n // The textarea is kept positioned near the cursor to prevent the\n // fact that it'll be scrolled into view on input from scrolling\n // our fake cursor out of view. On webkit, when wrap=off, paste is\n // very slow. So make the area wide instead.\n if (webkit) input.style.width = \"1000px\";\n else input.setAttribute(\"wrap\", \"off\");\n // If border: 0; -- iOS fails to open keyboard (issue #1287)\n if (ios) input.style.border = \"1px solid black\";\n input.setAttribute(\"autocorrect\", \"off\"); input.setAttribute(\"autocapitalize\", \"off\"); input.setAttribute(\"spellcheck\", \"false\");\n\n // Wraps and hides input textarea\n d.inputDiv = elt(\"div\", [input], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n // The fake scrollbar elements.\n d.scrollbarH = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n d.scrollbarV = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n // Covers bottom-right square when both scrollbars are present.\n d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n // Covers bottom of gutter when coverGutterNextToScrollbar is on\n // and h scrollbar is present.\n d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n // Will contain the actual code, positioned to cover the viewport.\n d.lineDiv = elt(\"div\", null, \"CodeMirror-code\");\n // Elements are added to these to represent selection and cursors.\n d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n // A visibility: hidden element used to find the size of things.\n d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n // When lines outside of the viewport are measured, they are drawn in this.\n d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n // Wraps everything that needs to exist inside the vertically-padded coordinate system\n d.lineSpace = elt(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [elt(\"div\", [d.lineSpace], \"CodeMirror-lines\")], null, \"position: relative\");\n // Set to the height of the document, allowing scrolling.\n d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n // Behavior of elts with overflow: auto and padding is\n // inconsistent across browsers. This is used to ensure the\n // scrollable area is big enough.\n d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerCutOff + \"px; width: 1px;\");\n // Will contain the gutters, if any.\n d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n d.lineGutter = null;\n // Actual scrollable element.\n d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n d.scroller.setAttribute(\"tabIndex\", \"-1\");\n // The element in which the editor lives.\n d.wrapper = elt(\"div\", [d.inputDiv, d.scrollbarH, d.scrollbarV,\n d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n if (ie_upto7) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n // Needed to hide big blue blinking cursor on Mobile Safari\n if (ios) input.style.width = \"0px\";\n if (!webkit) d.scroller.draggable = true;\n // Needed to handle Tab key in KHTML\n if (khtml) { d.inputDiv.style.height = \"1px\"; d.inputDiv.style.position = \"absolute\"; }\n // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n if (ie_upto7) d.scrollbarH.style.minHeight = d.scrollbarV.style.minWidth = \"18px\";\n\n if (place.appendChild) place.appendChild(d.wrapper);\n else place(d.wrapper);\n\n // Current rendered range (may be bigger than the view window).\n d.viewFrom = d.viewTo = doc.first;\n // Information about the rendered lines.\n d.view = [];\n // Holds info about a single rendered line when it was rendered\n // for measurement, while not in view.\n d.externalMeasured = null;\n // Empty space (in pixels) above the view\n d.viewOffset = 0;\n d.lastSizeC = 0;\n d.updateLineNumbers = null;\n\n // Used to only resize the line number gutter when necessary (when\n // the amount of lines crosses a boundary that makes its width change)\n d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n // See readInput and resetInput\n d.prevInput = \"\";\n // Set to true when a non-horizontal-scrolling line widget is\n // added. As an optimization, line widget aligning is skipped when\n // this is false.\n d.alignWidgets = false;\n // Flag that indicates whether we expect input to appear real soon\n // now (after some event like 'keypress' or 'input') and are\n // polling intensively.\n d.pollingFast = false;\n // Self-resetting timeout for the poller\n d.poll = new Delayed();\n\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n // Tracks when resetInput has punted to just putting a short\n // string into the textarea instead of the full selection.\n d.inaccurateSelection = false;\n\n // Tracks the maximum line length so that the horizontal scrollbar\n // can be kept static when scrolling.\n d.maxLine = null;\n d.maxLineLength = 0;\n d.maxLineChanged = false;\n\n // Used for measuring wheel scrolling granularity\n d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n // True when shift is held down.\n d.shift = false;\n\n // Used to track whether anything happened since the context menu\n // was opened.\n d.selForContextMenu = null;\n }\n\n // STATE UPDATES\n\n // Used to get the editor into a consistent state again when options change.\n\n function loadMode(cm) {\n cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);\n resetModeState(cm);\n }\n\n function resetModeState(cm) {\n cm.doc.iter(function(line) {\n if (line.stateAfter) line.stateAfter = null;\n if (line.styles) line.styles = null;\n });\n cm.doc.frontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) regChange(cm);\n }\n\n function wrappingChanged(cm) {\n if (cm.options.lineWrapping) {\n addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n cm.display.sizer.style.minWidth = \"\";\n } else {\n rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n findMaxLine(cm);\n }\n estimateLineHeights(cm);\n regChange(cm);\n clearCaches(cm);\n setTimeout(function(){updateScrollbars(cm);}, 100);\n }\n\n // Returns a function that estimates the height of a line, to use as\n // first approximation until the line becomes visible (and is thus\n // properly measurable).\n function estimateHeight(cm) {\n var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n return function(line) {\n if (lineIsHidden(cm.doc, line)) return 0;\n\n var widgetsHeight = 0;\n if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {\n if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;\n }\n\n if (wrapping)\n return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;\n else\n return widgetsHeight + th;\n };\n }\n\n function estimateLineHeights(cm) {\n var doc = cm.doc, est = estimateHeight(cm);\n doc.iter(function(line) {\n var estHeight = est(line);\n if (estHeight != line.height) updateLineHeight(line, estHeight);\n });\n }\n\n function keyMapChanged(cm) {\n var map = keyMap[cm.options.keyMap], style = map.style;\n cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-keymap-\\S+/g, \"\") +\n (style ? \" cm-keymap-\" + style : \"\");\n }\n\n function themeChanged(cm) {\n cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n clearCaches(cm);\n }\n\n function guttersChanged(cm) {\n updateGutters(cm);\n regChange(cm);\n setTimeout(function(){alignHorizontally(cm);}, 20);\n }\n\n // Rebuild the gutter elements, ensure the margin to the left of the\n // code matches their width.\n function updateGutters(cm) {\n var gutters = cm.display.gutters, specs = cm.options.gutters;\n removeChildren(gutters);\n for (var i = 0; i < specs.length; ++i) {\n var gutterClass = specs[i];\n var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + gutterClass));\n if (gutterClass == \"CodeMirror-linenumbers\") {\n cm.display.lineGutter = gElt;\n gElt.style.width = (cm.display.lineNumWidth || 1) + \"px\";\n }\n }\n gutters.style.display = i ? \"\" : \"none\";\n updateGutterSpace(cm);\n }\n\n function updateGutterSpace(cm) {\n var width = cm.display.gutters.offsetWidth;\n cm.display.sizer.style.marginLeft = width + \"px\";\n cm.display.scrollbarH.style.left = cm.options.fixedGutter ? width + \"px\" : 0;\n }\n\n // Compute the character length of a line, taking into account\n // collapsed ranges (see markText) that might hide parts, and join\n // other lines onto it.\n function lineLength(line) {\n if (line.height == 0) return 0;\n var len = line.text.length, merged, cur = line;\n while (merged = collapsedSpanAtStart(cur)) {\n var found = merged.find(0, true);\n cur = found.from.line;\n len += found.from.ch - found.to.ch;\n }\n cur = line;\n while (merged = collapsedSpanAtEnd(cur)) {\n var found = merged.find(0, true);\n len -= cur.text.length - found.from.ch;\n cur = found.to.line;\n len += cur.text.length - found.to.ch;\n }\n return len;\n }\n\n // Find the longest line in the document.\n function findMaxLine(cm) {\n var d = cm.display, doc = cm.doc;\n d.maxLine = getLine(doc, doc.first);\n d.maxLineLength = lineLength(d.maxLine);\n d.maxLineChanged = true;\n doc.iter(function(line) {\n var len = lineLength(line);\n if (len > d.maxLineLength) {\n d.maxLineLength = len;\n d.maxLine = line;\n }\n });\n }\n\n // Make sure the gutters options contains the element\n // \"CodeMirror-linenumbers\" when the lineNumbers option is true.\n function setGuttersForLineNumbers(options) {\n var found = indexOf(options.gutters, \"CodeMirror-linenumbers\");\n if (found == -1 && options.lineNumbers) {\n options.gutters = options.gutters.concat([\"CodeMirror-linenumbers\"]);\n } else if (found > -1 && !options.lineNumbers) {\n options.gutters = options.gutters.slice(0);\n options.gutters.splice(found, 1);\n }\n }\n\n // SCROLLBARS\n\n // Prepare DOM reads needed to update the scrollbars. Done in one\n // shot to minimize update/measure roundtrips.\n function measureForScrollbars(cm) {\n var scroll = cm.display.scroller;\n return {\n clientHeight: scroll.clientHeight,\n barHeight: cm.display.scrollbarV.clientHeight,\n scrollWidth: scroll.scrollWidth, clientWidth: scroll.clientWidth,\n barWidth: cm.display.scrollbarH.clientWidth,\n docHeight: Math.round(cm.doc.height + paddingVert(cm.display))\n };\n }\n\n // Re-synchronize the fake scrollbars with the actual size of the\n // content.\n function updateScrollbars(cm, measure) {\n if (!measure) measure = measureForScrollbars(cm);\n var d = cm.display;\n var scrollHeight = measure.docHeight + scrollerCutOff;\n var needsH = measure.scrollWidth > measure.clientWidth;\n var needsV = scrollHeight > measure.clientHeight;\n if (needsV) {\n d.scrollbarV.style.display = \"block\";\n d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + \"px\" : \"0\";\n // A bug in IE8 can cause this value to be negative, so guard it.\n d.scrollbarV.firstChild.style.height =\n Math.max(0, scrollHeight - measure.clientHeight + (measure.barHeight || d.scrollbarV.clientHeight)) + \"px\";\n } else {\n d.scrollbarV.style.display = \"\";\n d.scrollbarV.firstChild.style.height = \"0\";\n }\n if (needsH) {\n d.scrollbarH.style.display = \"block\";\n d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + \"px\" : \"0\";\n d.scrollbarH.firstChild.style.width =\n (measure.scrollWidth - measure.clientWidth + (measure.barWidth || d.scrollbarH.clientWidth)) + \"px\";\n } else {\n d.scrollbarH.style.display = \"\";\n d.scrollbarH.firstChild.style.width = \"0\";\n }\n if (needsH && needsV) {\n d.scrollbarFiller.style.display = \"block\";\n d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + \"px\";\n } else d.scrollbarFiller.style.display = \"\";\n if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n d.gutterFiller.style.display = \"block\";\n d.gutterFiller.style.height = scrollbarWidth(d.measure) + \"px\";\n d.gutterFiller.style.width = d.gutters.offsetWidth + \"px\";\n } else d.gutterFiller.style.display = \"\";\n\n if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {\n if (scrollbarWidth(d.measure) === 0) {\n var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;\n var barMouseDown = function(e) {\n if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)\n operation(cm, onMouseDown)(e);\n };\n on(d.scrollbarV, \"mousedown\", barMouseDown);\n on(d.scrollbarH, \"mousedown\", barMouseDown);\n }\n cm.state.checkedOverlayScrollbar = true;\n }\n }\n\n // Compute the lines that are visible in a given viewport (defaults\n // the the current scroll position). viewPort may contain top,\n // height, and ensure (see op.scrollToPos) properties.\n function visibleLines(display, doc, viewPort) {\n var top = viewPort && viewPort.top != null ? viewPort.top : display.scroller.scrollTop;\n top = Math.floor(top - paddingTop(display));\n var bottom = viewPort && viewPort.bottom != null ? viewPort.bottom : top + display.wrapper.clientHeight;\n\n var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n // forces those lines into the viewport (if possible).\n if (viewPort && viewPort.ensure) {\n var ensureFrom = viewPort.ensure.from.line, ensureTo = viewPort.ensure.to.line;\n if (ensureFrom < from)\n return {from: ensureFrom,\n to: lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight)};\n if (Math.min(ensureTo, doc.lastLine()) >= to)\n return {from: lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight),\n to: ensureTo};\n }\n return {from: from, to: to};\n }\n\n // LINE NUMBERS\n\n // Re-align line numbers and gutter marks to compensate for\n // horizontal scrolling.\n function alignHorizontally(cm) {\n var display = cm.display, view = display.view;\n if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;\n var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n for (var i = 0; i < view.length; i++) if (!view[i].hidden) {\n if (cm.options.fixedGutter && view[i].gutter)\n view[i].gutter.style.left = left;\n var align = view[i].alignable;\n if (align) for (var j = 0; j < align.length; j++)\n align[j].style.left = left;\n }\n if (cm.options.fixedGutter)\n display.gutters.style.left = (comp + gutterW) + \"px\";\n }\n\n // Used to ensure that the line number gutter is still the right\n // size for the current document size. Returns true when an update\n // is needed.\n function maybeUpdateLineNumberWidth(cm) {\n if (!cm.options.lineNumbers) return false;\n var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n if (last.length != display.lineNumChars) {\n var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n display.lineGutter.style.width = \"\";\n display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);\n display.lineNumWidth = display.lineNumInnerWidth + padding;\n display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n display.lineGutter.style.width = display.lineNumWidth + \"px\";\n updateGutterSpace(cm);\n return true;\n }\n return false;\n }\n\n function lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber));\n }\n\n // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n // but using getBoundingClientRect to get a sub-pixel-accurate\n // result.\n function compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;\n }\n\n // DISPLAY DRAWING\n\n // Updates the display, selection, and scrollbars, using the\n // information in display.view to find out which nodes are no longer\n // up-to-date. Tries to bail out early when no changes are needed,\n // unless forced is true.\n // Returns true if an actual update happened, false otherwise.\n function updateDisplay(cm, viewPort, forced) {\n var oldFrom = cm.display.viewFrom, oldTo = cm.display.viewTo, updated;\n var visible = visibleLines(cm.display, cm.doc, viewPort);\n for (var first = true;; first = false) {\n var oldWidth = cm.display.scroller.clientWidth;\n if (!updateDisplayInner(cm, visible, forced)) break;\n updated = true;\n\n // If the max line changed since it was last measured, measure it,\n // and ensure the document's width matches it.\n if (cm.display.maxLineChanged && !cm.options.lineWrapping)\n adjustContentWidth(cm);\n\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n setDocumentHeight(cm, barMeasure);\n updateScrollbars(cm, barMeasure);\n if (webkit && cm.options.lineWrapping)\n checkForWebkitWidthBug(cm, barMeasure); // (Issue #2420)\n if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) {\n forced = true;\n continue;\n }\n forced = false;\n\n // Clip forced viewport to actual scrollable area.\n if (viewPort && viewPort.top != null)\n viewPort = {top: Math.min(barMeasure.docHeight - scrollerCutOff - barMeasure.clientHeight, viewPort.top)};\n // Updated line heights might result in the drawn area not\n // actually covering the viewport. Keep looping until it does.\n visible = visibleLines(cm.display, cm.doc, viewPort);\n if (visible.from >= cm.display.viewFrom && visible.to <= cm.display.viewTo)\n break;\n }\n\n cm.display.updateLineNumbers = null;\n if (updated) {\n signalLater(cm, \"update\", cm);\n if (cm.display.viewFrom != oldFrom || cm.display.viewTo != oldTo)\n signalLater(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n }\n return updated;\n }\n\n // Does the actual updating of the line display. Bails out\n // (returning false) when there is nothing to be done and forced is\n // false.\n function updateDisplayInner(cm, visible, forced) {\n var display = cm.display, doc = cm.doc;\n if (!display.wrapper.offsetWidth) {\n resetView(cm);\n return;\n }\n\n // Bail out if the visible area is already rendered and nothing changed.\n if (!forced && visible.from >= display.viewFrom && visible.to <= display.viewTo &&\n countDirtyView(cm) == 0)\n return;\n\n if (maybeUpdateLineNumberWidth(cm))\n resetView(cm);\n var dims = getDimensions(cm);\n\n // Compute a suitable new viewport (from & to)\n var end = doc.first + doc.size;\n var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);\n var to = Math.min(end, visible.to + cm.options.viewportMargin);\n if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);\n if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);\n if (sawCollapsedSpans) {\n from = visualLineNo(cm.doc, from);\n to = visualLineEndNo(cm.doc, to);\n }\n\n var different = from != display.viewFrom || to != display.viewTo ||\n display.lastSizeC != display.wrapper.clientHeight;\n adjustView(cm, from, to);\n\n display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n // Position the mover div to align with the current scroll position\n cm.display.mover.style.top = display.viewOffset + \"px\";\n\n var toUpdate = countDirtyView(cm);\n if (!different && toUpdate == 0 && !forced) return;\n\n // For big changes, we hide the enclosing element during the\n // update, since that speeds up the operations on most browsers.\n var focused = activeElt();\n if (toUpdate > 4) display.lineDiv.style.display = \"none\";\n patchDisplay(cm, display.updateLineNumbers, dims);\n if (toUpdate > 4) display.lineDiv.style.display = \"\";\n // There might have been a widget with a focused element that got\n // hidden or updated, if so re-focus it.\n if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();\n\n // Prevent selection and cursors from interfering with the scroll\n // width.\n removeChildren(display.cursorDiv);\n removeChildren(display.selectionDiv);\n\n if (different) {\n display.lastSizeC = display.wrapper.clientHeight;\n startWorker(cm, 400);\n }\n\n updateHeightsInViewport(cm);\n\n return true;\n }\n\n function adjustContentWidth(cm) {\n var display = cm.display;\n var width = measureChar(cm, display.maxLine, display.maxLine.text.length).left;\n display.maxLineChanged = false;\n var minWidth = Math.max(0, width + 3);\n var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + minWidth + scrollerCutOff - display.scroller.clientWidth);\n display.sizer.style.minWidth = minWidth + \"px\";\n if (maxScrollLeft < cm.doc.scrollLeft)\n setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);\n }\n\n function setDocumentHeight(cm, measure) {\n cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n cm.display.gutters.style.height = Math.max(measure.docHeight, measure.clientHeight - scrollerCutOff) + \"px\";\n }\n\n\n function checkForWebkitWidthBug(cm, measure) {\n // Work around Webkit bug where it sometimes reserves space for a\n // non-existing phantom scrollbar in the scroller (Issue #2420)\n if (cm.display.sizer.offsetWidth + cm.display.gutters.offsetWidth < cm.display.scroller.clientWidth - 1) {\n cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = \"0px\";\n cm.display.gutters.style.height = measure.docHeight + \"px\";\n }\n }\n\n // Read the actual heights of the rendered lines, and update their\n // stored heights to match.\n function updateHeightsInViewport(cm) {\n var display = cm.display;\n var prevBottom = display.lineDiv.offsetTop;\n for (var i = 0; i < display.view.length; i++) {\n var cur = display.view[i], height;\n if (cur.hidden) continue;\n if (ie_upto7) {\n var bot = cur.node.offsetTop + cur.node.offsetHeight;\n height = bot - prevBottom;\n prevBottom = bot;\n } else {\n var box = cur.node.getBoundingClientRect();\n height = box.bottom - box.top;\n }\n var diff = cur.line.height - height;\n if (height < 2) height = textHeight(display);\n if (diff > .001 || diff < -.001) {\n updateLineHeight(cur.line, height);\n updateWidgetHeight(cur.line);\n if (cur.rest) for (var j = 0; j < cur.rest.length; j++)\n updateWidgetHeight(cur.rest[j]);\n }\n }\n }\n\n // Read and store the height of line widgets associated with the\n // given line.\n function updateWidgetHeight(line) {\n if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)\n line.widgets[i].height = line.widgets[i].node.offsetHeight;\n }\n\n // Do a bulk-read of the DOM positions and sizes needed to draw the\n // view, so that we don't interleave reading and writing to the DOM.\n function getDimensions(cm) {\n var d = cm.display, left = {}, width = {};\n for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n left[cm.options.gutters[i]] = n.offsetLeft;\n width[cm.options.gutters[i]] = n.offsetWidth;\n }\n return {fixedPos: compensateForHScroll(d),\n gutterTotalWidth: d.gutters.offsetWidth,\n gutterLeft: left,\n gutterWidth: width,\n wrapperWidth: d.wrapper.clientWidth};\n }\n\n // Sync the actual display DOM structure with display.view, removing\n // nodes for lines that are no longer in view, and creating the ones\n // that are not there yet, and updating the ones that are out of\n // date.\n function patchDisplay(cm, updateNumbersFrom, dims) {\n var display = cm.display, lineNumbers = cm.options.lineNumbers;\n var container = display.lineDiv, cur = container.firstChild;\n\n function rm(node) {\n var next = node.nextSibling;\n // Works around a throw-scroll bug in OS X Webkit\n if (webkit && mac && cm.display.currentWheelTarget == node)\n node.style.display = \"none\";\n else\n node.parentNode.removeChild(node);\n return next;\n }\n\n var view = display.view, lineN = display.viewFrom;\n // Loop over the elements in the view, syncing cur (the DOM nodes\n // in display.lineDiv) with the view as we go.\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (lineView.hidden) {\n } else if (!lineView.node) { // Not drawn yet\n var node = buildLineElement(cm, lineView, lineN, dims);\n container.insertBefore(node, cur);\n } else { // Already drawn\n while (cur != lineView.node) cur = rm(cur);\n var updateNumber = lineNumbers && updateNumbersFrom != null &&\n updateNumbersFrom <= lineN && lineView.lineNumber;\n if (lineView.changes) {\n if (indexOf(lineView.changes, \"gutter\") > -1) updateNumber = false;\n updateLineForChanges(cm, lineView, lineN, dims);\n }\n if (updateNumber) {\n removeChildren(lineView.lineNumber);\n lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n }\n cur = lineView.node.nextSibling;\n }\n lineN += lineView.size;\n }\n while (cur) cur = rm(cur);\n }\n\n // When an aspect of a line changes, a string is added to\n // lineView.changes. This updates the relevant part of the line's\n // DOM structure.\n function updateLineForChanges(cm, lineView, lineN, dims) {\n for (var j = 0; j < lineView.changes.length; j++) {\n var type = lineView.changes[j];\n if (type == \"text\") updateLineText(cm, lineView);\n else if (type == \"gutter\") updateLineGutter(cm, lineView, lineN, dims);\n else if (type == \"class\") updateLineClasses(lineView);\n else if (type == \"widget\") updateLineWidgets(lineView, dims);\n }\n lineView.changes = null;\n }\n\n // Lines with gutter elements, widgets or a background class need to\n // be wrapped, and have the extra elements added to the wrapper div\n function ensureLineWrapped(lineView) {\n if (lineView.node == lineView.text) {\n lineView.node = elt(\"div\", null, null, \"position: relative\");\n if (lineView.text.parentNode)\n lineView.text.parentNode.replaceChild(lineView.node, lineView.text);\n lineView.node.appendChild(lineView.text);\n if (ie_upto7) lineView.node.style.zIndex = 2;\n }\n return lineView.node;\n }\n\n function updateLineBackground(lineView) {\n var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n if (cls) cls += \" CodeMirror-linebackground\";\n if (lineView.background) {\n if (cls) lineView.background.className = cls;\n else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n } else if (cls) {\n var wrap = ensureLineWrapped(lineView);\n lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n }\n }\n\n // Wrapper around buildLineContent which will reuse the structure\n // in display.externalMeasured when possible.\n function getLineContent(cm, lineView) {\n var ext = cm.display.externalMeasured;\n if (ext && ext.line == lineView.line) {\n cm.display.externalMeasured = null;\n lineView.measure = ext.measure;\n return ext.built;\n }\n return buildLineContent(cm, lineView);\n }\n\n // Redraw the line's text. Interacts with the background and text\n // classes because the mode may output tokens that influence these\n // classes.\n function updateLineText(cm, lineView) {\n var cls = lineView.text.className;\n var built = getLineContent(cm, lineView);\n if (lineView.text == lineView.node) lineView.node = built.pre;\n lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n lineView.text = built.pre;\n if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n lineView.bgClass = built.bgClass;\n lineView.textClass = built.textClass;\n updateLineClasses(lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n }\n\n function updateLineClasses(lineView) {\n updateLineBackground(lineView);\n if (lineView.line.wrapClass)\n ensureLineWrapped(lineView).className = lineView.line.wrapClass;\n else if (lineView.node != lineView.text)\n lineView.node.className = \"\";\n var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n lineView.text.className = textClass || \"\";\n }\n\n function updateLineGutter(cm, lineView, lineN, dims) {\n if (lineView.gutter) {\n lineView.node.removeChild(lineView.gutter);\n lineView.gutter = null;\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter =\n wrap.insertBefore(elt(\"div\", null, \"CodeMirror-gutter-wrapper\", \"position: absolute; left: \" +\n (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"),\n lineView.text);\n if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n lineView.lineNumber = gutterWrap.appendChild(\n elt(\"div\", lineNumberFor(cm.options, lineN),\n \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n \"left: \" + dims.gutterLeft[\"CodeMirror-linenumbers\"] + \"px; width: \"\n + cm.display.lineNumInnerWidth + \"px\"));\n if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {\n var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];\n if (found)\n gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\", \"left: \" +\n dims.gutterLeft[id] + \"px; width: \" + dims.gutterWidth[id] + \"px\"));\n }\n }\n }\n\n function updateLineWidgets(lineView, dims) {\n if (lineView.alignable) lineView.alignable = null;\n for (var node = lineView.node.firstChild, next; node; node = next) {\n var next = node.nextSibling;\n if (node.className == \"CodeMirror-linewidget\")\n lineView.node.removeChild(node);\n }\n insertLineWidgets(lineView, dims);\n }\n\n // Build a line's DOM representation from scratch\n function buildLineElement(cm, lineView, lineN, dims) {\n var built = getLineContent(cm, lineView);\n lineView.text = lineView.node = built.pre;\n if (built.bgClass) lineView.bgClass = built.bgClass;\n if (built.textClass) lineView.textClass = built.textClass;\n\n updateLineClasses(lineView);\n updateLineGutter(cm, lineView, lineN, dims);\n insertLineWidgets(lineView, dims);\n return lineView.node;\n }\n\n // A lineView may contain multiple logical lines (when merged by\n // collapsed spans). The widgets for all of them need to be drawn.\n function insertLineWidgets(lineView, dims) {\n insertLineWidgetsFor(lineView.line, lineView, dims, true);\n if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n insertLineWidgetsFor(lineView.rest[i], lineView, dims, false);\n }\n\n function insertLineWidgetsFor(line, lineView, dims, allowAbove) {\n if (!line.widgets) return;\n var wrap = ensureLineWrapped(lineView);\n for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\");\n if (!widget.handleMouseEvents) node.ignoreEvents = true;\n positionLineWidget(widget, node, lineView, dims);\n if (allowAbove && widget.above)\n wrap.insertBefore(node, lineView.gutter || lineView.text);\n else\n wrap.appendChild(node);\n signalLater(widget, \"redraw\");\n }\n }\n\n function positionLineWidget(widget, node, lineView, dims) {\n if (widget.noHScroll) {\n (lineView.alignable || (lineView.alignable = [])).push(node);\n var width = dims.wrapperWidth;\n node.style.left = dims.fixedPos + \"px\";\n if (!widget.coverGutter) {\n width -= dims.gutterTotalWidth;\n node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n }\n node.style.width = width + \"px\";\n }\n if (widget.coverGutter) {\n node.style.zIndex = 5;\n node.style.position = \"relative\";\n if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + \"px\";\n }\n }\n\n // POSITION OBJECT\n\n // A Pos instance represents a position within the text.\n var Pos = CodeMirror.Pos = function(line, ch) {\n if (!(this instanceof Pos)) return new Pos(line, ch);\n this.line = line; this.ch = ch;\n };\n\n // Compare two positions, return 0 if they are the same, a negative\n // number when a is less, and a positive number otherwise.\n var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };\n\n function copyPos(x) {return Pos(x.line, x.ch);}\n function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }\n function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }\n\n // SELECTION / CURSOR\n\n // Selection objects are immutable. A new one is created every time\n // the selection changes. A selection is one or more non-overlapping\n // (and non-touching) ranges, sorted, and an integer that indicates\n // which one is the primary selection (the one that's scrolled into\n // view, that getCursor returns, etc).\n function Selection(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n }\n\n Selection.prototype = {\n primary: function() { return this.ranges[this.primIndex]; },\n equals: function(other) {\n if (other == this) return true;\n if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;\n for (var i = 0; i < this.ranges.length; i++) {\n var here = this.ranges[i], there = other.ranges[i];\n if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;\n }\n return true;\n },\n deepCopy: function() {\n for (var out = [], i = 0; i < this.ranges.length; i++)\n out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));\n return new Selection(out, this.primIndex);\n },\n somethingSelected: function() {\n for (var i = 0; i < this.ranges.length; i++)\n if (!this.ranges[i].empty()) return true;\n return false;\n },\n contains: function(pos, end) {\n if (!end) end = pos;\n for (var i = 0; i < this.ranges.length; i++) {\n var range = this.ranges[i];\n if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n return i;\n }\n return -1;\n }\n };\n\n function Range(anchor, head) {\n this.anchor = anchor; this.head = head;\n }\n\n Range.prototype = {\n from: function() { return minPos(this.anchor, this.head); },\n to: function() { return maxPos(this.anchor, this.head); },\n empty: function() {\n return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;\n }\n };\n\n // Take an unsorted, potentially overlapping set of ranges, and\n // build a selection out of it. 'Consumes' ranges array (modifying\n // it).\n function normalizeSelection(ranges, primIndex) {\n var prim = ranges[primIndex];\n ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });\n primIndex = indexOf(ranges, prim);\n for (var i = 1; i < ranges.length; i++) {\n var cur = ranges[i], prev = ranges[i - 1];\n if (cmp(prev.to(), cur.from()) >= 0) {\n var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n if (i <= primIndex) --primIndex;\n ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n }\n }\n return new Selection(ranges, primIndex);\n }\n\n function simpleSelection(anchor, head) {\n return new Selection([new Range(anchor, head || anchor)], 0);\n }\n\n // Most of the external API clips given positions to make sure they\n // actually exist within the document.\n function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}\n function clipPos(doc, pos) {\n if (pos.line < doc.first) return Pos(doc.first, 0);\n var last = doc.first + doc.size - 1;\n if (pos.line > last) return Pos(last, getLine(doc, last).text.length);\n return clipToLen(pos, getLine(doc, pos.line).text.length);\n }\n function clipToLen(pos, linelen) {\n var ch = pos.ch;\n if (ch == null || ch > linelen) return Pos(pos.line, linelen);\n else if (ch < 0) return Pos(pos.line, 0);\n else return pos;\n }\n function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}\n function clipPosArray(doc, array) {\n for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);\n return out;\n }\n\n // SELECTION UPDATES\n\n // The 'scroll' parameter given to many of these indicated whether\n // the new cursor position should be scrolled into view after\n // modifying the selection.\n\n // If shift is held or the extend flag is set, extends a range to\n // include a given position (and optionally a second position).\n // Otherwise, simply returns the range between the given positions.\n // Used for cursor motion and such.\n function extendRange(doc, range, head, other) {\n if (doc.cm && doc.cm.display.shift || doc.extend) {\n var anchor = range.anchor;\n if (other) {\n var posBefore = cmp(head, anchor) < 0;\n if (posBefore != (cmp(other, anchor) < 0)) {\n anchor = head;\n head = other;\n } else if (posBefore != (cmp(head, other) < 0)) {\n head = other;\n }\n }\n return new Range(anchor, head);\n } else {\n return new Range(other || head, head);\n }\n }\n\n // Extend the primary selection range, discard the rest.\n function extendSelection(doc, head, other, options) {\n setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);\n }\n\n // Extend all selections (pos is an array of selections with length\n // equal the number of selections)\n function extendSelections(doc, heads, options) {\n for (var out = [], i = 0; i < doc.sel.ranges.length; i++)\n out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);\n var newSel = normalizeSelection(out, doc.sel.primIndex);\n setSelection(doc, newSel, options);\n }\n\n // Updates a single range in the selection.\n function replaceOneSelection(doc, i, range, options) {\n var ranges = doc.sel.ranges.slice(0);\n ranges[i] = range;\n setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);\n }\n\n // Reset the selection to a single range.\n function setSimpleSelection(doc, anchor, head, options) {\n setSelection(doc, simpleSelection(anchor, head), options);\n }\n\n // Give beforeSelectionChange handlers a change to influence a\n // selection update.\n function filterSelectionChange(doc, sel) {\n var obj = {\n ranges: sel.ranges,\n update: function(ranges) {\n this.ranges = [];\n for (var i = 0; i < ranges.length; i++)\n this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n clipPos(doc, ranges[i].head));\n }\n };\n signal(doc, \"beforeSelectionChange\", doc, obj);\n if (doc.cm) signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj);\n if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);\n else return sel;\n }\n\n function setSelectionReplaceHistory(doc, sel, options) {\n var done = doc.history.done, last = lst(done);\n if (last && last.ranges) {\n done[done.length - 1] = sel;\n setSelectionNoUndo(doc, sel, options);\n } else {\n setSelection(doc, sel, options);\n }\n }\n\n // Set a new selection.\n function setSelection(doc, sel, options) {\n setSelectionNoUndo(doc, sel, options);\n addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n }\n\n function setSelectionNoUndo(doc, sel, options) {\n if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n sel = filterSelectionChange(doc, sel);\n\n var bias = cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1;\n setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n if (!(options && options.scroll === false) && doc.cm)\n ensureCursorVisible(doc.cm);\n }\n\n function setSelectionInner(doc, sel) {\n if (sel.equals(doc.sel)) return;\n\n doc.sel = sel;\n\n if (doc.cm) {\n doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;\n signalCursorActivity(doc.cm);\n }\n signalLater(doc, \"cursorActivity\", doc);\n }\n\n // Verify that the selection does not partially select any atomic\n // marked ranges.\n function reCheckSelection(doc) {\n setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);\n }\n\n // Return a selection that does not partially select any atomic\n // ranges.\n function skipAtomicInSelection(doc, sel, bias, mayClear) {\n var out;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);\n var newHead = skipAtomic(doc, range.head, bias, mayClear);\n if (out || newAnchor != range.anchor || newHead != range.head) {\n if (!out) out = sel.ranges.slice(0, i);\n out[i] = new Range(newAnchor, newHead);\n }\n }\n return out ? normalizeSelection(out, sel.primIndex) : sel;\n }\n\n // Ensure a given position is not inside an atomic range.\n function skipAtomic(doc, pos, bias, mayClear) {\n var flipped = false, curPos = pos;\n var dir = bias || 1;\n doc.cantEdit = false;\n search: for (;;) {\n var line = getLine(doc, curPos.line);\n if (line.markedSpans) {\n for (var i = 0; i < line.markedSpans.length; ++i) {\n var sp = line.markedSpans[i], m = sp.marker;\n if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&\n (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {\n if (mayClear) {\n signal(m, \"beforeCursorEnter\");\n if (m.explicitlyCleared) {\n if (!line.markedSpans) break;\n else {--i; continue;}\n }\n }\n if (!m.atomic) continue;\n var newPos = m.find(dir < 0 ? -1 : 1);\n if (cmp(newPos, curPos) == 0) {\n newPos.ch += dir;\n if (newPos.ch < 0) {\n if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));\n else newPos = null;\n } else if (newPos.ch > line.text.length) {\n if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);\n else newPos = null;\n }\n if (!newPos) {\n if (flipped) {\n // Driven in a corner -- no valid cursor position found at all\n // -- try again *with* clearing, if we didn't already\n if (!mayClear) return skipAtomic(doc, pos, bias, true);\n // Otherwise, turn off editing until further notice, and return the start of the doc\n doc.cantEdit = true;\n return Pos(doc.first, 0);\n }\n flipped = true; newPos = pos; dir = -dir;\n }\n }\n curPos = newPos;\n continue search;\n }\n }\n }\n return curPos;\n }\n }\n\n // SELECTION DRAWING\n\n // Redraw the selection and/or cursor\n function updateSelection(cm) {\n var display = cm.display, doc = cm.doc;\n var curFragment = document.createDocumentFragment();\n var selFragment = document.createDocumentFragment();\n\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n var collapsed = range.empty();\n if (collapsed || cm.options.showCursorWhenSelecting)\n drawSelectionCursor(cm, range, curFragment);\n if (!collapsed)\n drawSelectionRange(cm, range, selFragment);\n }\n\n // Move the hidden textarea near the cursor to prevent scrolling artifacts\n if (cm.options.moveInputWithCursor) {\n var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n var top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n headPos.top + lineOff.top - wrapOff.top));\n var left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n headPos.left + lineOff.left - wrapOff.left));\n display.inputDiv.style.top = top + \"px\";\n display.inputDiv.style.left = left + \"px\";\n }\n\n removeChildrenAndAdd(display.cursorDiv, curFragment);\n removeChildrenAndAdd(display.selectionDiv, selFragment);\n }\n\n // Draws a cursor for the given range\n function drawSelectionCursor(cm, range, output) {\n var pos = cursorCoords(cm, range.head, \"div\");\n\n var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n cursor.style.left = pos.left + \"px\";\n cursor.style.top = pos.top + \"px\";\n cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n if (pos.other) {\n // Secondary cursor, shown when on a 'jump' in bi-directional text\n var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n otherCursor.style.display = \"\";\n otherCursor.style.left = pos.other.left + \"px\";\n otherCursor.style.top = pos.other.top + \"px\";\n otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n }\n }\n\n // Draws the given range as a highlighted selection\n function drawSelectionRange(cm, range, output) {\n var display = cm.display, doc = cm.doc;\n var fragment = document.createDocumentFragment();\n var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right;\n\n function add(left, top, width, bottom) {\n if (top < 0) top = 0;\n top = Math.round(top);\n bottom = Math.round(bottom);\n fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", \"position: absolute; left: \" + left +\n \"px; top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) +\n \"px; height: \" + (bottom - top) + \"px\"));\n }\n\n function drawForLine(line, fromArg, toArg) {\n var lineObj = getLine(doc, line);\n var lineLen = lineObj.text.length;\n var start, end;\n function coords(ch, bias) {\n return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias);\n }\n\n iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {\n var leftPos = coords(from, \"left\"), rightPos, left, right;\n if (from == to) {\n rightPos = leftPos;\n left = right = leftPos.left;\n } else {\n rightPos = coords(to - 1, \"right\");\n if (dir == \"rtl\") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }\n left = leftPos.left;\n right = rightPos.right;\n }\n if (fromArg == null && from == 0) left = leftSide;\n if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part\n add(left, leftPos.top, null, leftPos.bottom);\n left = leftSide;\n if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);\n }\n if (toArg == null && to == lineLen) right = rightSide;\n if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)\n start = leftPos;\n if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)\n end = rightPos;\n if (left < leftSide + 1) left = leftSide;\n add(left, rightPos.top, right - left, rightPos.bottom);\n });\n return {start: start, end: end};\n }\n\n var sFrom = range.from(), sTo = range.to();\n if (sFrom.line == sTo.line) {\n drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n } else {\n var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n var singleVLine = visualLine(fromLine) == visualLine(toLine);\n var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n if (singleVLine) {\n if (leftEnd.top < rightStart.top - 2) {\n add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n } else {\n add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n }\n }\n if (leftEnd.bottom < rightStart.top)\n add(leftSide, leftEnd.bottom, null, rightStart.top);\n }\n\n output.appendChild(fragment);\n }\n\n // Cursor-blinking\n function restartBlink(cm) {\n if (!cm.state.focused) return;\n var display = cm.display;\n clearInterval(display.blinker);\n var on = true;\n display.cursorDiv.style.visibility = \"\";\n if (cm.options.cursorBlinkRate > 0)\n display.blinker = setInterval(function() {\n display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n }, cm.options.cursorBlinkRate);\n }\n\n // HIGHLIGHT WORKER\n\n function startWorker(cm, time) {\n if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)\n cm.state.highlight.set(time, bind(highlightWorker, cm));\n }\n\n function highlightWorker(cm) {\n var doc = cm.doc;\n if (doc.frontier < doc.first) doc.frontier = doc.first;\n if (doc.frontier >= cm.display.viewTo) return;\n var end = +new Date + cm.options.workTime;\n var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));\n\n runInOp(cm, function() {\n doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {\n if (doc.frontier >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles;\n var highlighted = highlightLine(cm, line, state, true);\n line.styles = highlighted.styles;\n if (highlighted.classes) line.styleClasses = highlighted.classes;\n else if (line.styleClasses) line.styleClasses = null;\n var ischange = !oldStyles || oldStyles.length != line.styles.length;\n for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];\n if (ischange) regLineChange(cm, doc.frontier, \"text\");\n line.stateAfter = copyState(doc.mode, state);\n } else {\n processLine(cm, line.text, state);\n line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;\n }\n ++doc.frontier;\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true;\n }\n });\n });\n }\n\n // Finds the line to start with when starting a parse. Tries to\n // find a line with a stateAfter, so that it can start with a\n // valid state. If that fails, it returns the line with the\n // smallest indentation, which tends to need the least context to\n // parse correctly.\n function findStartLine(cm, n, precise) {\n var minindent, minline, doc = cm.doc;\n var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n for (var search = n; search > lim; --search) {\n if (search <= doc.first) return doc.first;\n var line = getLine(doc, search - 1);\n if (line.stateAfter && (!precise || search <= doc.frontier)) return search;\n var indented = countColumn(line.text, null, cm.options.tabSize);\n if (minline == null || minindent > indented) {\n minline = search - 1;\n minindent = indented;\n }\n }\n return minline;\n }\n\n function getStateBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) return true;\n var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;\n if (!state) state = startState(doc.mode);\n else state = copyState(doc.mode, state);\n doc.iter(pos, n, function(line) {\n processLine(cm, line.text, state);\n var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;\n line.stateAfter = save ? copyState(doc.mode, state) : null;\n ++pos;\n });\n if (precise) doc.frontier = pos;\n return state;\n }\n\n // POSITION MEASUREMENT\n\n function paddingTop(display) {return display.lineSpace.offsetTop;}\n function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}\n function paddingH(display) {\n if (display.cachedPaddingH) return display.cachedPaddingH;\n var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\"));\n var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;\n return data;\n }\n\n // Ensure the lineView.wrapping.heights array is populated. This is\n // an array of bottom offsets for the lines that make up a drawn\n // line. When lineWrapping is on, there might be more than one\n // height.\n function ensureLineHeights(cm, lineView, rect) {\n var wrapping = cm.options.lineWrapping;\n var curWidth = wrapping && cm.display.scroller.clientWidth;\n if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n var heights = lineView.measure.heights = [];\n if (wrapping) {\n lineView.measure.width = curWidth;\n var rects = lineView.text.firstChild.getClientRects();\n for (var i = 0; i < rects.length - 1; i++) {\n var cur = rects[i], next = rects[i + 1];\n if (Math.abs(cur.bottom - next.bottom) > 2)\n heights.push((cur.bottom + next.top) / 2 - rect.top);\n }\n }\n heights.push(rect.bottom - rect.top);\n }\n }\n\n // Find a line map (mapping character offsets to text nodes) and a\n // measurement cache for the given line number. (A line view might\n // contain multiple lines when collapsed ranges are present.)\n function mapFromLineView(lineView, line, lineN) {\n if (lineView.line == line)\n return {map: lineView.measure.map, cache: lineView.measure.cache};\n for (var i = 0; i < lineView.rest.length; i++)\n if (lineView.rest[i] == line)\n return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};\n for (var i = 0; i < lineView.rest.length; i++)\n if (lineNo(lineView.rest[i]) > lineN)\n return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};\n }\n\n // Render a line into the hidden node display.externalMeasured. Used\n // when measurement is needed for a line that's not in the viewport.\n function updateExternalMeasurement(cm, line) {\n line = visualLine(line);\n var lineN = lineNo(line);\n var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n view.lineN = lineN;\n var built = view.built = buildLineContent(cm, view);\n view.text = built.pre;\n removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n return view;\n }\n\n // Get a {top, bottom, left, right} box (in line-local coordinates)\n // for a given character.\n function measureChar(cm, line, ch, bias) {\n return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);\n }\n\n // Find a line view that corresponds to the given line number.\n function findViewForLine(cm, lineN) {\n if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n return cm.display.view[findViewIndex(cm, lineN)];\n var ext = cm.display.externalMeasured;\n if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n return ext;\n }\n\n // Measurement can be split in two steps, the set-up work that\n // applies to the whole line, and the measurement of the actual\n // character. Functions like coordsChar, that need to do a lot of\n // measurements in a row, can thus ensure that the set-up work is\n // only done once.\n function prepareMeasureForLine(cm, line) {\n var lineN = lineNo(line);\n var view = findViewForLine(cm, lineN);\n if (view && !view.text)\n view = null;\n else if (view && view.changes)\n updateLineForChanges(cm, view, lineN, getDimensions(cm));\n if (!view)\n view = updateExternalMeasurement(cm, line);\n\n var info = mapFromLineView(view, line, lineN);\n return {\n line: line, view: view, rect: null,\n map: info.map, cache: info.cache, before: info.before,\n hasHeights: false\n };\n }\n\n // Given a prepared measurement object, measures the position of an\n // actual character (or fetches it from the cache).\n function measureCharPrepared(cm, prepared, ch, bias) {\n if (prepared.before) ch = -1;\n var key = ch + (bias || \"\"), found;\n if (prepared.cache.hasOwnProperty(key)) {\n found = prepared.cache[key];\n } else {\n if (!prepared.rect)\n prepared.rect = prepared.view.text.getBoundingClientRect();\n if (!prepared.hasHeights) {\n ensureLineHeights(cm, prepared.view, prepared.rect);\n prepared.hasHeights = true;\n }\n found = measureCharInner(cm, prepared, ch, bias);\n if (!found.bogus) prepared.cache[key] = found;\n }\n return {left: found.left, right: found.right, top: found.top, bottom: found.bottom};\n }\n\n var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n function measureCharInner(cm, prepared, ch, bias) {\n var map = prepared.map;\n\n var node, start, end, collapse;\n // First, search the line map for the text node corresponding to,\n // or closest to, the target character.\n for (var i = 0; i < map.length; i += 3) {\n var mStart = map[i], mEnd = map[i + 1];\n if (ch < mStart) {\n start = 0; end = 1;\n collapse = \"left\";\n } else if (ch < mEnd) {\n start = ch - mStart;\n end = start + 1;\n } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n end = mEnd - mStart;\n start = end - 1;\n if (ch >= mEnd) collapse = \"right\";\n }\n if (start != null) {\n node = map[i + 2];\n if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n collapse = bias;\n if (bias == \"left\" && start == 0)\n while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n node = map[(i -= 3) + 2];\n collapse = \"left\";\n }\n if (bias == \"right\" && start == mEnd - mStart)\n while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n node = map[(i += 3) + 2];\n collapse = \"right\";\n }\n break;\n }\n }\n\n var rect;\n if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;\n while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;\n if (ie_upto8 && start == 0 && end == mEnd - mStart) {\n rect = node.parentNode.getBoundingClientRect();\n } else if (ie && cm.options.lineWrapping) {\n var rects = range(node, start, end).getClientRects();\n if (rects.length)\n rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n else\n rect = nullRect;\n } else {\n rect = range(node, start, end).getBoundingClientRect() || nullRect;\n }\n } else { // If it is a widget, simply get the box for the whole widget.\n if (start > 0) collapse = bias = \"right\";\n var rects;\n if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n else\n rect = node.getBoundingClientRect();\n }\n if (ie_upto8 && !start && (!rect || !rect.left && !rect.right)) {\n var rSpan = node.parentNode.getClientRects()[0];\n if (rSpan)\n rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};\n else\n rect = nullRect;\n }\n\n var top, bot = (rect.bottom + rect.top) / 2 - prepared.rect.top;\n var heights = prepared.view.measure.heights;\n for (var i = 0; i < heights.length - 1; i++)\n if (bot < heights[i]) break;\n top = i ? heights[i - 1] : 0; bot = heights[i];\n var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n top: top, bottom: bot};\n if (!rect.left && !rect.right) result.bogus = true;\n return result;\n }\n\n function clearLineMeasurementCacheFor(lineView) {\n if (lineView.measure) {\n lineView.measure.cache = {};\n lineView.measure.heights = null;\n if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n lineView.measure.caches[i] = {};\n }\n }\n\n function clearLineMeasurementCache(cm) {\n cm.display.externalMeasure = null;\n removeChildren(cm.display.lineMeasure);\n for (var i = 0; i < cm.display.view.length; i++)\n clearLineMeasurementCacheFor(cm.display.view[i]);\n }\n\n function clearCaches(cm) {\n clearLineMeasurementCache(cm);\n cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;\n cm.display.lineNumChars = null;\n }\n\n function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }\n function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }\n\n // Converts a {top, bottom, left, right} box from line-local\n // coordinates into another coordinate system. Context may be one of\n // \"line\", \"div\" (display.lineDiv), \"local\"/null (editor), or \"page\".\n function intoCoordSystem(cm, lineObj, rect, context) {\n if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {\n var size = widgetHeight(lineObj.widgets[i]);\n rect.top += size; rect.bottom += size;\n }\n if (context == \"line\") return rect;\n if (!context) context = \"local\";\n var yOff = heightAtLine(lineObj);\n if (context == \"local\") yOff += paddingTop(cm.display);\n else yOff -= cm.display.viewOffset;\n if (context == \"page\" || context == \"window\") {\n var lOff = cm.display.lineSpace.getBoundingClientRect();\n yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n rect.left += xOff; rect.right += xOff;\n }\n rect.top += yOff; rect.bottom += yOff;\n return rect;\n }\n\n // Coverts a box from \"div\" coords to another coordinate system.\n // Context may be \"window\", \"page\", \"div\", or \"local\"/null.\n function fromCoordSystem(cm, coords, context) {\n if (context == \"div\") return coords;\n var left = coords.left, top = coords.top;\n // First move into \"page\" coordinate system\n if (context == \"page\") {\n left -= pageScrollX();\n top -= pageScrollY();\n } else if (context == \"local\" || !context) {\n var localBox = cm.display.sizer.getBoundingClientRect();\n left += localBox.left;\n top += localBox.top;\n }\n\n var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};\n }\n\n function charCoords(cm, pos, context, lineObj, bias) {\n if (!lineObj) lineObj = getLine(cm.doc, pos.line);\n return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);\n }\n\n // Returns a box for a given cursor position, which may have an\n // 'other' property containing the position of the secondary cursor\n // on a bidi boundary.\n function cursorCoords(cm, pos, context, lineObj, preparedMeasure) {\n lineObj = lineObj || getLine(cm.doc, pos.line);\n if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);\n function get(ch, right) {\n var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\");\n if (right) m.left = m.right; else m.right = m.left;\n return intoCoordSystem(cm, lineObj, m, context);\n }\n function getBidi(ch, partPos) {\n var part = order[partPos], right = part.level % 2;\n if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {\n part = order[--partPos];\n ch = bidiRight(part) - (part.level % 2 ? 0 : 1);\n right = true;\n } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {\n part = order[++partPos];\n ch = bidiLeft(part) - part.level % 2;\n right = false;\n }\n if (right && ch == part.to && ch > part.from) return get(ch - 1);\n return get(ch, right);\n }\n var order = getOrder(lineObj), ch = pos.ch;\n if (!order) return get(ch);\n var partPos = getBidiPartAt(order, ch);\n var val = getBidi(ch, partPos);\n if (bidiOther != null) val.other = getBidi(ch, bidiOther);\n return val;\n }\n\n // Used to cheaply estimate the coordinates for a position. Used for\n // intermediate scroll updates.\n function estimateCoords(cm, pos) {\n var left = 0, pos = clipPos(cm.doc, pos);\n if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;\n var lineObj = getLine(cm.doc, pos.line);\n var top = heightAtLine(lineObj) + paddingTop(cm.display);\n return {left: left, right: left, top: top, bottom: top + lineObj.height};\n }\n\n // Positions returned by coordsChar contain some extra information.\n // xRel is the relative x position of the input coordinates compared\n // to the found position (so xRel > 0 means the coordinates are to\n // the right of the character position, for example). When outside\n // is true, that means the coordinates lie outside the line's\n // vertical range.\n function PosWithInfo(line, ch, outside, xRel) {\n var pos = Pos(line, ch);\n pos.xRel = xRel;\n if (outside) pos.outside = true;\n return pos;\n }\n\n // Compute the character position closest to the given coordinates.\n // Input must be lineSpace-local (\"div\" coordinate system).\n function coordsChar(cm, x, y) {\n var doc = cm.doc;\n y += cm.display.viewOffset;\n if (y < 0) return PosWithInfo(doc.first, 0, true, -1);\n var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n if (lineN > last)\n return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);\n if (x < 0) x = 0;\n\n var lineObj = getLine(doc, lineN);\n for (;;) {\n var found = coordsCharInner(cm, lineObj, lineN, x, y);\n var merged = collapsedSpanAtEnd(lineObj);\n var mergedPos = merged && merged.find(0, true);\n if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))\n lineN = lineNo(lineObj = mergedPos.to.line);\n else\n return found;\n }\n }\n\n function coordsCharInner(cm, lineObj, lineNo, x, y) {\n var innerOff = y - heightAtLine(lineObj);\n var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n\n function getX(ch) {\n var sp = cursorCoords(cm, Pos(lineNo, ch), \"line\", lineObj, preparedMeasure);\n wrongLine = true;\n if (innerOff > sp.bottom) return sp.left - adjust;\n else if (innerOff < sp.top) return sp.left + adjust;\n else wrongLine = false;\n return sp.left;\n }\n\n var bidi = getOrder(lineObj), dist = lineObj.text.length;\n var from = lineLeft(lineObj), to = lineRight(lineObj);\n var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;\n\n if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);\n // Do a binary search between these bounds.\n for (;;) {\n if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {\n var ch = x < fromX || x - fromX <= toX - x ? from : to;\n var xDiff = x - (ch == from ? fromX : toX);\n while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;\n var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,\n xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);\n return pos;\n }\n var step = Math.ceil(dist / 2), middle = from + step;\n if (bidi) {\n middle = from;\n for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);\n }\n var middleX = getX(middle);\n if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}\n else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}\n }\n }\n\n var measureText;\n // Compute the default text height.\n function textHeight(display) {\n if (display.cachedTextHeight != null) return display.cachedTextHeight;\n if (measureText == null) {\n measureText = elt(\"pre\");\n // Measure a bunch of lines, for browsers that compute\n // fractional heights.\n for (var i = 0; i < 49; ++i) {\n measureText.appendChild(document.createTextNode(\"x\"));\n measureText.appendChild(elt(\"br\"));\n }\n measureText.appendChild(document.createTextNode(\"x\"));\n }\n removeChildrenAndAdd(display.measure, measureText);\n var height = measureText.offsetHeight / 50;\n if (height > 3) display.cachedTextHeight = height;\n removeChildren(display.measure);\n return height || 1;\n }\n\n // Compute the default character width.\n function charWidth(display) {\n if (display.cachedCharWidth != null) return display.cachedCharWidth;\n var anchor = elt(\"span\", \"xxxxxxxxxx\");\n var pre = elt(\"pre\", [anchor]);\n removeChildrenAndAdd(display.measure, pre);\n var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n if (width > 2) display.cachedCharWidth = width;\n return width || 10;\n }\n\n // OPERATIONS\n\n // Operations are used to wrap a series of changes to the editor\n // state in such a way that each change won't have to update the\n // cursor and display (which would be awkward, slow, and\n // error-prone). Instead, display updates are batched and then all\n // combined and executed at once.\n\n var nextOpId = 0;\n // Start a new operation.\n function startOperation(cm) {\n cm.curOp = {\n viewChanged: false, // Flag that indicates that lines might need to be redrawn\n startHeight: cm.doc.height, // Used to detect need to update scrollbar\n forceUpdate: false, // Used to force a redraw\n updateInput: null, // Whether to reset the input textarea\n typing: false, // Whether this reset should be careful to leave existing text (for compositing)\n changeObjs: null, // Accumulated changes, for firing change events\n cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n selectionChanged: false, // Whether the selection needs to be redrawn\n updateMaxLine: false, // Set when the widest line needs to be determined anew\n scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n scrollToPos: null, // Used to scroll to a specific position\n id: ++nextOpId // Unique ID\n };\n if (!delayedCallbackDepth++) delayedCallbacks = [];\n }\n\n // Finish an operation, updating the display and signalling delayed events\n function endOperation(cm) {\n var op = cm.curOp, doc = cm.doc, display = cm.display;\n cm.curOp = null;\n\n if (op.updateMaxLine) findMaxLine(cm);\n\n // If it looks like an update might be needed, call updateDisplay\n if (op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n op.scrollToPos.to.line >= display.viewTo) ||\n display.maxLineChanged && cm.options.lineWrapping) {\n var updated = updateDisplay(cm, {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;\n }\n // If no update was run, but the selection changed, redraw that.\n if (!updated && op.selectionChanged) updateSelection(cm);\n if (!updated && op.startHeight != cm.doc.height) updateScrollbars(cm);\n\n // Propagate the scroll position to the actual DOM scroller\n if (op.scrollTop != null && display.scroller.scrollTop != op.scrollTop) {\n var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));\n display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top;\n }\n if (op.scrollLeft != null && display.scroller.scrollLeft != op.scrollLeft) {\n var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));\n display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left;\n alignHorizontally(cm);\n }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var coords = scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from),\n clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin);\n if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);\n }\n\n if (op.selectionChanged) restartBlink(cm);\n\n if (cm.state.focused && op.updateInput)\n resetInput(cm, op.typing);\n\n // Fire events for markers that are hidden/unidden by editing or\n // undoing\n var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n if (hidden) for (var i = 0; i < hidden.length; ++i)\n if (!hidden[i].lines.length) signal(hidden[i], \"hide\");\n if (unhidden) for (var i = 0; i < unhidden.length; ++i)\n if (unhidden[i].lines.length) signal(unhidden[i], \"unhide\");\n\n var delayed;\n if (!--delayedCallbackDepth) {\n delayed = delayedCallbacks;\n delayedCallbacks = null;\n }\n // Fire change events, and delayed event handlers\n if (op.changeObjs)\n signal(cm, \"changes\", cm, op.changeObjs);\n if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();\n if (op.cursorActivityHandlers)\n for (var i = 0; i < op.cursorActivityHandlers.length; i++)\n op.cursorActivityHandlers[i](cm);\n }\n\n // Run the given function in an operation\n function runInOp(cm, f) {\n if (cm.curOp) return f();\n startOperation(cm);\n try { return f(); }\n finally { endOperation(cm); }\n }\n // Wraps a function in an operation. Returns the wrapped function.\n function operation(cm, f) {\n return function() {\n if (cm.curOp) return f.apply(cm, arguments);\n startOperation(cm);\n try { return f.apply(cm, arguments); }\n finally { endOperation(cm); }\n };\n }\n // Used to add methods to editor and doc instances, wrapping them in\n // operations.\n function methodOp(f) {\n return function() {\n if (this.curOp) return f.apply(this, arguments);\n startOperation(this);\n try { return f.apply(this, arguments); }\n finally { endOperation(this); }\n };\n }\n function docMethodOp(f) {\n return function() {\n var cm = this.cm;\n if (!cm || cm.curOp) return f.apply(this, arguments);\n startOperation(cm);\n try { return f.apply(this, arguments); }\n finally { endOperation(cm); }\n };\n }\n\n // VIEW TRACKING\n\n // These objects are used to represent the visible (currently drawn)\n // part of the document. A LineView may correspond to multiple\n // logical lines, if those are connected by collapsed ranges.\n function LineView(doc, line, lineN) {\n // The starting line\n this.line = line;\n // Continuing lines, if any\n this.rest = visualLineContinued(line);\n // Number of logical lines in this visual line\n this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n this.node = this.text = null;\n this.hidden = lineIsHidden(doc, line);\n }\n\n // Create a range of LineView objects for the given lines.\n function buildViewArray(cm, from, to) {\n var array = [], nextPos;\n for (var pos = from; pos < to; pos = nextPos) {\n var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n nextPos = pos + view.size;\n array.push(view);\n }\n return array;\n }\n\n // Updates the display.view data structure for a given change to the\n // document. From and to are in pre-change coordinates. Lendiff is\n // the amount of lines added or subtracted by the change. This is\n // used for changes that span multiple lines, or change the way\n // lines are divided into visual lines. regLineChange (below)\n // registers single-line changes.\n function regChange(cm, from, to, lendiff) {\n if (from == null) from = cm.doc.first;\n if (to == null) to = cm.doc.first + cm.doc.size;\n if (!lendiff) lendiff = 0;\n\n var display = cm.display;\n if (lendiff && to < display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers > from))\n display.updateLineNumbers = from;\n\n cm.curOp.viewChanged = true;\n\n if (from >= display.viewTo) { // Change after\n if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n resetView(cm);\n } else if (to <= display.viewFrom) { // Change before\n if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n resetView(cm);\n } else {\n display.viewFrom += lendiff;\n display.viewTo += lendiff;\n }\n } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n resetView(cm);\n } else if (from <= display.viewFrom) { // Top overlap\n var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cut) {\n display.view = display.view.slice(cut.index);\n display.viewFrom = cut.lineN;\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n } else if (to >= display.viewTo) { // Bottom overlap\n var cut = viewCuttingPoint(cm, from, from, -1);\n if (cut) {\n display.view = display.view.slice(0, cut.index);\n display.viewTo = cut.lineN;\n } else {\n resetView(cm);\n }\n } else { // Gap in the middle\n var cutTop = viewCuttingPoint(cm, from, from, -1);\n var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cutTop && cutBot) {\n display.view = display.view.slice(0, cutTop.index)\n .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n .concat(display.view.slice(cutBot.index));\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n }\n\n var ext = display.externalMeasured;\n if (ext) {\n if (to < ext.lineN)\n ext.lineN += lendiff;\n else if (from < ext.lineN + ext.size)\n display.externalMeasured = null;\n }\n }\n\n // Register a change to a single line. Type must be one of \"text\",\n // \"gutter\", \"class\", \"widget\"\n function regLineChange(cm, line, type) {\n cm.curOp.viewChanged = true;\n var display = cm.display, ext = cm.display.externalMeasured;\n if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n display.externalMeasured = null;\n\n if (line < display.viewFrom || line >= display.viewTo) return;\n var lineView = display.view[findViewIndex(cm, line)];\n if (lineView.node == null) return;\n var arr = lineView.changes || (lineView.changes = []);\n if (indexOf(arr, type) == -1) arr.push(type);\n }\n\n // Clear the view.\n function resetView(cm) {\n cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n cm.display.view = [];\n cm.display.viewOffset = 0;\n }\n\n // Find the view element corresponding to a given line. Return null\n // when the line isn't visible.\n function findViewIndex(cm, n) {\n if (n >= cm.display.viewTo) return null;\n n -= cm.display.viewFrom;\n if (n < 0) return null;\n var view = cm.display.view;\n for (var i = 0; i < view.length; i++) {\n n -= view[i].size;\n if (n < 0) return i;\n }\n }\n\n function viewCuttingPoint(cm, oldN, newN, dir) {\n var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n return {index: index, lineN: newN};\n for (var i = 0, n = cm.display.viewFrom; i < index; i++)\n n += view[i].size;\n if (n != oldN) {\n if (dir > 0) {\n if (index == view.length - 1) return null;\n diff = (n + view[index].size) - oldN;\n index++;\n } else {\n diff = n - oldN;\n }\n oldN += diff; newN += diff;\n }\n while (visualLineNo(cm.doc, newN) != newN) {\n if (index == (dir < 0 ? 0 : view.length - 1)) return null;\n newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n index += dir;\n }\n return {index: index, lineN: newN};\n }\n\n // Force the view to cover a given range, adding empty view element\n // or clipping off existing ones as needed.\n function adjustView(cm, from, to) {\n var display = cm.display, view = display.view;\n if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n display.view = buildViewArray(cm, from, to);\n display.viewFrom = from;\n } else {\n if (display.viewFrom > from)\n display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);\n else if (display.viewFrom < from)\n display.view = display.view.slice(findViewIndex(cm, from));\n display.viewFrom = from;\n if (display.viewTo < to)\n display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));\n else if (display.viewTo > to)\n display.view = display.view.slice(0, findViewIndex(cm, to));\n }\n display.viewTo = to;\n }\n\n // Count the number of lines in the view whose DOM representation is\n // out of date (or nonexistent).\n function countDirtyView(cm) {\n var view = cm.display.view, dirty = 0;\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;\n }\n return dirty;\n }\n\n // INPUT HANDLING\n\n // Poll for input changes, using the normal rate of polling. This\n // runs as long as the editor is focused.\n function slowPoll(cm) {\n if (cm.display.pollingFast) return;\n cm.display.poll.set(cm.options.pollInterval, function() {\n readInput(cm);\n if (cm.state.focused) slowPoll(cm);\n });\n }\n\n // When an event has just come in that is likely to add or change\n // something in the input textarea, we poll faster, to ensure that\n // the change appears on the screen quickly.\n function fastPoll(cm) {\n var missed = false;\n cm.display.pollingFast = true;\n function p() {\n var changed = readInput(cm);\n if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}\n else {cm.display.pollingFast = false; slowPoll(cm);}\n }\n cm.display.poll.set(20, p);\n }\n\n // Read input from the textarea, and update the document to match.\n // When something is selected, it is present in the textarea, and\n // selected (unless it is huge, in which case a placeholder is\n // used). When nothing is selected, the cursor sits after previously\n // seen text (can be empty), which is stored in prevInput (we must\n // not reset the textarea when typing, because that breaks IME).\n function readInput(cm) {\n var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc;\n // Since this is called a *lot*, try to bail out as cheaply as\n // possible when it is clear that nothing happened. hasSelection\n // will be the case when there is a lot of text in the textarea,\n // in which case reading its value would be expensive.\n if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)\n return false;\n // See paste handler for more on the fakedLastChar kludge\n if (cm.state.pasteIncoming && cm.state.fakedLastChar) {\n input.value = input.value.substring(0, input.value.length - 1);\n cm.state.fakedLastChar = false;\n }\n var text = input.value;\n // If nothing changed, bail.\n if (text == prevInput && !cm.somethingSelected()) return false;\n // Work around nonsensical selection resetting in IE9/10\n if (ie && !ie_upto8 && cm.display.inputHasSelection === text) {\n resetInput(cm);\n return false;\n }\n\n var withOp = !cm.curOp;\n if (withOp) startOperation(cm);\n cm.display.shift = false;\n\n if (text.charCodeAt(0) == 0x200b && doc.sel == cm.display.selForContextMenu && !prevInput)\n prevInput = \"\\u200b\";\n // Find the part of the input that is actually new\n var same = 0, l = Math.min(prevInput.length, text.length);\n while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;\n var inserted = text.slice(same), textLines = splitLines(inserted);\n\n // When pasing N lines into N selections, insert one line per selection\n var multiPaste = cm.state.pasteIncoming && textLines.length > 1 && doc.sel.ranges.length == textLines.length;\n\n // Normal behavior is to insert the new text into every selection\n for (var i = doc.sel.ranges.length - 1; i >= 0; i--) {\n var range = doc.sel.ranges[i];\n var from = range.from(), to = range.to();\n // Handle deletion\n if (same < prevInput.length)\n from = Pos(from.line, from.ch - (prevInput.length - same));\n // Handle overwrite\n else if (cm.state.overwrite && range.empty() && !cm.state.pasteIncoming)\n to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));\n var updateInput = cm.curOp.updateInput;\n var changeEvent = {from: from, to: to, text: multiPaste ? [textLines[i]] : textLines,\n origin: cm.state.pasteIncoming ? \"paste\" : cm.state.cutIncoming ? \"cut\" : \"+input\"};\n makeChange(cm.doc, changeEvent);\n signalLater(cm, \"inputRead\", cm, changeEvent);\n // When an 'electric' character is inserted, immediately trigger a reindent\n if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&\n cm.options.smartIndent && range.head.ch < 100 &&\n (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {\n var mode = cm.getModeAt(range.head);\n if (mode.electricChars) {\n for (var j = 0; j < mode.electricChars.length; j++)\n if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n indentLine(cm, range.head.line, \"smart\");\n break;\n }\n } else if (mode.electricInput) {\n var end = changeEnd(changeEvent);\n if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))\n indentLine(cm, range.head.line, \"smart\");\n }\n }\n }\n ensureCursorVisible(cm);\n cm.curOp.updateInput = updateInput;\n cm.curOp.typing = true;\n\n // Don't leave long text in the textarea, since it makes further polling slow\n if (text.length > 1000 || text.indexOf(\"\\n\") > -1) input.value = cm.display.prevInput = \"\";\n else cm.display.prevInput = text;\n if (withOp) endOperation(cm);\n cm.state.pasteIncoming = cm.state.cutIncoming = false;\n return true;\n }\n\n // Reset the input to correspond to the selection (or to be empty,\n // when not typing and nothing is selected)\n function resetInput(cm, typing) {\n var minimal, selected, doc = cm.doc;\n if (cm.somethingSelected()) {\n cm.display.prevInput = \"\";\n var range = doc.sel.primary();\n minimal = hasCopyEvent &&\n (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);\n var content = minimal ? \"-\" : selected || cm.getSelection();\n cm.display.input.value = content;\n if (cm.state.focused) selectInput(cm.display.input);\n if (ie && !ie_upto8) cm.display.inputHasSelection = content;\n } else if (!typing) {\n cm.display.prevInput = cm.display.input.value = \"\";\n if (ie && !ie_upto8) cm.display.inputHasSelection = null;\n }\n cm.display.inaccurateSelection = minimal;\n }\n\n function focusInput(cm) {\n if (cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != cm.display.input))\n cm.display.input.focus();\n }\n\n function ensureFocus(cm) {\n if (!cm.state.focused) { focusInput(cm); onFocus(cm); }\n }\n\n function isReadOnly(cm) {\n return cm.options.readOnly || cm.doc.cantEdit;\n }\n\n // EVENT HANDLERS\n\n // Attach the necessary event handlers when initializing the editor\n function registerEventHandlers(cm) {\n var d = cm.display;\n on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n // Older IE's will not fire a second mousedown for a double click\n if (ie_upto10)\n on(d.scroller, \"dblclick\", operation(cm, function(e) {\n if (signalDOMEvent(cm, e)) return;\n var pos = posFromMouse(cm, e);\n if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;\n e_preventDefault(e);\n var word = findWordAt(cm, pos);\n extendSelection(cm.doc, word.anchor, word.head);\n }));\n else\n on(d.scroller, \"dblclick\", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });\n // Prevent normal selection in the editor (we handle our own)\n on(d.lineSpace, \"selectstart\", function(e) {\n if (!eventInWidget(d, e)) e_preventDefault(e);\n });\n // Some browsers fire contextmenu *after* opening the menu, at\n // which point we can't mess with it anymore. Context menu is\n // handled in onMouseDown for these browsers.\n if (!captureRightClick) on(d.scroller, \"contextmenu\", function(e) {onContextMenu(cm, e);});\n\n // Sync scrolling between fake scrollbars and real scrollable\n // area, ensure viewport is updated when scrolling.\n on(d.scroller, \"scroll\", function() {\n if (d.scroller.clientHeight) {\n setScrollTop(cm, d.scroller.scrollTop);\n setScrollLeft(cm, d.scroller.scrollLeft, true);\n signal(cm, \"scroll\", cm);\n }\n });\n on(d.scrollbarV, \"scroll\", function() {\n if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);\n });\n on(d.scrollbarH, \"scroll\", function() {\n if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);\n });\n\n // Listen to wheel events in order to try and update the viewport on time.\n on(d.scroller, \"mousewheel\", function(e){onScrollWheel(cm, e);});\n on(d.scroller, \"DOMMouseScroll\", function(e){onScrollWheel(cm, e);});\n\n // Prevent clicks in the scrollbars from killing focus\n function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }\n on(d.scrollbarH, \"mousedown\", reFocus);\n on(d.scrollbarV, \"mousedown\", reFocus);\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n on(d.input, \"keyup\", operation(cm, onKeyUp));\n on(d.input, \"input\", function() {\n if (ie && !ie_upto8 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;\n fastPoll(cm);\n });\n on(d.input, \"keydown\", operation(cm, onKeyDown));\n on(d.input, \"keypress\", operation(cm, onKeyPress));\n on(d.input, \"focus\", bind(onFocus, cm));\n on(d.input, \"blur\", bind(onBlur, cm));\n\n function drag_(e) {\n if (!signalDOMEvent(cm, e)) e_stop(e);\n }\n if (cm.options.dragDrop) {\n on(d.scroller, \"dragstart\", function(e){onDragStart(cm, e);});\n on(d.scroller, \"dragenter\", drag_);\n on(d.scroller, \"dragover\", drag_);\n on(d.scroller, \"drop\", operation(cm, onDrop));\n }\n on(d.scroller, \"paste\", function(e) {\n if (eventInWidget(d, e)) return;\n cm.state.pasteIncoming = true;\n focusInput(cm);\n fastPoll(cm);\n });\n on(d.input, \"paste\", function() {\n // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206\n // Add a char to the end of textarea before paste occur so that\n // selection doesn't span to the end of textarea.\n if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {\n var start = d.input.selectionStart, end = d.input.selectionEnd;\n d.input.value += \"$\";\n d.input.selectionStart = start;\n d.input.selectionEnd = end;\n cm.state.fakedLastChar = true;\n }\n cm.state.pasteIncoming = true;\n fastPoll(cm);\n });\n\n function prepareCopyCut(e) {\n if (cm.somethingSelected()) {\n if (d.inaccurateSelection) {\n d.prevInput = \"\";\n d.inaccurateSelection = false;\n d.input.value = cm.getSelection();\n selectInput(d.input);\n }\n } else {\n var text = \"\", ranges = [];\n for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n var line = cm.doc.sel.ranges[i].head.line;\n var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n ranges.push(lineRange);\n text += cm.getRange(lineRange.anchor, lineRange.head);\n }\n if (e.type == \"cut\") {\n cm.setSelections(ranges, null, sel_dontScroll);\n } else {\n d.prevInput = \"\";\n d.input.value = text;\n selectInput(d.input);\n }\n }\n if (e.type == \"cut\") cm.state.cutIncoming = true;\n }\n on(d.input, \"cut\", prepareCopyCut);\n on(d.input, \"copy\", prepareCopyCut);\n\n // Needed to handle Tab key in KHTML\n if (khtml) on(d.sizer, \"mouseup\", function() {\n if (activeElt() == d.input) d.input.blur();\n focusInput(cm);\n });\n }\n\n // Called when the window resizes\n function onResize(cm) {\n // Might be a text scaling operation, clear size caches.\n var d = cm.display;\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n cm.setSize();\n }\n\n // MOUSE EVENTS\n\n // Return true when the given mouse event happened in a widget\n function eventInWidget(display, e) {\n for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;\n }\n }\n\n // Given a mouse event, find the corresponding position. If liberal\n // is false, it checks whether a gutter or scrollbar was clicked,\n // and returns null if it was. forRect is used by rectangular\n // selections, and tries to estimate a character position even for\n // coordinates beyond the right of the text.\n function posFromMouse(cm, e, liberal, forRect) {\n var display = cm.display;\n if (!liberal) {\n var target = e_target(e);\n if (target == display.scrollbarH || target == display.scrollbarV ||\n target == display.scrollbarFiller || target == display.gutterFiller) return null;\n }\n var x, y, space = display.lineSpace.getBoundingClientRect();\n // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n try { x = e.clientX - space.left; y = e.clientY - space.top; }\n catch (e) { return null; }\n var coords = coordsChar(cm, x, y), line;\n if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n }\n return coords;\n }\n\n // A mouse down can be a single click, double click, triple click,\n // start of selection drag, start of text drag, new cursor\n // (ctrl-click), rectangle drag (alt-drag), or xwin\n // middle-click-paste. Or it might be a click on something we should\n // not interfere with, such as a scrollbar or widget.\n function onMouseDown(e) {\n if (signalDOMEvent(this, e)) return;\n var cm = this, display = cm.display;\n display.shift = e.shiftKey;\n\n if (eventInWidget(display, e)) {\n if (!webkit) {\n // Briefly turn off draggability, to allow widgets to do\n // normal dragging things.\n display.scroller.draggable = false;\n setTimeout(function(){display.scroller.draggable = true;}, 100);\n }\n return;\n }\n if (clickInGutter(cm, e)) return;\n var start = posFromMouse(cm, e);\n window.focus();\n\n switch (e_button(e)) {\n case 1:\n if (start)\n leftButtonDown(cm, e, start);\n else if (e_target(e) == display.scroller)\n e_preventDefault(e);\n break;\n case 2:\n if (webkit) cm.state.lastMiddleDown = +new Date;\n if (start) extendSelection(cm.doc, start);\n setTimeout(bind(focusInput, cm), 20);\n e_preventDefault(e);\n break;\n case 3:\n if (captureRightClick) onContextMenu(cm, e);\n break;\n }\n }\n\n var lastClick, lastDoubleClick;\n function leftButtonDown(cm, e, start) {\n setTimeout(bind(ensureFocus, cm), 0);\n\n var now = +new Date, type;\n if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {\n type = \"triple\";\n } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {\n type = \"double\";\n lastDoubleClick = {time: now, pos: start};\n } else {\n type = \"single\";\n lastClick = {time: now, pos: start};\n }\n\n var sel = cm.doc.sel, addNew = mac ? e.metaKey : e.ctrlKey;\n if (cm.options.dragDrop && dragAndDrop && !addNew && !isReadOnly(cm) &&\n type == \"single\" && sel.contains(start) > -1 && sel.somethingSelected())\n leftButtonStartDrag(cm, e, start);\n else\n leftButtonSelect(cm, e, start, type, addNew);\n }\n\n // Start a text drag. When it ends, see if any dragging actually\n // happen, and treat as a click if it didn't.\n function leftButtonStartDrag(cm, e, start) {\n var display = cm.display;\n var dragEnd = operation(cm, function(e2) {\n if (webkit) display.scroller.draggable = false;\n cm.state.draggingText = false;\n off(document, \"mouseup\", dragEnd);\n off(display.scroller, \"drop\", dragEnd);\n if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {\n e_preventDefault(e2);\n extendSelection(cm.doc, start);\n focusInput(cm);\n // Work around unexplainable focus problem in IE9 (#2127)\n if (ie_upto10 && !ie_upto8)\n setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);\n }\n });\n // Let the drag handler handle this.\n if (webkit) display.scroller.draggable = true;\n cm.state.draggingText = dragEnd;\n // IE's approach to draggable\n if (display.scroller.dragDrop) display.scroller.dragDrop();\n on(document, \"mouseup\", dragEnd);\n on(display.scroller, \"drop\", dragEnd);\n }\n\n // Normal selection, as opposed to text dragging.\n function leftButtonSelect(cm, e, start, type, addNew) {\n var display = cm.display, doc = cm.doc;\n e_preventDefault(e);\n\n var ourRange, ourIndex, startSel = doc.sel;\n if (addNew && !e.shiftKey) {\n ourIndex = doc.sel.contains(start);\n if (ourIndex > -1)\n ourRange = doc.sel.ranges[ourIndex];\n else\n ourRange = new Range(start, start);\n } else {\n ourRange = doc.sel.primary();\n }\n\n if (e.altKey) {\n type = \"rect\";\n if (!addNew) ourRange = new Range(start, start);\n start = posFromMouse(cm, e, true, true);\n ourIndex = -1;\n } else if (type == \"double\") {\n var word = findWordAt(cm, start);\n if (cm.display.shift || doc.extend)\n ourRange = extendRange(doc, ourRange, word.anchor, word.head);\n else\n ourRange = word;\n } else if (type == \"triple\") {\n var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));\n if (cm.display.shift || doc.extend)\n ourRange = extendRange(doc, ourRange, line.anchor, line.head);\n else\n ourRange = line;\n } else {\n ourRange = extendRange(doc, ourRange, start);\n }\n\n if (!addNew) {\n ourIndex = 0;\n setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n startSel = doc.sel;\n } else if (ourIndex > -1) {\n replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n } else {\n ourIndex = doc.sel.ranges.length;\n setSelection(doc, normalizeSelection(doc.sel.ranges.concat([ourRange]), ourIndex),\n {scroll: false, origin: \"*mouse\"});\n }\n\n var lastPos = start;\n function extendTo(pos) {\n if (cmp(lastPos, pos) == 0) return;\n lastPos = pos;\n\n if (type == \"rect\") {\n var ranges = [], tabSize = cm.options.tabSize;\n var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n line <= end; line++) {\n var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n if (left == right)\n ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));\n else if (text.length > leftPos)\n ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));\n }\n if (!ranges.length) ranges.push(new Range(start, start));\n setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n {origin: \"*mouse\", scroll: false});\n cm.scrollIntoView(pos);\n } else {\n var oldRange = ourRange;\n var anchor = oldRange.anchor, head = pos;\n if (type != \"single\") {\n if (type == \"double\")\n var range = findWordAt(cm, pos);\n else\n var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));\n if (cmp(range.anchor, anchor) > 0) {\n head = range.head;\n anchor = minPos(oldRange.from(), range.anchor);\n } else {\n head = range.anchor;\n anchor = maxPos(oldRange.to(), range.head);\n }\n }\n var ranges = startSel.ranges.slice(0);\n ranges[ourIndex] = new Range(clipPos(doc, anchor), head);\n setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);\n }\n }\n\n var editorSize = display.wrapper.getBoundingClientRect();\n // Used to ensure timeout re-tries don't fire when another extend\n // happened in the meantime (clearTimeout isn't reliable -- at\n // least on Chrome, the timeouts still happen even when cleared,\n // if the clear happens after their scheduled firing time).\n var counter = 0;\n\n function extend(e) {\n var curCount = ++counter;\n var cur = posFromMouse(cm, e, true, type == \"rect\");\n if (!cur) return;\n if (cmp(cur, lastPos) != 0) {\n ensureFocus(cm);\n extendTo(cur);\n var visible = visibleLines(display, doc);\n if (cur.line >= visible.to || cur.line < visible.from)\n setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);\n } else {\n var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n if (outside) setTimeout(operation(cm, function() {\n if (counter != curCount) return;\n display.scroller.scrollTop += outside;\n extend(e);\n }), 50);\n }\n }\n\n function done(e) {\n counter = Infinity;\n e_preventDefault(e);\n focusInput(cm);\n off(document, \"mousemove\", move);\n off(document, \"mouseup\", up);\n doc.history.lastSelOrigin = null;\n }\n\n var move = operation(cm, function(e) {\n if ((ie && !ie_upto9) ? !e.buttons : !e_button(e)) done(e);\n else extend(e);\n });\n var up = operation(cm, done);\n on(document, \"mousemove\", move);\n on(document, \"mouseup\", up);\n }\n\n // Determines whether an event happened in the gutter, and fires the\n // handlers for the corresponding event.\n function gutterEvent(cm, e, type, prevent, signalfn) {\n try { var mX = e.clientX, mY = e.clientY; }\n catch(e) { return false; }\n if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;\n if (prevent) e_preventDefault(e);\n\n var display = cm.display;\n var lineBox = display.lineDiv.getBoundingClientRect();\n\n if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);\n mY -= lineBox.top - display.viewOffset;\n\n for (var i = 0; i < cm.options.gutters.length; ++i) {\n var g = display.gutters.childNodes[i];\n if (g && g.getBoundingClientRect().right >= mX) {\n var line = lineAtHeight(cm.doc, mY);\n var gutter = cm.options.gutters[i];\n signalfn(cm, type, cm, line, gutter, e);\n return e_defaultPrevented(e);\n }\n }\n }\n\n function clickInGutter(cm, e) {\n return gutterEvent(cm, e, \"gutterClick\", true, signalLater);\n }\n\n // Kludge to work around strange IE behavior where it'll sometimes\n // re-fire a series of drag-related events right after the drop (#1551)\n var lastDrop = 0;\n\n function onDrop(e) {\n var cm = this;\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n return;\n e_preventDefault(e);\n if (ie) lastDrop = +new Date;\n var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n if (!pos || isReadOnly(cm)) return;\n // Might be a file drop, in which case we simply extract the text\n // and insert it.\n if (files && files.length && window.FileReader && window.File) {\n var n = files.length, text = Array(n), read = 0;\n var loadFile = function(file, i) {\n var reader = new FileReader;\n reader.onload = operation(cm, function() {\n text[i] = reader.result;\n if (++read == n) {\n pos = clipPos(cm.doc, pos);\n var change = {from: pos, to: pos, text: splitLines(text.join(\"\\n\")), origin: \"paste\"};\n makeChange(cm.doc, change);\n setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));\n }\n });\n reader.readAsText(file);\n };\n for (var i = 0; i < n; ++i) loadFile(files[i], i);\n } else { // Normal drop\n // Don't do a replace if the drop happened inside of the selected text.\n if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n cm.state.draggingText(e);\n // Ensure the editor is re-focused\n setTimeout(bind(focusInput, cm), 20);\n return;\n }\n try {\n var text = e.dataTransfer.getData(\"Text\");\n if (text) {\n var selected = cm.state.draggingText && cm.listSelections();\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) for (var i = 0; i < selected.length; ++i)\n replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\");\n cm.replaceSelection(text, \"around\", \"paste\");\n focusInput(cm);\n }\n }\n catch(e){}\n }\n }\n\n function onDragStart(cm, e) {\n if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;\n\n e.dataTransfer.setData(\"Text\", cm.getSelection());\n\n // Use dummy image instead of default browsers image.\n // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n if (e.dataTransfer.setDragImage && !safari) {\n var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (presto) {\n img.width = img.height = 1;\n cm.display.wrapper.appendChild(img);\n // Force a relayout, or Opera won't use our image for some obscure reason\n img._top = img.offsetTop;\n }\n e.dataTransfer.setDragImage(img, 0, 0);\n if (presto) img.parentNode.removeChild(img);\n }\n }\n\n // SCROLL EVENTS\n\n // Sync the scrollable area and scrollbars, ensure the viewport\n // covers the visible area.\n function setScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) return;\n cm.doc.scrollTop = val;\n if (!gecko) updateDisplay(cm, {top: val});\n if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;\n if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;\n if (gecko) updateDisplay(cm);\n startWorker(cm, 100);\n }\n // Sync scroller and scrollbar, ensure the gutter elements are\n // aligned.\n function setScrollLeft(cm, val, isScroller) {\n if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;\n val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\n cm.doc.scrollLeft = val;\n alignHorizontally(cm);\n if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;\n if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;\n }\n\n // Since the delta values reported on mouse wheel events are\n // unstandardized between browsers and even browser versions, and\n // generally horribly unpredictable, this code starts by measuring\n // the scroll effect that the first few mouse wheel events have,\n // and, from that, detects the way it can convert deltas to pixel\n // offsets afterwards.\n //\n // The reason we want to know the amount a wheel event will scroll\n // is that it gives us a chance to update the display before the\n // actual scrolling happens, reducing flickering.\n\n var wheelSamples = 0, wheelPixelsPerUnit = null;\n // Fill in a browser-detected starting value on browsers where we\n // know one. These don't have to be accurate -- the result of them\n // being wrong would just be a slight flicker on the first wheel\n // scroll (if it is large enough).\n if (ie) wheelPixelsPerUnit = -.53;\n else if (gecko) wheelPixelsPerUnit = 15;\n else if (chrome) wheelPixelsPerUnit = -.7;\n else if (safari) wheelPixelsPerUnit = -1/3;\n\n function onScrollWheel(cm, e) {\n var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;\n if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;\n else if (dy == null) dy = e.wheelDelta;\n\n var display = cm.display, scroll = display.scroller;\n // Quit if there's nothing to scroll here\n if (!(dx && scroll.scrollWidth > scroll.clientWidth ||\n dy && scroll.scrollHeight > scroll.clientHeight)) return;\n\n // Webkit browsers on OS X abort momentum scrolls when the target\n // of the scroll event is removed from the scrollable element.\n // This hack (see related code in patchDisplay) makes sure the\n // element is kept around.\n if (dy && mac && webkit) {\n outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n for (var i = 0; i < view.length; i++) {\n if (view[i].node == cur) {\n cm.display.currentWheelTarget = cur;\n break outer;\n }\n }\n }\n }\n\n // On some browsers, horizontal scrolling will cause redraws to\n // happen before the gutter has been realigned, causing it to\n // wriggle around in a most unseemly way. When we have an\n // estimated pixels/delta value, we just handle horizontal\n // scrolling entirely here. It'll be slightly off from native, but\n // better than glitching out.\n if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n if (dy)\n setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));\n setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));\n e_preventDefault(e);\n display.wheelStartX = null; // Abort measurement, if in progress\n return;\n }\n\n // 'Project' the visible viewport to cover the area that is being\n // scrolled into view (if we know enough to estimate it).\n if (dy && wheelPixelsPerUnit != null) {\n var pixels = dy * wheelPixelsPerUnit;\n var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n if (pixels < 0) top = Math.max(0, top + pixels - 50);\n else bot = Math.min(cm.doc.height, bot + pixels + 50);\n updateDisplay(cm, {top: top, bottom: bot});\n }\n\n if (wheelSamples < 20) {\n if (display.wheelStartX == null) {\n display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n display.wheelDX = dx; display.wheelDY = dy;\n setTimeout(function() {\n if (display.wheelStartX == null) return;\n var movedX = scroll.scrollLeft - display.wheelStartX;\n var movedY = scroll.scrollTop - display.wheelStartY;\n var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n (movedX && display.wheelDX && movedX / display.wheelDX);\n display.wheelStartX = display.wheelStartY = null;\n if (!sample) return;\n wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n ++wheelSamples;\n }, 200);\n } else {\n display.wheelDX += dx; display.wheelDY += dy;\n }\n }\n }\n\n // KEY EVENTS\n\n // Run a handler that was bound to a key.\n function doHandleBinding(cm, bound, dropShift) {\n if (typeof bound == \"string\") {\n bound = commands[bound];\n if (!bound) return false;\n }\n // Ensure previous input has been read, so that the handler sees a\n // consistent view of the document\n if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;\n var prevShift = cm.display.shift, done = false;\n try {\n if (isReadOnly(cm)) cm.state.suppressEdits = true;\n if (dropShift) cm.display.shift = false;\n done = bound(cm) != Pass;\n } finally {\n cm.display.shift = prevShift;\n cm.state.suppressEdits = false;\n }\n return done;\n }\n\n // Collect the currently active keymaps.\n function allKeyMaps(cm) {\n var maps = cm.state.keyMaps.slice(0);\n if (cm.options.extraKeys) maps.push(cm.options.extraKeys);\n maps.push(cm.options.keyMap);\n return maps;\n }\n\n var maybeTransition;\n // Handle a key from the keydown event.\n function handleKeyBinding(cm, e) {\n // Handle automatic keymap transitions\n var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;\n clearTimeout(maybeTransition);\n if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {\n if (getKeyMap(cm.options.keyMap) == startMap) {\n cm.options.keyMap = (next.call ? next.call(null, cm) : next);\n keyMapChanged(cm);\n }\n }, 50);\n\n var name = keyName(e, true), handled = false;\n if (!name) return false;\n var keymaps = allKeyMaps(cm);\n\n if (e.shiftKey) {\n // First try to resolve full name (including 'Shift-'). Failing\n // that, see if there is a cursor-motion command (starting with\n // 'go') bound to the keyname without 'Shift-'.\n handled = lookupKey(\"Shift-\" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})\n || lookupKey(name, keymaps, function(b) {\n if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n return doHandleBinding(cm, b);\n });\n } else {\n handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });\n }\n\n if (handled) {\n e_preventDefault(e);\n restartBlink(cm);\n signalLater(cm, \"keyHandled\", cm, name, e);\n }\n return handled;\n }\n\n // Handle a key from the keypress event\n function handleCharBinding(cm, e, ch) {\n var handled = lookupKey(\"'\" + ch + \"'\", allKeyMaps(cm),\n function(b) { return doHandleBinding(cm, b, true); });\n if (handled) {\n e_preventDefault(e);\n restartBlink(cm);\n signalLater(cm, \"keyHandled\", cm, \"'\" + ch + \"'\", e);\n }\n return handled;\n }\n\n var lastStoppedKey = null;\n function onKeyDown(e) {\n var cm = this;\n ensureFocus(cm);\n if (signalDOMEvent(cm, e)) return;\n // IE does strange things with escape.\n if (ie_upto10 && e.keyCode == 27) e.returnValue = false;\n var code = e.keyCode;\n cm.display.shift = code == 16 || e.shiftKey;\n var handled = handleKeyBinding(cm, e);\n if (presto) {\n lastStoppedKey = handled ? code : null;\n // Opera has no cut event... we try to at least catch the key combo\n if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n cm.replaceSelection(\"\", null, \"cut\");\n }\n\n // Turn mouse into crosshair when Alt is held on Mac.\n if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n showCrossHair(cm);\n }\n\n function showCrossHair(cm) {\n var lineDiv = cm.display.lineDiv;\n addClass(lineDiv, \"CodeMirror-crosshair\");\n\n function up(e) {\n if (e.keyCode == 18 || !e.altKey) {\n rmClass(lineDiv, \"CodeMirror-crosshair\");\n off(document, \"keyup\", up);\n off(document, \"mouseover\", up);\n }\n }\n on(document, \"keyup\", up);\n on(document, \"mouseover\", up);\n }\n\n function onKeyUp(e) {\n if (signalDOMEvent(this, e)) return;\n if (e.keyCode == 16) this.doc.sel.shift = false;\n }\n\n function onKeyPress(e) {\n var cm = this;\n if (signalDOMEvent(cm, e)) return;\n var keyCode = e.keyCode, charCode = e.charCode;\n if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}\n if (((presto && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;\n var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n if (handleCharBinding(cm, e, ch)) return;\n if (ie && !ie_upto8) cm.display.inputHasSelection = null;\n fastPoll(cm);\n }\n\n // FOCUS/BLUR EVENTS\n\n function onFocus(cm) {\n if (cm.options.readOnly == \"nocursor\") return;\n if (!cm.state.focused) {\n signal(cm, \"focus\", cm);\n cm.state.focused = true;\n addClass(cm.display.wrapper, \"CodeMirror-focused\");\n // The prevInput test prevents this from firing when a context\n // menu is closed (since the resetInput would kill the\n // select-all detection hack)\n if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n resetInput(cm);\n if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730\n }\n }\n slowPoll(cm);\n restartBlink(cm);\n }\n function onBlur(cm) {\n if (cm.state.focused) {\n signal(cm, \"blur\", cm);\n cm.state.focused = false;\n rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n }\n clearInterval(cm.display.blinker);\n setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);\n }\n\n // CONTEXT MENU HANDLING\n\n // To make the context menu work, we need to briefly unhide the\n // textarea (making it as unobtrusive as possible) to let the\n // right-click take effect on it.\n function onContextMenu(cm, e) {\n if (signalDOMEvent(cm, e, \"contextmenu\")) return;\n var display = cm.display;\n if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;\n\n var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n if (!pos || presto) return; // Opera is difficult.\n\n // Reset the current text selection only if the click is done outside of the selection\n // and 'resetSelectionOnContextMenu' option is true.\n var reset = cm.options.resetSelectionOnContextMenu;\n if (reset && cm.doc.sel.contains(pos) == -1)\n operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);\n\n var oldCSS = display.input.style.cssText;\n display.inputDiv.style.position = \"absolute\";\n display.input.style.cssText = \"position: fixed; width: 30px; height: 30px; top: \" + (e.clientY - 5) +\n \"px; left: \" + (e.clientX - 5) + \"px; z-index: 1000; background: \" +\n (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") +\n \"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n focusInput(cm);\n resetInput(cm);\n // Adds \"Select all\" to context menu in FF\n if (!cm.somethingSelected()) display.input.value = display.prevInput = \" \";\n display.selForContextMenu = cm.doc.sel;\n clearTimeout(display.detectingSelectAll);\n\n // Select-all will be greyed out if there's nothing to select, so\n // this adds a zero-width space so that we can later check whether\n // it got selected.\n function prepareSelectAllHack() {\n if (display.input.selectionStart != null) {\n var selected = cm.somethingSelected();\n var extval = display.input.value = \"\\u200b\" + (selected ? display.input.value : \"\");\n display.prevInput = selected ? \"\" : \"\\u200b\";\n display.input.selectionStart = 1; display.input.selectionEnd = extval.length;\n }\n }\n function rehide() {\n display.inputDiv.style.position = \"relative\";\n display.input.style.cssText = oldCSS;\n if (ie_upto8) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;\n slowPoll(cm);\n\n // Try to detect the user choosing select-all\n if (display.input.selectionStart != null) {\n if (!ie || ie_upto8) prepareSelectAllHack();\n var i = 0, poll = function() {\n if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)\n operation(cm, commands.selectAll)(cm);\n else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);\n else resetInput(cm);\n };\n display.detectingSelectAll = setTimeout(poll, 200);\n }\n }\n\n if (ie && !ie_upto8) prepareSelectAllHack();\n if (captureRightClick) {\n e_stop(e);\n var mouseup = function() {\n off(window, \"mouseup\", mouseup);\n setTimeout(rehide, 20);\n };\n on(window, \"mouseup\", mouseup);\n } else {\n setTimeout(rehide, 50);\n }\n }\n\n function contextMenuInGutter(cm, e) {\n if (!hasHandler(cm, \"gutterContextMenu\")) return false;\n return gutterEvent(cm, e, \"gutterContextMenu\", false, signal);\n }\n\n // UPDATING\n\n // Compute the position of the end of a change (its 'to' property\n // refers to the pre-change end).\n var changeEnd = CodeMirror.changeEnd = function(change) {\n if (!change.text) return change.to;\n return Pos(change.from.line + change.text.length - 1,\n lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));\n };\n\n // Adjust a position to refer to the post-change position of the\n // same text, or the end of the change if the change covers it.\n function adjustForChange(pos, change) {\n if (cmp(pos, change.from) < 0) return pos;\n if (cmp(pos, change.to) <= 0) return changeEnd(change);\n\n var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;\n return Pos(line, ch);\n }\n\n function computeSelAfterChange(doc, change) {\n var out = [];\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n out.push(new Range(adjustForChange(range.anchor, change),\n adjustForChange(range.head, change)));\n }\n return normalizeSelection(out, doc.sel.primIndex);\n }\n\n function offsetPos(pos, old, nw) {\n if (pos.line == old.line)\n return Pos(nw.line, pos.ch - old.ch + nw.ch);\n else\n return Pos(nw.line + (pos.line - old.line), pos.ch);\n }\n\n // Used by replaceSelections to allow moving the selection to the\n // start or around the replaced test. Hint may be \"start\" or \"around\".\n function computeReplacedSel(doc, changes, hint) {\n var out = [];\n var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n var from = offsetPos(change.from, oldPrev, newPrev);\n var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n oldPrev = change.to;\n newPrev = to;\n if (hint == \"around\") {\n var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n out[i] = new Range(inv ? to : from, inv ? from : to);\n } else {\n out[i] = new Range(from, from);\n }\n }\n return new Selection(out, doc.sel.primIndex);\n }\n\n // Allow \"beforeChange\" event handlers to influence a change\n function filterChange(doc, change, update) {\n var obj = {\n canceled: false,\n from: change.from,\n to: change.to,\n text: change.text,\n origin: change.origin,\n cancel: function() { this.canceled = true; }\n };\n if (update) obj.update = function(from, to, text, origin) {\n if (from) this.from = clipPos(doc, from);\n if (to) this.to = clipPos(doc, to);\n if (text) this.text = text;\n if (origin !== undefined) this.origin = origin;\n };\n signal(doc, \"beforeChange\", doc, obj);\n if (doc.cm) signal(doc.cm, \"beforeChange\", doc.cm, obj);\n\n if (obj.canceled) return null;\n return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};\n }\n\n // Apply a change to a document, and add it to the document's\n // history, and propagating it to all linked documents.\n function makeChange(doc, change, ignoreReadOnly) {\n if (doc.cm) {\n if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);\n if (doc.cm.state.suppressEdits) return;\n }\n\n if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n change = filterChange(doc, change, true);\n if (!change) return;\n }\n\n // Possibly split or suppress the update based on the presence\n // of read-only spans in its range.\n var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n if (split) {\n for (var i = split.length - 1; i >= 0; --i)\n makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text});\n } else {\n makeChangeInner(doc, change);\n }\n }\n\n function makeChangeInner(doc, change) {\n if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) return;\n var selAfter = computeSelAfterChange(doc, change);\n addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n var rebased = [];\n\n linkedDocs(doc, function(doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n });\n }\n\n // Revert a change stored in a document's history.\n function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n if (doc.cm && doc.cm.state.suppressEdits) return;\n\n var hist = doc.history, event, selAfter = doc.sel;\n var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n // Verify that there is a useable event (so that ctrl-z won't\n // needlessly clear selection events)\n for (var i = 0; i < source.length; i++) {\n event = source[i];\n if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n break;\n }\n if (i == source.length) return;\n hist.lastOrigin = hist.lastSelOrigin = null;\n\n for (;;) {\n event = source.pop();\n if (event.ranges) {\n pushSelectionToHistory(event, dest);\n if (allowSelectionOnly && !event.equals(doc.sel)) {\n setSelection(doc, event, {clearRedo: false});\n return;\n }\n selAfter = event;\n }\n else break;\n }\n\n // Build up a reverse change object to add to the opposite history\n // stack (redo when undoing, and vice versa).\n var antiChanges = [];\n pushSelectionToHistory(selAfter, dest);\n dest.push({changes: antiChanges, generation: hist.generation});\n hist.generation = event.generation || ++hist.maxGeneration;\n\n var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n for (var i = event.changes.length - 1; i >= 0; --i) {\n var change = event.changes[i];\n change.origin = type;\n if (filter && !filterChange(doc, change, false)) {\n source.length = 0;\n return;\n }\n\n antiChanges.push(historyChangeFromChange(doc, change));\n\n var after = i ? computeSelAfterChange(doc, change, null) : lst(source);\n makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n if (!i && doc.cm) doc.cm.scrollIntoView(change);\n var rebased = [];\n\n // Propagate to the linked documents\n linkedDocs(doc, function(doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n });\n }\n }\n\n // Sub-views need their line numbers shifted when text is added\n // above or below them in the parent document.\n function shiftDoc(doc, distance) {\n if (distance == 0) return;\n doc.first += distance;\n doc.sel = new Selection(map(doc.sel.ranges, function(range) {\n return new Range(Pos(range.anchor.line + distance, range.anchor.ch),\n Pos(range.head.line + distance, range.head.ch));\n }), doc.sel.primIndex);\n if (doc.cm) {\n regChange(doc.cm, doc.first, doc.first - distance, distance);\n for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n regLineChange(doc.cm, l, \"gutter\");\n }\n }\n\n // More lower-level change function, handling only a single document\n // (not linked ones).\n function makeChangeSingleDoc(doc, change, selAfter, spans) {\n if (doc.cm && !doc.cm.curOp)\n return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);\n\n if (change.to.line < doc.first) {\n shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n return;\n }\n if (change.from.line > doc.lastLine()) return;\n\n // Clip the change to the size of this doc\n if (change.from.line < doc.first) {\n var shift = change.text.length - 1 - (doc.first - change.from.line);\n shiftDoc(doc, shift);\n change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n text: [lst(change.text)], origin: change.origin};\n }\n var last = doc.lastLine();\n if (change.to.line > last) {\n change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n text: [change.text[0]], origin: change.origin};\n }\n\n change.removed = getBetween(doc, change.from, change.to);\n\n if (!selAfter) selAfter = computeSelAfterChange(doc, change, null);\n if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);\n else updateDoc(doc, change, spans);\n setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n }\n\n // Handle the interaction of a change to a document with the editor\n // that this document is part of.\n function makeChangeSingleDocInEditor(cm, change, spans) {\n var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n var recomputeMaxLength = false, checkWidthStart = from.line;\n if (!cm.options.lineWrapping) {\n checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n doc.iter(checkWidthStart, to.line + 1, function(line) {\n if (line == display.maxLine) {\n recomputeMaxLength = true;\n return true;\n }\n });\n }\n\n if (doc.sel.contains(change.from, change.to) > -1)\n signalCursorActivity(cm);\n\n updateDoc(doc, change, spans, estimateHeight(cm));\n\n if (!cm.options.lineWrapping) {\n doc.iter(checkWidthStart, from.line + change.text.length, function(line) {\n var len = lineLength(line);\n if (len > display.maxLineLength) {\n display.maxLine = line;\n display.maxLineLength = len;\n display.maxLineChanged = true;\n recomputeMaxLength = false;\n }\n });\n if (recomputeMaxLength) cm.curOp.updateMaxLine = true;\n }\n\n // Adjust frontier, schedule worker\n doc.frontier = Math.min(doc.frontier, from.line);\n startWorker(cm, 400);\n\n var lendiff = change.text.length - (to.line - from.line) - 1;\n // Remember that these lines changed, for updating the display\n if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n regLineChange(cm, from.line, \"text\");\n else\n regChange(cm, from.line, to.line + 1, lendiff);\n\n var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n if (changeHandler || changesHandler) {\n var obj = {\n from: from, to: to,\n text: change.text,\n removed: change.removed,\n origin: change.origin\n };\n if (changeHandler) signalLater(cm, \"change\", cm, obj);\n if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);\n }\n cm.display.selForContextMenu = null;\n }\n\n function replaceRange(doc, code, from, to, origin) {\n if (!to) to = from;\n if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }\n if (typeof code == \"string\") code = splitLines(code);\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\n }\n\n // SCROLLING THINGS INTO VIEW\n\n // If an editor sits on the top or bottom of the window, partially\n // scrolled out of view, this ensures that the cursor is visible.\n function maybeScrollWindow(cm, coords) {\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n if (coords.top + box.top < 0) doScroll = true;\n else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, \"position: absolute; top: \" +\n (coords.top - display.viewOffset - paddingTop(cm.display)) + \"px; height: \" +\n (coords.bottom - coords.top + scrollerCutOff) + \"px; left: \" +\n coords.left + \"px; width: 2px;\");\n cm.display.lineSpace.appendChild(scrollNode);\n scrollNode.scrollIntoView(doScroll);\n cm.display.lineSpace.removeChild(scrollNode);\n }\n }\n\n // Scroll a given position into view (immediately), verifying that\n // it actually became visible (as line heights are accurately\n // measured, the position of something may 'drift' during drawing).\n function scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) margin = 0;\n for (;;) {\n var changed = false, coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),\n Math.min(coords.top, endCoords.top) - margin,\n Math.max(coords.left, endCoords.left),\n Math.max(coords.bottom, endCoords.bottom) + margin);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n setScrollTop(cm, scrollPos.scrollTop);\n if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;\n }\n if (scrollPos.scrollLeft != null) {\n setScrollLeft(cm, scrollPos.scrollLeft);\n if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;\n }\n if (!changed) return coords;\n }\n }\n\n // Scroll a given set of coordinates into view (immediately).\n function scrollIntoView(cm, x1, y1, x2, y2) {\n var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);\n if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);\n if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);\n }\n\n // Calculate a new scroll position needed to scroll the given\n // rectangle into view. Returns an object with scrollTop and\n // scrollLeft properties. When these are undefined, the\n // vertical/horizontal position does not need to be adjusted.\n function calculateScrollPos(cm, x1, y1, x2, y2) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (y1 < 0) y1 = 0;\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = display.scroller.clientHeight - scrollerCutOff, result = {};\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;\n if (y1 < screentop) {\n result.scrollTop = atTop ? 0 : y1;\n } else if (y2 > screentop + screen) {\n var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);\n if (newTop != screentop) result.scrollTop = newTop;\n }\n\n var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n var screenw = display.scroller.clientWidth - scrollerCutOff;\n x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth;\n var gutterw = display.gutters.offsetWidth;\n var atLeft = x1 < gutterw + 10;\n if (x1 < screenleft + gutterw || atLeft) {\n if (atLeft) x1 = 0;\n result.scrollLeft = Math.max(0, x1 - 10 - gutterw);\n } else if (x2 > screenw + screenleft - 3) {\n result.scrollLeft = x2 + 10 - screenw;\n }\n return result;\n }\n\n // Store a relative adjustment to the scroll position in the current\n // operation (to be applied when the operation finishes).\n function addToScrollPos(cm, left, top) {\n if (left != null || top != null) resolveScrollToPos(cm);\n if (left != null)\n cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;\n if (top != null)\n cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n }\n\n // Make sure that at the end of the operation the current cursor is\n // shown.\n function ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor(), from = cur, to = cur;\n if (!cm.options.lineWrapping) {\n from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;\n to = Pos(cur.line, cur.ch + 1);\n }\n cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};\n }\n\n // When an operation has its scrollToPos property set, and another\n // scroll action is applied before the end of the operation, this\n // 'simulates' scrolling that position into view in a cheap way, so\n // that the effect of intermediate scroll commands is not ignored.\n function resolveScrollToPos(cm) {\n var range = cm.curOp.scrollToPos;\n if (range) {\n cm.curOp.scrollToPos = null;\n var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),\n Math.min(from.top, to.top) - range.margin,\n Math.max(from.right, to.right),\n Math.max(from.bottom, to.bottom) + range.margin);\n cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n }\n }\n\n // API UTILITIES\n\n // Indent the given line. The how parameter can be \"smart\",\n // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n // (typically set to true for forced single-line indents), empty\n // lines are not indented, and places where the mode returns Pass\n // are left alone.\n function indentLine(cm, n, how, aggressive) {\n var doc = cm.doc, state;\n if (how == null) how = \"add\";\n if (how == \"smart\") {\n // Fall back to \"prev\" when the mode doesn't have an indentation\n // method.\n if (!cm.doc.mode.indent) how = \"prev\";\n else state = getStateBefore(cm, n);\n }\n\n var tabSize = cm.options.tabSize;\n var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n if (line.stateAfter) line.stateAfter = null;\n var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n if (!aggressive && !/\\S/.test(line.text)) {\n indentation = 0;\n how = \"not\";\n } else if (how == \"smart\") {\n indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n if (indentation == Pass) {\n if (!aggressive) return;\n how = \"prev\";\n }\n }\n if (how == \"prev\") {\n if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);\n else indentation = 0;\n } else if (how == \"add\") {\n indentation = curSpace + cm.options.indentUnit;\n } else if (how == \"subtract\") {\n indentation = curSpace - cm.options.indentUnit;\n } else if (typeof how == \"number\") {\n indentation = curSpace + how;\n }\n indentation = Math.max(0, indentation);\n\n var indentString = \"\", pos = 0;\n if (cm.options.indentWithTabs)\n for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";}\n if (pos < indentation) indentString += spaceStr(indentation - pos);\n\n if (indentString != curSpaceString) {\n replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n } else {\n // Ensure that, if the cursor was in the whitespace at the start\n // of the line, it is moved to the end of that space.\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i, new Range(pos, pos));\n break;\n }\n }\n }\n line.stateAfter = null;\n }\n\n // Utility for applying a change to a line by handle or number,\n // returning the number and optionally registering the line as\n // changed.\n function changeLine(cm, handle, changeType, op) {\n var no = handle, line = handle, doc = cm.doc;\n if (typeof handle == \"number\") line = getLine(doc, clipLine(doc, handle));\n else no = lineNo(handle);\n if (no == null) return null;\n if (op(line, no)) regLineChange(cm, no, changeType);\n return line;\n }\n\n // Helper for deleting text near the selection(s), used to implement\n // backspace, delete, and similar functionality.\n function deleteNearSelection(cm, compute) {\n var ranges = cm.doc.sel.ranges, kill = [];\n // Build up a set of ranges to kill first, merging overlapping\n // ranges.\n for (var i = 0; i < ranges.length; i++) {\n var toKill = compute(ranges[i]);\n while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n var replaced = kill.pop();\n if (cmp(replaced.from, toKill.from) < 0) {\n toKill.from = replaced.from;\n break;\n }\n }\n kill.push(toKill);\n }\n // Next, remove those actual ranges.\n runInOp(cm, function() {\n for (var i = kill.length - 1; i >= 0; i--)\n replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\");\n ensureCursorVisible(cm);\n });\n }\n\n // Used for horizontal relative motion. Dir is -1 or 1 (left or\n // right), unit can be \"char\", \"column\" (like char, but doesn't\n // cross line boundaries), \"word\" (across next word), or \"group\" (to\n // the start of next group of word or non-word-non-whitespace\n // chars). The visually param controls whether, in right-to-left\n // text, direction 1 means to move towards the next index in the\n // string, or towards the character to the right of the current\n // position. The resulting position will have a hitSide=true\n // property if it reached the end of the document.\n function findPosH(doc, pos, dir, unit, visually) {\n var line = pos.line, ch = pos.ch, origDir = dir;\n var lineObj = getLine(doc, line);\n var possible = true;\n function findNextLine() {\n var l = line + dir;\n if (l < doc.first || l >= doc.first + doc.size) return (possible = false);\n line = l;\n return lineObj = getLine(doc, l);\n }\n function moveOnce(boundToLine) {\n var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);\n if (next == null) {\n if (!boundToLine && findNextLine()) {\n if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);\n else ch = dir < 0 ? lineObj.text.length : 0;\n } else return (possible = false);\n } else ch = next;\n return true;\n }\n\n if (unit == \"char\") moveOnce();\n else if (unit == \"column\") moveOnce(true);\n else if (unit == \"word\" || unit == \"group\") {\n var sawType = null, group = unit == \"group\";\n var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n for (var first = true;; first = false) {\n if (dir < 0 && !moveOnce(!first)) break;\n var cur = lineObj.text.charAt(ch) || \"\\n\";\n var type = isWordChar(cur, helper) ? \"w\"\n : group && cur == \"\\n\" ? \"n\"\n : !group || /\\s/.test(cur) ? null\n : \"p\";\n if (group && !first && !type) type = \"s\";\n if (sawType && sawType != type) {\n if (dir < 0) {dir = 1; moveOnce();}\n break;\n }\n\n if (type) sawType = type;\n if (dir > 0 && !moveOnce(!first)) break;\n }\n }\n var result = skipAtomic(doc, Pos(line, ch), origDir, true);\n if (!possible) result.hitSide = true;\n return result;\n }\n\n // For relative vertical movement. Dir may be -1 or 1. Unit can be\n // \"page\" or \"line\". The resulting position will have a hitSide=true\n // property if it reached the end of the document.\n function findPosV(cm, pos, dir, unit) {\n var doc = cm.doc, x = pos.left, y;\n if (unit == \"page\") {\n var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));\n } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n for (;;) {\n var target = coordsChar(cm, x, y);\n if (!target.outside) break;\n if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }\n y += dir * 5;\n }\n return target;\n }\n\n // Find the word at the given position (as returned by coordsChar).\n function findWordAt(cm, pos) {\n var doc = cm.doc, line = getLine(doc, pos.line).text;\n var start = pos.ch, end = pos.ch;\n if (line) {\n var helper = cm.getHelper(pos, \"wordChars\");\n if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;\n var startChar = line.charAt(start);\n var check = isWordChar(startChar, helper)\n ? function(ch) { return isWordChar(ch, helper); }\n : /\\s/.test(startChar) ? function(ch) {return /\\s/.test(ch);}\n : function(ch) {return !/\\s/.test(ch) && !isWordChar(ch);};\n while (start > 0 && check(line.charAt(start - 1))) --start;\n while (end < line.length && check(line.charAt(end))) ++end;\n }\n return new Range(Pos(pos.line, start), Pos(pos.line, end));\n }\n\n // EDITOR METHODS\n\n // The publicly visible API. Note that methodOp(f) means\n // 'wrap f in an operation, performed on its `this` parameter'.\n\n // This is not the complete set of editor methods. Most of the\n // methods defined on the Doc type are also injected into\n // CodeMirror.prototype, for backwards compatibility and\n // convenience.\n\n CodeMirror.prototype = {\n constructor: CodeMirror,\n focus: function(){window.focus(); focusInput(this); fastPoll(this);},\n\n setOption: function(option, value) {\n var options = this.options, old = options[option];\n if (options[option] == value && option != \"mode\") return;\n options[option] = value;\n if (optionHandlers.hasOwnProperty(option))\n operation(this, optionHandlers[option])(this, value, old);\n },\n\n getOption: function(option) {return this.options[option];},\n getDoc: function() {return this.doc;},\n\n addKeyMap: function(map, bottom) {\n this.state.keyMaps[bottom ? \"push\" : \"unshift\"](map);\n },\n removeKeyMap: function(map) {\n var maps = this.state.keyMaps;\n for (var i = 0; i < maps.length; ++i)\n if (maps[i] == map || (typeof maps[i] != \"string\" && maps[i].name == map)) {\n maps.splice(i, 1);\n return true;\n }\n },\n\n addOverlay: methodOp(function(spec, options) {\n var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n if (mode.startState) throw new Error(\"Overlays may not be stateful.\");\n this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});\n this.state.modeGen++;\n regChange(this);\n }),\n removeOverlay: methodOp(function(spec) {\n var overlays = this.state.overlays;\n for (var i = 0; i < overlays.length; ++i) {\n var cur = overlays[i].modeSpec;\n if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n overlays.splice(i, 1);\n this.state.modeGen++;\n regChange(this);\n return;\n }\n }\n }),\n\n indentLine: methodOp(function(n, dir, aggressive) {\n if (typeof dir != \"string\" && typeof dir != \"number\") {\n if (dir == null) dir = this.options.smartIndent ? \"smart\" : \"prev\";\n else dir = dir ? \"add\" : \"subtract\";\n }\n if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);\n }),\n indentSelection: methodOp(function(how) {\n var ranges = this.doc.sel.ranges, end = -1;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) {\n var start = Math.max(end, range.from().line);\n var to = range.to();\n end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n for (var j = start; j < end; ++j)\n indentLine(this, j, how);\n } else if (range.head.line > end) {\n indentLine(this, range.head.line, how, true);\n end = range.head.line;\n if (i == this.doc.sel.primIndex) ensureCursorVisible(this);\n }\n }\n }),\n\n // Fetch the parser token for a given character. Useful for hacks\n // that want to inspect the mode state (say, for completion).\n getTokenAt: function(pos, precise) {\n var doc = this.doc;\n pos = clipPos(doc, pos);\n var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;\n var line = getLine(doc, pos.line);\n var stream = new StringStream(line.text, this.options.tabSize);\n while (stream.pos < pos.ch && !stream.eol()) {\n stream.start = stream.pos;\n var style = readToken(mode, stream, state);\n }\n return {start: stream.start,\n end: stream.pos,\n string: stream.current(),\n type: style || null,\n state: state};\n },\n\n getTokenTypeAt: function(pos) {\n pos = clipPos(this.doc, pos);\n var styles = getLineStyles(this, getLine(this.doc, pos.line));\n var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n var type;\n if (ch == 0) type = styles[2];\n else for (;;) {\n var mid = (before + after) >> 1;\n if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;\n else if (styles[mid * 2 + 1] < ch) before = mid + 1;\n else { type = styles[mid * 2 + 2]; break; }\n }\n var cut = type ? type.indexOf(\"cm-overlay \") : -1;\n return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);\n },\n\n getModeAt: function(pos) {\n var mode = this.doc.mode;\n if (!mode.innerMode) return mode;\n return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;\n },\n\n getHelper: function(pos, type) {\n return this.getHelpers(pos, type)[0];\n },\n\n getHelpers: function(pos, type) {\n var found = [];\n if (!helpers.hasOwnProperty(type)) return helpers;\n var help = helpers[type], mode = this.getModeAt(pos);\n if (typeof mode[type] == \"string\") {\n if (help[mode[type]]) found.push(help[mode[type]]);\n } else if (mode[type]) {\n for (var i = 0; i < mode[type].length; i++) {\n var val = help[mode[type][i]];\n if (val) found.push(val);\n }\n } else if (mode.helperType && help[mode.helperType]) {\n found.push(help[mode.helperType]);\n } else if (help[mode.name]) {\n found.push(help[mode.name]);\n }\n for (var i = 0; i < help._global.length; i++) {\n var cur = help._global[i];\n if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n found.push(cur.val);\n }\n return found;\n },\n\n getStateAfter: function(line, precise) {\n var doc = this.doc;\n line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n return getStateBefore(this, line + 1, precise);\n },\n\n cursorCoords: function(start, mode) {\n var pos, range = this.doc.sel.primary();\n if (start == null) pos = range.head;\n else if (typeof start == \"object\") pos = clipPos(this.doc, start);\n else pos = start ? range.from() : range.to();\n return cursorCoords(this, pos, mode || \"page\");\n },\n\n charCoords: function(pos, mode) {\n return charCoords(this, clipPos(this.doc, pos), mode || \"page\");\n },\n\n coordsChar: function(coords, mode) {\n coords = fromCoordSystem(this, coords, mode || \"page\");\n return coordsChar(this, coords.left, coords.top);\n },\n\n lineAtHeight: function(height, mode) {\n height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n return lineAtHeight(this.doc, height + this.display.viewOffset);\n },\n heightAtLine: function(line, mode) {\n var end = false, last = this.doc.first + this.doc.size - 1;\n if (line < this.doc.first) line = this.doc.first;\n else if (line > last) { line = last; end = true; }\n var lineObj = getLine(this.doc, line);\n return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\").top +\n (end ? this.doc.height - heightAtLine(lineObj) : 0);\n },\n\n defaultTextHeight: function() { return textHeight(this.display); },\n defaultCharWidth: function() { return charWidth(this.display); },\n\n setGutterMarker: methodOp(function(line, gutterID, value) {\n return changeLine(this, line, \"gutter\", function(line) {\n var markers = line.gutterMarkers || (line.gutterMarkers = {});\n markers[gutterID] = value;\n if (!value && isEmpty(markers)) line.gutterMarkers = null;\n return true;\n });\n }),\n\n clearGutter: methodOp(function(gutterID) {\n var cm = this, doc = cm.doc, i = doc.first;\n doc.iter(function(line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n line.gutterMarkers[gutterID] = null;\n regLineChange(cm, i, \"gutter\");\n if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;\n }\n ++i;\n });\n }),\n\n addLineClass: methodOp(function(handle, where, cls) {\n return changeLine(this, handle, \"class\", function(line) {\n var prop = where == \"text\" ? \"textClass\" : where == \"background\" ? \"bgClass\" : \"wrapClass\";\n if (!line[prop]) line[prop] = cls;\n else if (new RegExp(\"(?:^|\\\\s)\" + cls + \"(?:$|\\\\s)\").test(line[prop])) return false;\n else line[prop] += \" \" + cls;\n return true;\n });\n }),\n\n removeLineClass: methodOp(function(handle, where, cls) {\n return changeLine(this, handle, \"class\", function(line) {\n var prop = where == \"text\" ? \"textClass\" : where == \"background\" ? \"bgClass\" : \"wrapClass\";\n var cur = line[prop];\n if (!cur) return false;\n else if (cls == null) line[prop] = null;\n else {\n var found = cur.match(new RegExp(\"(?:^|\\\\s+)\" + cls + \"(?:$|\\\\s+)\"));\n if (!found) return false;\n var end = found.index + found[0].length;\n line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n }\n return true;\n });\n }),\n\n addLineWidget: methodOp(function(handle, node, options) {\n return addLineWidget(this, handle, node, options);\n }),\n\n removeLineWidget: function(widget) { widget.clear(); },\n\n lineInfo: function(line) {\n if (typeof line == \"number\") {\n if (!isLine(this.doc, line)) return null;\n var n = line;\n line = getLine(this.doc, line);\n if (!line) return null;\n } else {\n var n = lineNo(line);\n if (n == null) return null;\n }\n return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n widgets: line.widgets};\n },\n\n getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},\n\n addWidget: function(pos, node, scroll, vert, horiz) {\n var display = this.display;\n pos = cursorCoords(this, clipPos(this.doc, pos));\n var top = pos.bottom, left = pos.left;\n node.style.position = \"absolute\";\n display.sizer.appendChild(node);\n if (vert == \"over\") {\n top = pos.top;\n } else if (vert == \"above\" || vert == \"near\") {\n var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n // Default to positioning above (if specified and possible); otherwise default to positioning below\n if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n top = pos.top - node.offsetHeight;\n else if (pos.bottom + node.offsetHeight <= vspace)\n top = pos.bottom;\n if (left + node.offsetWidth > hspace)\n left = hspace - node.offsetWidth;\n }\n node.style.top = top + \"px\";\n node.style.left = node.style.right = \"\";\n if (horiz == \"right\") {\n left = display.sizer.clientWidth - node.offsetWidth;\n node.style.right = \"0px\";\n } else {\n if (horiz == \"left\") left = 0;\n else if (horiz == \"middle\") left = (display.sizer.clientWidth - node.offsetWidth) / 2;\n node.style.left = left + \"px\";\n }\n if (scroll)\n scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: methodOp(onKeyUp),\n\n execCommand: function(cmd) {\n if (commands.hasOwnProperty(cmd))\n return commands[cmd](this);\n },\n\n findPosH: function(from, amount, unit, visually) {\n var dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n cur = findPosH(this.doc, cur, dir, unit, visually);\n if (cur.hitSide) break;\n }\n return cur;\n },\n\n moveH: methodOp(function(dir, unit) {\n var cm = this;\n cm.extendSelectionsBy(function(range) {\n if (cm.display.shift || cm.doc.extend || range.empty())\n return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);\n else\n return dir < 0 ? range.from() : range.to();\n }, sel_move);\n }),\n\n deleteH: methodOp(function(dir, unit) {\n var sel = this.doc.sel, doc = this.doc;\n if (sel.somethingSelected())\n doc.replaceSelection(\"\", null, \"+delete\");\n else\n deleteNearSelection(this, function(range) {\n var other = findPosH(doc, range.head, dir, unit, false);\n return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};\n });\n }),\n\n findPosV: function(from, amount, unit, goalColumn) {\n var dir = 1, x = goalColumn;\n if (amount < 0) { dir = -1; amount = -amount; }\n for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n var coords = cursorCoords(this, cur, \"div\");\n if (x == null) x = coords.left;\n else coords.left = x;\n cur = findPosV(this, coords, dir, unit);\n if (cur.hitSide) break;\n }\n return cur;\n },\n\n moveV: methodOp(function(dir, unit) {\n var cm = this, doc = this.doc, goals = [];\n var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function(range) {\n if (collapse)\n return dir < 0 ? range.from() : range.to();\n var headPos = cursorCoords(cm, range.head, \"div\");\n if (range.goalColumn != null) headPos.left = range.goalColumn;\n goals.push(headPos.left);\n var pos = findPosV(cm, headPos, dir, unit);\n if (unit == \"page\" && range == doc.sel.primary())\n addToScrollPos(cm, null, charCoords(cm, pos, \"div\").top - headPos.top);\n return pos;\n }, sel_move);\n if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)\n doc.sel.ranges[i].goalColumn = goals[i];\n }),\n\n toggleOverwrite: function(value) {\n if (value != null && value == this.state.overwrite) return;\n if (this.state.overwrite = !this.state.overwrite)\n addClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n else\n rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n\n signal(this, \"overwriteToggle\", this, this.state.overwrite);\n },\n hasFocus: function() { return activeElt() == this.display.input; },\n\n scrollTo: methodOp(function(x, y) {\n if (x != null || y != null) resolveScrollToPos(this);\n if (x != null) this.curOp.scrollLeft = x;\n if (y != null) this.curOp.scrollTop = y;\n }),\n getScrollInfo: function() {\n var scroller = this.display.scroller, co = scrollerCutOff;\n return {left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,\n clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};\n },\n\n scrollIntoView: methodOp(function(range, margin) {\n if (range == null) {\n range = {from: this.doc.sel.primary().head, to: null};\n if (margin == null) margin = this.options.cursorScrollMargin;\n } else if (typeof range == \"number\") {\n range = {from: Pos(range, 0), to: null};\n } else if (range.from == null) {\n range = {from: range, to: null};\n }\n if (!range.to) range.to = range.from;\n range.margin = margin || 0;\n\n if (range.from.line != null) {\n resolveScrollToPos(this);\n this.curOp.scrollToPos = range;\n } else {\n var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),\n Math.min(range.from.top, range.to.top) - range.margin,\n Math.max(range.from.right, range.to.right),\n Math.max(range.from.bottom, range.to.bottom) + range.margin);\n this.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n function interpret(val) {\n return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val;\n }\n if (width != null) this.display.wrapper.style.width = interpret(width);\n if (height != null) this.display.wrapper.style.height = interpret(height);\n if (this.options.lineWrapping) clearLineMeasurementCache(this);\n this.curOp.forceUpdate = true;\n signal(this, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f);},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);\n updateGutterSpace(this);\n if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)\n estimateLineHeights(this);\n signal(this, \"refresh\", this);\n }),\n\n swapDoc: methodOp(function(doc) {\n var old = this.doc;\n old.cm = null;\n attachDoc(this, doc);\n clearCaches(this);\n resetInput(this);\n this.scrollTo(doc.scrollLeft, doc.scrollTop);\n signalLater(this, \"swapDoc\", this, old);\n return old;\n }),\n\n getInputField: function(){return this.display.input;},\n getWrapperElement: function(){return this.display.wrapper;},\n getScrollerElement: function(){return this.display.scroller;},\n getGutterElement: function(){return this.display.gutters;}\n };\n eventMixin(CodeMirror);\n\n // OPTION DEFAULTS\n\n // The default configuration options.\n var defaults = CodeMirror.defaults = {};\n // Functions to run when options are changed.\n var optionHandlers = CodeMirror.optionHandlers = {};\n\n function option(name, deflt, handle, notOnInit) {\n CodeMirror.defaults[name] = deflt;\n if (handle) optionHandlers[name] =\n notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;\n }\n\n // Passed to option handlers when there is no old value.\n var Init = CodeMirror.Init = {toString: function(){return \"CodeMirror.Init\";}};\n\n // These two are, on init, called from the constructor because they\n // have to be initialized before the editor can start at all.\n option(\"value\", \"\", function(cm, val) {\n cm.setValue(val);\n }, true);\n option(\"mode\", null, function(cm, val) {\n cm.doc.modeOption = val;\n loadMode(cm);\n }, true);\n\n option(\"indentUnit\", 2, loadMode, true);\n option(\"indentWithTabs\", false);\n option(\"smartIndent\", true);\n option(\"tabSize\", 4, function(cm) {\n resetModeState(cm);\n clearCaches(cm);\n regChange(cm);\n }, true);\n option(\"specialChars\", /[\\t\\u0000-\\u0019\\u00ad\\u200b\\u2028\\u2029\\ufeff]/g, function(cm, val) {\n cm.options.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n cm.refresh();\n }, true);\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);\n option(\"electricChars\", true);\n option(\"rtlMoveVisually\", !windows);\n option(\"wholeLineUpdateBefore\", true);\n\n option(\"theme\", \"default\", function(cm) {\n themeChanged(cm);\n guttersChanged(cm);\n }, true);\n option(\"keyMap\", \"default\", keyMapChanged);\n option(\"extraKeys\", null);\n\n option(\"lineWrapping\", false, wrappingChanged, true);\n option(\"gutters\", [], function(cm) {\n setGuttersForLineNumbers(cm.options);\n guttersChanged(cm);\n }, true);\n option(\"fixedGutter\", true, function(cm, val) {\n cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n cm.refresh();\n }, true);\n option(\"coverGutterNextToScrollbar\", false, updateScrollbars, true);\n option(\"lineNumbers\", false, function(cm) {\n setGuttersForLineNumbers(cm.options);\n guttersChanged(cm);\n }, true);\n option(\"firstLineNumber\", 1, guttersChanged, true);\n option(\"lineNumberFormatter\", function(integer) {return integer;}, guttersChanged, true);\n option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n option(\"resetSelectionOnContextMenu\", true);\n\n option(\"readOnly\", false, function(cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n cm.display.disabled = true;\n } else {\n cm.display.disabled = false;\n if (!val) resetInput(cm);\n }\n });\n option(\"disableInput\", false, function(cm, val) {if (!val) resetInput(cm);}, true);\n option(\"dragDrop\", true);\n\n option(\"cursorBlinkRate\", 530);\n option(\"cursorScrollMargin\", 0);\n option(\"cursorHeight\", 1);\n option(\"workTime\", 100);\n option(\"workDelay\", 100);\n option(\"flattenSpans\", true, resetModeState, true);\n option(\"addModeClass\", false, resetModeState, true);\n option(\"pollInterval\", 100);\n option(\"undoDepth\", 200, function(cm, val){cm.doc.history.undoDepth = val;});\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function(cm){cm.refresh();}, true);\n option(\"maxHighlightLength\", 10000, resetModeState, true);\n option(\"moveInputWithCursor\", true, function(cm, val) {\n if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;\n });\n\n option(\"tabindex\", null, function(cm, val) {\n cm.display.input.tabIndex = val || \"\";\n });\n option(\"autofocus\", null);\n\n // MODE DEFINITION AND QUERYING\n\n // Known modes, by name and by MIME\n var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};\n\n // Extra arguments are stored as the mode's dependencies, which is\n // used by (legacy) mechanisms like loadmode.js to automatically\n // load a mode. (Preferred mechanism is the require/define calls.)\n CodeMirror.defineMode = function(name, mode) {\n if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name;\n if (arguments.length > 2) {\n mode.dependencies = [];\n for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);\n }\n modes[name] = mode;\n };\n\n CodeMirror.defineMIME = function(mime, spec) {\n mimeModes[mime] = spec;\n };\n\n // Given a MIME type, a {name, ...options} config object, or a name\n // string, return a mode config object.\n CodeMirror.resolveMode = function(spec) {\n if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n spec = mimeModes[spec];\n } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n var found = mimeModes[spec.name];\n if (typeof found == \"string\") found = {name: found};\n spec = createObj(found, spec);\n spec.name = found.name;\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n return CodeMirror.resolveMode(\"application/xml\");\n }\n if (typeof spec == \"string\") return {name: spec};\n else return spec || {name: \"null\"};\n };\n\n // Given a mode spec (anything that resolveMode accepts), find and\n // initialize an actual mode object.\n CodeMirror.getMode = function(options, spec) {\n var spec = CodeMirror.resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) return CodeMirror.getMode(options, \"text/plain\");\n var modeObj = mfactory(options, spec);\n if (modeExtensions.hasOwnProperty(spec.name)) {\n var exts = modeExtensions[spec.name];\n for (var prop in exts) {\n if (!exts.hasOwnProperty(prop)) continue;\n if (modeObj.hasOwnProperty(prop)) modeObj[\"_\" + prop] = modeObj[prop];\n modeObj[prop] = exts[prop];\n }\n }\n modeObj.name = spec.name;\n if (spec.helperType) modeObj.helperType = spec.helperType;\n if (spec.modeProps) for (var prop in spec.modeProps)\n modeObj[prop] = spec.modeProps[prop];\n\n return modeObj;\n };\n\n // Minimal default mode.\n CodeMirror.defineMode(\"null\", function() {\n return {token: function(stream) {stream.skipToEnd();}};\n });\n CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n // This can be used to attach properties to mode objects from\n // outside the actual mode definition.\n var modeExtensions = CodeMirror.modeExtensions = {};\n CodeMirror.extendMode = function(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n };\n\n // EXTENSIONS\n\n CodeMirror.defineExtension = function(name, func) {\n CodeMirror.prototype[name] = func;\n };\n CodeMirror.defineDocExtension = function(name, func) {\n Doc.prototype[name] = func;\n };\n CodeMirror.defineOption = option;\n\n var initHooks = [];\n CodeMirror.defineInitHook = function(f) {initHooks.push(f);};\n\n var helpers = CodeMirror.helpers = {};\n CodeMirror.registerHelper = function(type, name, value) {\n if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};\n helpers[type][name] = value;\n };\n CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n CodeMirror.registerHelper(type, name, value);\n helpers[type]._global.push({pred: predicate, val: value});\n };\n\n // MODE STATE HANDLING\n\n // Utility functions for working with state. Exported because nested\n // modes need to do this for their inner modes.\n\n var copyState = CodeMirror.copyState = function(mode, state) {\n if (state === true) return state;\n if (mode.copyState) return mode.copyState(state);\n var nstate = {};\n for (var n in state) {\n var val = state[n];\n if (val instanceof Array) val = val.concat([]);\n nstate[n] = val;\n }\n return nstate;\n };\n\n var startState = CodeMirror.startState = function(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true;\n };\n\n // Given a mode and a state (for that mode), find the inner mode and\n // state at the position that the state refers to.\n CodeMirror.innerMode = function(mode, state) {\n while (mode.innerMode) {\n var info = mode.innerMode(state);\n if (!info || info.mode == mode) break;\n state = info.state;\n mode = info.mode;\n }\n return info || {mode: mode, state: state};\n };\n\n // STANDARD COMMANDS\n\n // Commands are parameter-less actions that can be performed on an\n // editor, mostly used for keybindings.\n var commands = CodeMirror.commands = {\n selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},\n singleSelection: function(cm) {\n cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll);\n },\n killLine: function(cm) {\n deleteNearSelection(cm, function(range) {\n if (range.empty()) {\n var len = getLine(cm.doc, range.head.line).text.length;\n if (range.head.ch == len && range.head.line < cm.lastLine())\n return {from: range.head, to: Pos(range.head.line + 1, 0)};\n else\n return {from: range.head, to: Pos(range.head.line, len)};\n } else {\n return {from: range.from(), to: range.to()};\n }\n });\n },\n deleteLine: function(cm) {\n deleteNearSelection(cm, function(range) {\n return {from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};\n });\n },\n delLineLeft: function(cm) {\n deleteNearSelection(cm, function(range) {\n return {from: Pos(range.from().line, 0), to: range.from()};\n });\n },\n undo: function(cm) {cm.undo();},\n redo: function(cm) {cm.redo();},\n undoSelection: function(cm) {cm.undoSelection();},\n redoSelection: function(cm) {cm.redoSelection();},\n goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},\n goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},\n goLineStart: function(cm) {\n cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); }, sel_move);\n },\n goLineStartSmart: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var start = lineStart(cm, range.head.line);\n var line = cm.getLineHandle(start.line);\n var order = getOrder(line);\n if (!order || order[0].level == 0) {\n var firstNonWS = Math.max(0, line.text.search(/\\S/));\n var inWS = range.head.line == start.line && range.head.ch <= firstNonWS && range.head.ch;\n return Pos(start.line, inWS ? 0 : firstNonWS);\n }\n return start;\n }, sel_move);\n },\n goLineEnd: function(cm) {\n cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); }, sel_move);\n },\n goLineRight: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n }, sel_move);\n },\n goLineLeft: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\");\n }, sel_move);\n },\n goLineUp: function(cm) {cm.moveV(-1, \"line\");},\n goLineDown: function(cm) {cm.moveV(1, \"line\");},\n goPageUp: function(cm) {cm.moveV(-1, \"page\");},\n goPageDown: function(cm) {cm.moveV(1, \"page\");},\n goCharLeft: function(cm) {cm.moveH(-1, \"char\");},\n goCharRight: function(cm) {cm.moveH(1, \"char\");},\n goColumnLeft: function(cm) {cm.moveH(-1, \"column\");},\n goColumnRight: function(cm) {cm.moveH(1, \"column\");},\n goWordLeft: function(cm) {cm.moveH(-1, \"word\");},\n goGroupRight: function(cm) {cm.moveH(1, \"group\");},\n goGroupLeft: function(cm) {cm.moveH(-1, \"group\");},\n goWordRight: function(cm) {cm.moveH(1, \"word\");},\n delCharBefore: function(cm) {cm.deleteH(-1, \"char\");},\n delCharAfter: function(cm) {cm.deleteH(1, \"char\");},\n delWordBefore: function(cm) {cm.deleteH(-1, \"word\");},\n delWordAfter: function(cm) {cm.deleteH(1, \"word\");},\n delGroupBefore: function(cm) {cm.deleteH(-1, \"group\");},\n delGroupAfter: function(cm) {cm.deleteH(1, \"group\");},\n indentAuto: function(cm) {cm.indentSelection(\"smart\");},\n indentMore: function(cm) {cm.indentSelection(\"add\");},\n indentLess: function(cm) {cm.indentSelection(\"subtract\");},\n insertTab: function(cm) {cm.replaceSelection(\"\\t\");},\n insertSoftTab: function(cm) {\n var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].from();\n var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n spaces.push(new Array(tabSize - col % tabSize + 1).join(\" \"));\n }\n cm.replaceSelections(spaces);\n },\n defaultTab: function(cm) {\n if (cm.somethingSelected()) cm.indentSelection(\"add\");\n else cm.execCommand(\"insertTab\");\n },\n transposeChars: function(cm) {\n runInOp(cm, function() {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\n var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n if (line) {\n if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);\n if (cur.ch > 0) {\n cur = new Pos(cur.line, cur.ch + 1);\n cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n } else if (cur.line > cm.doc.first) {\n var prev = getLine(cm.doc, cur.line - 1).text;\n if (prev)\n cm.replaceRange(line.charAt(0) + \"\\n\" + prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), \"+transpose\");\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n });\n },\n newlineAndIndent: function(cm) {\n runInOp(cm, function() {\n var len = cm.listSelections().length;\n for (var i = 0; i < len; i++) {\n var range = cm.listSelections()[i];\n cm.replaceRange(\"\\n\", range.anchor, range.head, \"+input\");\n cm.indentLine(range.from().line + 1, null, true);\n ensureCursorVisible(cm);\n }\n });\n },\n toggleOverwrite: function(cm) {cm.toggleOverwrite();}\n };\n\n // STANDARD KEYMAPS\n\n var keyMap = CodeMirror.keyMap = {};\n keyMap.basic = {\n \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n \"Esc\": \"singleSelection\"\n };\n // Note that the save and find-related commands aren't defined by\n // default. User code or addons can define them. Unknown commands\n // are simply ignored.\n keyMap.pcDefault = {\n \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n \"Ctrl-Home\": \"goDocStart\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Down\": \"goDocEnd\",\n \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n fallthrough: \"basic\"\n };\n keyMap.macDefault = {\n \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineStart\", \"Cmd-Right\": \"goLineEnd\", \"Alt-Backspace\": \"delGroupBefore\",\n \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delLineLeft\",\n \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\",\n fallthrough: [\"basic\", \"emacsy\"]\n };\n // Very basic readline/emacs-style bindings, which are standard on Mac.\n keyMap.emacsy = {\n \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\"\n };\n keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n // KEYMAP DISPATCH\n\n function getKeyMap(val) {\n if (typeof val == \"string\") return keyMap[val];\n else return val;\n }\n\n // Given an array of keymaps and a key name, call handle on any\n // bindings found, until that returns a truthy value, at which point\n // we consider the key handled. Implements things like binding a key\n // to false stopping further handling and keymap fallthrough.\n var lookupKey = CodeMirror.lookupKey = function(name, maps, handle) {\n function lookup(map) {\n map = getKeyMap(map);\n var found = map[name];\n if (found === false) return \"stop\";\n if (found != null && handle(found)) return true;\n if (map.nofallthrough) return \"stop\";\n\n var fallthrough = map.fallthrough;\n if (fallthrough == null) return false;\n if (Object.prototype.toString.call(fallthrough) != \"[object Array]\")\n return lookup(fallthrough);\n for (var i = 0; i < fallthrough.length; ++i) {\n var done = lookup(fallthrough[i]);\n if (done) return done;\n }\n return false;\n }\n\n for (var i = 0; i < maps.length; ++i) {\n var done = lookup(maps[i]);\n if (done) return done != \"stop\";\n }\n };\n\n // Modifier key presses don't count as 'real' key presses for the\n // purpose of keymap fallthrough.\n var isModifierKey = CodeMirror.isModifierKey = function(event) {\n var name = keyNames[event.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\";\n };\n\n // Look up the name of a key as indicated by an event object.\n var keyName = CodeMirror.keyName = function(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) return false;\n var name = keyNames[event.keyCode];\n if (name == null || event.altGraphKey) return false;\n if (event.altKey) name = \"Alt-\" + name;\n if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = \"Ctrl-\" + name;\n if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = \"Cmd-\" + name;\n if (!noShift && event.shiftKey) name = \"Shift-\" + name;\n return name;\n };\n\n // FROMTEXTAREA\n\n CodeMirror.fromTextArea = function(textarea, options) {\n if (!options) options = {};\n options.value = textarea.value;\n if (!options.tabindex && textarea.tabindex)\n options.tabindex = textarea.tabindex;\n if (!options.placeholder && textarea.placeholder)\n options.placeholder = textarea.placeholder;\n // Set autofocus to true if this textarea is focused, or if it has\n // autofocus and no other element is focused.\n if (options.autofocus == null) {\n var hasFocus = activeElt();\n options.autofocus = hasFocus == textarea ||\n textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n }\n\n function save() {textarea.value = cm.getValue();}\n if (textarea.form) {\n on(textarea.form, \"submit\", save);\n // Deplorable hack to make the submit method do the right thing.\n if (!options.leaveSubmitMethodAlone) {\n var form = textarea.form, realSubmit = form.submit;\n try {\n var wrappedSubmit = form.submit = function() {\n save();\n form.submit = realSubmit;\n form.submit();\n form.submit = wrappedSubmit;\n };\n } catch(e) {}\n }\n }\n\n textarea.style.display = \"none\";\n var cm = CodeMirror(function(node) {\n textarea.parentNode.insertBefore(node, textarea.nextSibling);\n }, options);\n cm.save = save;\n cm.getTextArea = function() { return textarea; };\n cm.toTextArea = function() {\n save();\n textarea.parentNode.removeChild(cm.getWrapperElement());\n textarea.style.display = \"\";\n if (textarea.form) {\n off(textarea.form, \"submit\", save);\n if (typeof textarea.form.submit == \"function\")\n textarea.form.submit = realSubmit;\n }\n };\n return cm;\n };\n\n // STRING STREAM\n\n // Fed to the mode parsers, provides helper functions to make\n // parsers more succinct.\n\n var StringStream = CodeMirror.StringStream = function(string, tabSize) {\n this.pos = this.start = 0;\n this.string = string;\n this.tabSize = tabSize || 8;\n this.lastColumnPos = this.lastColumnValue = 0;\n this.lineStart = 0;\n };\n\n StringStream.prototype = {\n eol: function() {return this.pos >= this.string.length;},\n sol: function() {return this.pos == this.lineStart;},\n peek: function() {return this.string.charAt(this.pos) || undefined;},\n next: function() {\n if (this.pos < this.string.length)\n return this.string.charAt(this.pos++);\n },\n eat: function(match) {\n var ch = this.string.charAt(this.pos);\n if (typeof match == \"string\") var ok = ch == match;\n else var ok = ch && (match.test ? match.test(ch) : match(ch));\n if (ok) {++this.pos; return ch;}\n },\n eatWhile: function(match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start;\n },\n eatSpace: function() {\n var start = this.pos;\n while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;\n return this.pos > start;\n },\n skipToEnd: function() {this.pos = this.string.length;},\n skipTo: function(ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true;}\n },\n backUp: function(n) {this.pos -= n;},\n column: function() {\n if (this.lastColumnPos < this.start) {\n this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n this.lastColumnPos = this.start;\n }\n return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n },\n indentation: function() {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n },\n match: function(pattern, consume, caseInsensitive) {\n if (typeof pattern == \"string\") {\n var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};\n var substr = this.string.substr(this.pos, pattern.length);\n if (cased(substr) == cased(pattern)) {\n if (consume !== false) this.pos += pattern.length;\n return true;\n }\n } else {\n var match = this.string.slice(this.pos).match(pattern);\n if (match && match.index > 0) return null;\n if (match && consume !== false) this.pos += match[0].length;\n return match;\n }\n },\n current: function(){return this.string.slice(this.start, this.pos);},\n hideFirstChars: function(n, inner) {\n this.lineStart += n;\n try { return inner(); }\n finally { this.lineStart -= n; }\n }\n };\n\n // TEXTMARKERS\n\n // Created with markText and setBookmark methods. A TextMarker is a\n // handle that can be used to clear or find a marked position in the\n // document. Line objects hold arrays (markedSpans) containing\n // {from, to, marker} object pointing to such marker objects, and\n // indicating that such a marker is present on that line. Multiple\n // lines may point to the same marker when it spans across lines.\n // The spans will have null for their from/to properties when the\n // marker continues beyond the start/end of the line. Markers have\n // links back to the lines they currently touch.\n\n var TextMarker = CodeMirror.TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n };\n eventMixin(TextMarker);\n\n // Clear the marker.\n TextMarker.prototype.clear = function() {\n if (this.explicitlyCleared) return;\n var cm = this.doc.cm, withOp = cm && !cm.curOp;\n if (withOp) startOperation(cm);\n if (hasHandler(this, \"clear\")) {\n var found = this.find();\n if (found) signalLater(this, \"clear\", found.from, found.to);\n }\n var min = null, max = null;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (cm && !this.collapsed) regLineChange(cm, lineNo(line), \"text\");\n else if (cm) {\n if (span.to != null) max = lineNo(line);\n if (span.from != null) min = lineNo(line);\n }\n line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n updateLineHeight(line, textHeight(cm.display));\n }\n if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {\n var visual = visualLine(this.lines[i]), len = lineLength(visual);\n if (len > cm.display.maxLineLength) {\n cm.display.maxLine = visual;\n cm.display.maxLineLength = len;\n cm.display.maxLineChanged = true;\n }\n }\n\n if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);\n this.lines.length = 0;\n this.explicitlyCleared = true;\n if (this.atomic && this.doc.cantEdit) {\n this.doc.cantEdit = false;\n if (cm) reCheckSelection(cm.doc);\n }\n if (cm) signalLater(cm, \"markerCleared\", cm, this);\n if (withOp) endOperation(cm);\n if (this.parent) this.parent.clear();\n };\n\n // Find the position of the marker in the document. Returns a {from,\n // to} object by default. Side can be passed to get a specific side\n // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n // Pos objects returned contain a line object, rather than a line\n // number (used to prevent looking up the same line twice).\n TextMarker.prototype.find = function(side, lineObj) {\n if (side == null && this.type == \"bookmark\") side = 1;\n var from, to;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (span.from != null) {\n from = Pos(lineObj ? line : lineNo(line), span.from);\n if (side == -1) return from;\n }\n if (span.to != null) {\n to = Pos(lineObj ? line : lineNo(line), span.to);\n if (side == 1) return to;\n }\n }\n return from && {from: from, to: to};\n };\n\n // Signals that the marker's widget changed, and surrounding layout\n // should be recomputed.\n TextMarker.prototype.changed = function() {\n var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n if (!pos || !cm) return;\n runInOp(cm, function() {\n var line = pos.line, lineN = lineNo(pos.line);\n var view = findViewForLine(cm, lineN);\n if (view) {\n clearLineMeasurementCacheFor(view);\n cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n }\n cm.curOp.updateMaxLine = true;\n if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n var oldHeight = widget.height;\n widget.height = null;\n var dHeight = widgetHeight(widget) - oldHeight;\n if (dHeight)\n updateLineHeight(line, line.height + dHeight);\n }\n });\n };\n\n TextMarker.prototype.attachLine = function(line) {\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);\n }\n this.lines.push(line);\n };\n TextMarker.prototype.detachLine = function(line) {\n this.lines.splice(indexOf(this.lines, line), 1);\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n }\n };\n\n // Collapsed markers have unique ids, in order to be able to order\n // them, which is needed for uniquely determining an outer marker\n // when they overlap (they may nest, but not partially overlap).\n var nextMarkerId = 0;\n\n // Create a marker, wire it up to the right lines, and\n function markText(doc, from, to, options, type) {\n // Shared markers (across linked documents) are handled separately\n // (markTextShared will call out to this again, once per\n // document).\n if (options && options.shared) return markTextShared(doc, from, to, options, type);\n // Ensure we are in an operation.\n if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);\n\n var marker = new TextMarker(doc, type), diff = cmp(from, to);\n if (options) copyObj(options, marker, false);\n // Don't connect empty markers unless clearWhenEmpty is false\n if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n return marker;\n if (marker.replacedWith) {\n // Showing up as a widget implies collapsed (widget replaces text)\n marker.collapsed = true;\n marker.widgetNode = elt(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n if (!options.handleMouseEvents) marker.widgetNode.ignoreEvents = true;\n if (options.insertLeft) marker.widgetNode.insertLeft = true;\n }\n if (marker.collapsed) {\n if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");\n sawCollapsedSpans = true;\n }\n\n if (marker.addToHistory)\n addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN);\n\n var curLine = from.line, cm = doc.cm, updateMaxLine;\n doc.iter(curLine, to.line + 1, function(line) {\n if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n updateMaxLine = true;\n if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);\n addMarkedSpan(line, new MarkedSpan(marker,\n curLine == from.line ? from.ch : null,\n curLine == to.line ? to.ch : null));\n ++curLine;\n });\n // lineIsHidden depends on the presence of the spans, so needs a second pass\n if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {\n if (lineIsHidden(doc, line)) updateLineHeight(line, 0);\n });\n\n if (marker.clearOnEnter) on(marker, \"beforeCursorEnter\", function() { marker.clear(); });\n\n if (marker.readOnly) {\n sawReadOnlySpans = true;\n if (doc.history.done.length || doc.history.undone.length)\n doc.clearHistory();\n }\n if (marker.collapsed) {\n marker.id = ++nextMarkerId;\n marker.atomic = true;\n }\n if (cm) {\n // Sync editor state\n if (updateMaxLine) cm.curOp.updateMaxLine = true;\n if (marker.collapsed)\n regChange(cm, from.line, to.line + 1);\n else if (marker.className || marker.title || marker.startStyle || marker.endStyle)\n for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, \"text\");\n if (marker.atomic) reCheckSelection(cm.doc);\n signalLater(cm, \"markerAdded\", cm, marker);\n }\n return marker;\n }\n\n // SHARED TEXTMARKERS\n\n // A shared marker spans multiple linked documents. It is\n // implemented as a meta-marker-object controlling multiple normal\n // markers.\n var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {\n this.markers = markers;\n this.primary = primary;\n for (var i = 0; i < markers.length; ++i)\n markers[i].parent = this;\n };\n eventMixin(SharedTextMarker);\n\n SharedTextMarker.prototype.clear = function() {\n if (this.explicitlyCleared) return;\n this.explicitlyCleared = true;\n for (var i = 0; i < this.markers.length; ++i)\n this.markers[i].clear();\n signalLater(this, \"clear\");\n };\n SharedTextMarker.prototype.find = function(side, lineObj) {\n return this.primary.find(side, lineObj);\n };\n\n function markTextShared(doc, from, to, options, type) {\n options = copyObj(options);\n options.shared = false;\n var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n var widget = options.widgetNode;\n linkedDocs(doc, function(doc) {\n if (widget) options.widgetNode = widget.cloneNode(true);\n markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n for (var i = 0; i < doc.linked.length; ++i)\n if (doc.linked[i].isParent) return;\n primary = lst(markers);\n });\n return new SharedTextMarker(markers, primary);\n }\n\n function findSharedMarkers(doc) {\n return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),\n function(m) { return m.parent; });\n }\n\n function copySharedMarkers(doc, markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], pos = marker.find();\n var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n if (cmp(mFrom, mTo)) {\n var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n marker.markers.push(subMark);\n subMark.parent = marker;\n }\n }\n }\n\n function detachSharedMarkers(markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], linked = [marker.primary.doc];;\n linkedDocs(marker.primary.doc, function(d) { linked.push(d); });\n for (var j = 0; j < marker.markers.length; j++) {\n var subMarker = marker.markers[j];\n if (indexOf(linked, subMarker.doc) == -1) {\n subMarker.parent = null;\n marker.markers.splice(j--, 1);\n }\n }\n }\n }\n\n // TEXTMARKER SPANS\n\n function MarkedSpan(marker, from, to) {\n this.marker = marker;\n this.from = from; this.to = to;\n }\n\n // Search an array of spans for a span matching the given marker.\n function getMarkedSpanFor(spans, marker) {\n if (spans) for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.marker == marker) return span;\n }\n }\n // Remove a span from an array, returning undefined if no spans are\n // left (we don't store arrays for lines without spans).\n function removeMarkedSpan(spans, span) {\n for (var r, i = 0; i < spans.length; ++i)\n if (spans[i] != span) (r || (r = [])).push(spans[i]);\n return r;\n }\n // Add a span to a line.\n function addMarkedSpan(line, span) {\n line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n span.marker.attachLine(line);\n }\n\n // Used for the algorithm that adjusts markers for a change in the\n // document. These functions cut an array of spans at a given\n // character position, returning an array of remaining chunks (or\n // undefined if nothing remains).\n function markedSpansBefore(old, startCh, isInsert) {\n if (old) for (var i = 0, nw; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);\n (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n }\n }\n return nw;\n }\n function markedSpansAfter(old, endCh, isInsert) {\n if (old) for (var i = 0, nw; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);\n (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n span.to == null ? null : span.to - endCh));\n }\n }\n return nw;\n }\n\n // Given a change object, compute the new set of marker spans that\n // cover the line in which the change took place. Removes spans\n // entirely within the change, reconnects spans belonging to the\n // same marker that appear on both sides of the change, and cuts off\n // spans partially within the change. Returns an array of span\n // arrays with one element for each line in (after) the change.\n function stretchSpansOverChange(doc, change) {\n var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n if (!oldFirst && !oldLast) return null;\n\n var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n // Get the spans that 'stick out' on both sides\n var first = markedSpansBefore(oldFirst, startCh, isInsert);\n var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n // Next, merge those two ends\n var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n if (first) {\n // Fix up .to properties of first\n for (var i = 0; i < first.length; ++i) {\n var span = first[i];\n if (span.to == null) {\n var found = getMarkedSpanFor(last, span.marker);\n if (!found) span.to = startCh;\n else if (sameLine) span.to = found.to == null ? null : found.to + offset;\n }\n }\n }\n if (last) {\n // Fix up .from in last (or move them into first in case of sameLine)\n for (var i = 0; i < last.length; ++i) {\n var span = last[i];\n if (span.to != null) span.to += offset;\n if (span.from == null) {\n var found = getMarkedSpanFor(first, span.marker);\n if (!found) {\n span.from = offset;\n if (sameLine) (first || (first = [])).push(span);\n }\n } else {\n span.from += offset;\n if (sameLine) (first || (first = [])).push(span);\n }\n }\n }\n // Make sure we didn't create any zero-length spans\n if (first) first = clearEmptySpans(first);\n if (last && last != first) last = clearEmptySpans(last);\n\n var newMarkers = [first];\n if (!sameLine) {\n // Fill gap with whole-line-spans\n var gap = change.text.length - 2, gapMarkers;\n if (gap > 0 && first)\n for (var i = 0; i < first.length; ++i)\n if (first[i].to == null)\n (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));\n for (var i = 0; i < gap; ++i)\n newMarkers.push(gapMarkers);\n newMarkers.push(last);\n }\n return newMarkers;\n }\n\n // Remove spans that are empty and don't have a clearWhenEmpty\n // option of false.\n function clearEmptySpans(spans) {\n for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n spans.splice(i--, 1);\n }\n if (!spans.length) return null;\n return spans;\n }\n\n // Used for un/re-doing changes from the history. Combines the\n // result of computing the existing spans with the set of spans that\n // existed in the history (so that deleting around a span and then\n // undoing brings back the span).\n function mergeOldSpans(doc, change) {\n var old = getOldSpans(doc, change);\n var stretched = stretchSpansOverChange(doc, change);\n if (!old) return stretched;\n if (!stretched) return old;\n\n for (var i = 0; i < old.length; ++i) {\n var oldCur = old[i], stretchCur = stretched[i];\n if (oldCur && stretchCur) {\n spans: for (var j = 0; j < stretchCur.length; ++j) {\n var span = stretchCur[j];\n for (var k = 0; k < oldCur.length; ++k)\n if (oldCur[k].marker == span.marker) continue spans;\n oldCur.push(span);\n }\n } else if (stretchCur) {\n old[i] = stretchCur;\n }\n }\n return old;\n }\n\n // Used to 'clip' out readOnly ranges when making a change.\n function removeReadOnlyRanges(doc, from, to) {\n var markers = null;\n doc.iter(from.line, to.line + 1, function(line) {\n if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {\n var mark = line.markedSpans[i].marker;\n if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n (markers || (markers = [])).push(mark);\n }\n });\n if (!markers) return null;\n var parts = [{from: from, to: to}];\n for (var i = 0; i < markers.length; ++i) {\n var mk = markers[i], m = mk.find(0);\n for (var j = 0; j < parts.length; ++j) {\n var p = parts[j];\n if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;\n var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n newParts.push({from: p.from, to: m.from});\n if (dto > 0 || !mk.inclusiveRight && !dto)\n newParts.push({from: m.to, to: p.to});\n parts.splice.apply(parts, newParts);\n j += newParts.length - 1;\n }\n }\n return parts;\n }\n\n // Connect or disconnect spans from a line.\n function detachMarkedSpans(line) {\n var spans = line.markedSpans;\n if (!spans) return;\n for (var i = 0; i < spans.length; ++i)\n spans[i].marker.detachLine(line);\n line.markedSpans = null;\n }\n function attachMarkedSpans(line, spans) {\n if (!spans) return;\n for (var i = 0; i < spans.length; ++i)\n spans[i].marker.attachLine(line);\n line.markedSpans = spans;\n }\n\n // Helpers used when computing which overlapping collapsed span\n // counts as the larger one.\n function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }\n function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }\n\n // Returns a number indicating which of two overlapping collapsed\n // spans is larger (and thus includes the other). Falls back to\n // comparing ids when the spans cover exactly the same range.\n function compareCollapsedMarkers(a, b) {\n var lenDiff = a.lines.length - b.lines.length;\n if (lenDiff != 0) return lenDiff;\n var aPos = a.find(), bPos = b.find();\n var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n if (fromCmp) return -fromCmp;\n var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n if (toCmp) return toCmp;\n return b.id - a.id;\n }\n\n // Find out whether a line ends or starts in a collapsed span. If\n // so, return the marker for that span.\n function collapsedSpanAtSide(line, start) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n found = sp.marker;\n }\n return found;\n }\n function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }\n function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }\n\n // Test whether there exists a collapsed span that partially\n // overlaps (covers the start or end, but not both) of a new span.\n // Such overlap is not allowed.\n function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n var line = getLine(doc, lineNo);\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (!sp.marker.collapsed) continue;\n var found = sp.marker.find(0);\n var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;\n if (fromCmp <= 0 && (cmp(found.to, from) || extraRight(sp.marker) - extraLeft(marker)) > 0 ||\n fromCmp >= 0 && (cmp(found.from, to) || extraLeft(sp.marker) - extraRight(marker)) < 0)\n return true;\n }\n }\n\n // A visual line is a line as drawn on the screen. Folding, for\n // example, can cause multiple logical lines to appear on the same\n // visual line. This finds the start of the visual line that the\n // given line is part of (usually that is the line itself).\n function visualLine(line) {\n var merged;\n while (merged = collapsedSpanAtStart(line))\n line = merged.find(-1, true).line;\n return line;\n }\n\n // Returns an array of logical lines that continue the visual line\n // started by the argument, or undefined if there are no such lines.\n function visualLineContinued(line) {\n var merged, lines;\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line;\n (lines || (lines = [])).push(line);\n }\n return lines;\n }\n\n // Get the line number of the start of the visual line that the\n // given line number is part of.\n function visualLineNo(doc, lineN) {\n var line = getLine(doc, lineN), vis = visualLine(line);\n if (line == vis) return lineN;\n return lineNo(vis);\n }\n // Get the line number of the start of the next visual line after\n // the given line.\n function visualLineEndNo(doc, lineN) {\n if (lineN > doc.lastLine()) return lineN;\n var line = getLine(doc, lineN), merged;\n if (!lineIsHidden(doc, line)) return lineN;\n while (merged = collapsedSpanAtEnd(line))\n line = merged.find(1, true).line;\n return lineNo(line) + 1;\n }\n\n // Compute whether a line is hidden. Lines count as hidden when they\n // are part of a visual line that starts with another line, or when\n // they are entirely covered by collapsed, non-widget span.\n function lineIsHidden(doc, line) {\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (!sp.marker.collapsed) continue;\n if (sp.from == null) return true;\n if (sp.marker.widgetNode) continue;\n if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n return true;\n }\n }\n function lineIsHiddenInner(doc, line, span) {\n if (span.to == null) {\n var end = span.marker.find(1, true);\n return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));\n }\n if (span.marker.inclusiveRight && span.to == line.text.length)\n return true;\n for (var sp, i = 0; i < line.markedSpans.length; ++i) {\n sp = line.markedSpans[i];\n if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n (sp.to == null || sp.to != span.from) &&\n (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n lineIsHiddenInner(doc, line, sp)) return true;\n }\n }\n\n // LINE WIDGETS\n\n // Line widgets are block elements displayed above or below a line.\n\n var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {\n if (options) for (var opt in options) if (options.hasOwnProperty(opt))\n this[opt] = options[opt];\n this.cm = cm;\n this.node = node;\n };\n eventMixin(LineWidget);\n\n function adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n addToScrollPos(cm, null, diff);\n }\n\n LineWidget.prototype.clear = function() {\n var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n if (no == null || !ws) return;\n for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);\n if (!ws.length) line.widgets = null;\n var height = widgetHeight(this);\n runInOp(cm, function() {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n updateLineHeight(line, Math.max(0, line.height - height));\n });\n };\n LineWidget.prototype.changed = function() {\n var oldH = this.height, cm = this.cm, line = this.line;\n this.height = null;\n var diff = widgetHeight(this) - oldH;\n if (!diff) return;\n runInOp(cm, function() {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n updateLineHeight(line, line.height + diff);\n });\n };\n\n function widgetHeight(widget) {\n if (widget.height != null) return widget.height;\n if (!contains(document.body, widget.node))\n removeChildrenAndAdd(widget.cm.display.measure, elt(\"div\", [widget.node], null, \"position: relative\"));\n return widget.height = widget.node.offsetHeight;\n }\n\n function addLineWidget(cm, handle, node, options) {\n var widget = new LineWidget(cm, node, options);\n if (widget.noHScroll) cm.display.alignWidgets = true;\n changeLine(cm, handle, \"widget\", function(line) {\n var widgets = line.widgets || (line.widgets = []);\n if (widget.insertAt == null) widgets.push(widget);\n else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);\n widget.line = line;\n if (!lineIsHidden(cm.doc, line)) {\n var aboveVisible = heightAtLine(line) < cm.doc.scrollTop;\n updateLineHeight(line, line.height + widgetHeight(widget));\n if (aboveVisible) addToScrollPos(cm, null, widget.height);\n cm.curOp.forceUpdate = true;\n }\n return true;\n });\n return widget;\n }\n\n // LINE DATA STRUCTURE\n\n // Line objects. These hold state related to a line, including\n // highlighting info (the styles array).\n var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n };\n eventMixin(Line);\n Line.prototype.lineNo = function() { return lineNo(this); };\n\n // Change the content (text, markers) of a line. Automatically\n // invalidates cached information and tries to re-estimate the\n // line's height.\n function updateLine(line, text, markedSpans, estimateHeight) {\n line.text = text;\n if (line.stateAfter) line.stateAfter = null;\n if (line.styles) line.styles = null;\n if (line.order != null) line.order = null;\n detachMarkedSpans(line);\n attachMarkedSpans(line, markedSpans);\n var estHeight = estimateHeight ? estimateHeight(line) : 1;\n if (estHeight != line.height) updateLineHeight(line, estHeight);\n }\n\n // Detach a line from the document tree and its markers.\n function cleanUpLine(line) {\n line.parent = null;\n detachMarkedSpans(line);\n }\n\n function extractLineClasses(type, output) {\n if (type) for (;;) {\n var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n if (!lineClass) break;\n type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n if (output[prop] == null)\n output[prop] = lineClass[2];\n else if (!(new RegExp(\"(?:^|\\s)\" + lineClass[2] + \"(?:$|\\s)\")).test(output[prop]))\n output[prop] += \" \" + lineClass[2];\n }\n return type;\n }\n\n function callBlankLine(mode, state) {\n if (mode.blankLine) return mode.blankLine(state);\n if (!mode.innerMode) return;\n var inner = CodeMirror.innerMode(mode, state);\n if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);\n }\n\n function readToken(mode, stream, state) {\n for (var i = 0; i < 10; i++) {\n var style = mode.token(stream, state);\n if (stream.pos > stream.start) return style;\n }\n throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\");\n }\n\n // Run the given mode's parser over a line, calling f for each token.\n function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {\n var flattenSpans = mode.flattenSpans;\n if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;\n var curStart = 0, curStyle = null;\n var stream = new StringStream(text, cm.options.tabSize), style;\n if (text == \"\") extractLineClasses(callBlankLine(mode, state), lineClasses);\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) processLine(cm, text, state, stream.pos);\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, state), lineClasses);\n }\n if (cm.options.addModeClass) {\n var mName = CodeMirror.innerMode(mode, state).mode.name;\n if (mName) style = \"m-\" + (style ? mName + \" \" + style : mName);\n }\n if (!flattenSpans || curStyle != style) {\n if (curStart < stream.start) f(stream.start, curStyle);\n curStart = stream.start; curStyle = style;\n }\n stream.start = stream.pos;\n }\n while (curStart < stream.pos) {\n // Webkit seems to refuse to render text nodes longer than 57444 characters\n var pos = Math.min(stream.pos, curStart + 50000);\n f(pos, curStyle);\n curStart = pos;\n }\n }\n\n // Compute a style array (an array starting with a mode generation\n // -- for invalidation -- followed by pairs of end positions and\n // style strings), which is used to highlight the tokens on the\n // line.\n function highlightLine(cm, line, state, forceToEnd) {\n // A styles array always starts with a number identifying the\n // mode/overlays that it is based on (for easy invalidation).\n var st = [cm.state.modeGen], lineClasses = {};\n // Compute the base array of styles\n runMode(cm, line.text, cm.doc.mode, state, function(end, style) {\n st.push(end, style);\n }, lineClasses, forceToEnd);\n\n // Run overlays, adjust style array.\n for (var o = 0; o < cm.state.overlays.length; ++o) {\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n runMode(cm, line.text, overlay.mode, true, function(end, style) {\n var start = i;\n // Ensure there's a token end at the current position, and that i points at it\n while (at < end) {\n var i_end = st[i];\n if (i_end > end)\n st.splice(i, 1, end, st[i+1], i_end);\n i += 2;\n at = Math.min(end, i_end);\n }\n if (!style) return;\n if (overlay.opaque) {\n st.splice(start, i - start, end, \"cm-overlay \" + style);\n i = start + 2;\n } else {\n for (; start < i; start += 2) {\n var cur = st[start+1];\n st[start+1] = (cur ? cur + \" \" : \"\") + \"cm-overlay \" + style;\n }\n }\n }, lineClasses);\n }\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};\n }\n\n function getLineStyles(cm, line) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));\n line.styles = result.styles;\n if (result.classes) line.styleClasses = result.classes;\n else if (line.styleClasses) line.styleClasses = null;\n }\n return line.styles;\n }\n\n // Lightweight form of highlight -- proceed over this line and\n // update state, but don't save a style array. Used for lines that\n // aren't currently visible.\n function processLine(cm, text, state, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") callBlankLine(mode, state);\n while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {\n readToken(mode, stream, state);\n stream.start = stream.pos;\n }\n }\n\n // Convert a style as returned by a mode (either null, or a string\n // containing one or more styles) to a CSS style. This is cached,\n // and also looks for line-wide styles.\n var styleToClassCache = {}, styleToClassCacheWithMode = {};\n function interpretTokenStyle(style, options) {\n if (!style || /^\\s*$/.test(style)) return null;\n var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n return cache[style] ||\n (cache[style] = style.replace(/\\S+/g, \"cm-$&\"));\n }\n\n // Render the DOM representation of the text of a line. Also builds\n // up a 'line map', which points at the DOM nodes that represent\n // specific stretches of text, and is used by the measuring code.\n // The returned object contains the DOM node, this map, and\n // information about line-wide styles that were set by the mode.\n function buildLineContent(cm, lineView) {\n // The padding-right forces the element to have a 'border', which\n // is needed on Webkit to be able to get line-level bounding\n // rectangles for it (in measureChar).\n var content = elt(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: elt(\"pre\", [content]), content: content, col: 0, pos: 0, cm: cm};\n lineView.measure = {};\n\n // Iterate over the logical lines that make up this visual line.\n for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n var line = i ? lineView.rest[i - 1] : lineView.line, order;\n builder.pos = 0;\n builder.addToken = buildToken;\n // Optionally wire in some hacks into the token-rendering\n // algorithm, to deal with browser quirks.\n if ((ie || webkit) && cm.getOption(\"lineWrapping\"))\n builder.addToken = buildTokenSplitSpaces(builder.addToken);\n if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))\n builder.addToken = buildTokenBadBidi(builder.addToken, order);\n builder.map = [];\n insertLineContent(line, builder, getLineStyles(cm, line));\n if (line.styleClasses) {\n if (line.styleClasses.bgClass)\n builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\");\n if (line.styleClasses.textClass)\n builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\");\n }\n\n // Ensure at least a single node is present, for measuring.\n if (builder.map.length == 0)\n builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));\n\n // Store the map and a cache object for the current logical line\n if (i == 0) {\n lineView.measure.map = builder.map;\n lineView.measure.cache = {};\n } else {\n (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);\n (lineView.measure.caches || (lineView.measure.caches = [])).push({});\n }\n }\n\n signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n return builder;\n }\n\n function defaultSpecialCharPlaceholder(ch) {\n var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n return token;\n }\n\n // Build up the DOM representation for a single token, and add it to\n // the line map. Takes care to render special characters separately.\n function buildToken(builder, text, style, startStyle, endStyle, title) {\n if (!text) return;\n var special = builder.cm.options.specialChars, mustWrap = false;\n if (!special.test(text)) {\n builder.col += text.length;\n var content = document.createTextNode(text);\n builder.map.push(builder.pos, builder.pos + text.length, content);\n if (ie_upto8) mustWrap = true;\n builder.pos += text.length;\n } else {\n var content = document.createDocumentFragment(), pos = 0;\n while (true) {\n special.lastIndex = pos;\n var m = special.exec(text);\n var skipped = m ? m.index - pos : text.length - pos;\n if (skipped) {\n var txt = document.createTextNode(text.slice(pos, pos + skipped));\n if (ie_upto8) content.appendChild(elt(\"span\", [txt]));\n else content.appendChild(txt);\n builder.map.push(builder.pos, builder.pos + skipped, txt);\n builder.col += skipped;\n builder.pos += skipped;\n }\n if (!m) break;\n pos += skipped + 1;\n if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n var txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n builder.col += tabWidth;\n } else {\n var txt = builder.cm.options.specialCharPlaceholder(m[0]);\n if (ie_upto8) content.appendChild(elt(\"span\", [txt]));\n else content.appendChild(txt);\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt);\n builder.pos++;\n }\n }\n if (style || startStyle || endStyle || mustWrap) {\n var fullStyle = style || \"\";\n if (startStyle) fullStyle += startStyle;\n if (endStyle) fullStyle += endStyle;\n var token = elt(\"span\", [content], fullStyle);\n if (title) token.title = title;\n return builder.content.appendChild(token);\n }\n builder.content.appendChild(content);\n }\n\n function buildTokenSplitSpaces(inner) {\n function split(old) {\n var out = \" \";\n for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? \" \" : \"\\u00a0\";\n out += \" \";\n return out;\n }\n return function(builder, text, style, startStyle, endStyle, title) {\n inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);\n };\n }\n\n // Work around nonsense dimensions being reported for stretches of\n // right-to-left text.\n function buildTokenBadBidi(inner, order) {\n return function(builder, text, style, startStyle, endStyle, title) {\n style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n var start = builder.pos, end = start + text.length;\n for (;;) {\n // Find the part that overlaps with the start of this text\n for (var i = 0; i < order.length; i++) {\n var part = order[i];\n if (part.to > start && part.from <= start) break;\n }\n if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);\n inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);\n startStyle = null;\n text = text.slice(part.to - start);\n start = part.to;\n }\n };\n }\n\n function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n var widget = !ignoreWidget && marker.widgetNode;\n if (widget) {\n builder.map.push(builder.pos, builder.pos + size, widget);\n builder.content.appendChild(widget);\n }\n builder.pos += size;\n }\n\n // Outputs a number of spans to make up a line, taking highlighting\n // and marked text into account.\n function insertLineContent(line, builder, styles) {\n var spans = line.markedSpans, allText = line.text, at = 0;\n if (!spans) {\n for (var i = 1; i < styles.length; i+=2)\n builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));\n return;\n }\n\n var len = allText.length, pos = 0, i = 1, text = \"\", style;\n var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;\n for (;;) {\n if (nextChange == pos) { // Update current marker set\n spanStyle = spanEndStyle = spanStartStyle = title = \"\";\n collapsed = null; nextChange = Infinity;\n var foundBookmarks = [];\n for (var j = 0; j < spans.length; ++j) {\n var sp = spans[j], m = sp.marker;\n if (sp.from <= pos && (sp.to == null || sp.to > pos)) {\n if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = \"\"; }\n if (m.className) spanStyle += \" \" + m.className;\n if (m.startStyle && sp.from == pos) spanStartStyle += \" \" + m.startStyle;\n if (m.endStyle && sp.to == nextChange) spanEndStyle += \" \" + m.endStyle;\n if (m.title && !title) title = m.title;\n if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n collapsed = sp;\n } else if (sp.from > pos && nextChange > sp.from) {\n nextChange = sp.from;\n }\n if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) foundBookmarks.push(m);\n }\n if (collapsed && (collapsed.from || 0) == pos) {\n buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n collapsed.marker, collapsed.from == null);\n if (collapsed.to == null) return;\n }\n if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)\n buildCollapsedSpan(builder, 0, foundBookmarks[j]);\n }\n if (pos >= len) break;\n\n var upto = Math.min(len, nextChange);\n while (true) {\n if (text) {\n var end = pos + text.length;\n if (!collapsed) {\n var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", title);\n }\n if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}\n pos = end;\n spanStartStyle = \"\";\n }\n text = allText.slice(at, at = styles[i++]);\n style = interpretTokenStyle(styles[i++], builder.cm.options);\n }\n }\n }\n\n // DOCUMENT DATA STRUCTURE\n\n // By default, updates that start and end at the beginning of a line\n // are treated specially, in order to make the association of line\n // widgets and marker elements with the text behave more intuitive.\n function isWholeLineUpdate(doc, change) {\n return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n (!doc.cm || doc.cm.options.wholeLineUpdateBefore);\n }\n\n // Perform a change on the document data structure.\n function updateDoc(doc, change, markedSpans, estimateHeight) {\n function spansFor(n) {return markedSpans ? markedSpans[n] : null;}\n function update(line, text, spans) {\n updateLine(line, text, spans, estimateHeight);\n signalLater(line, \"change\", line, change);\n }\n\n var from = change.from, to = change.to, text = change.text;\n var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n // Adjust the line structure\n if (isWholeLineUpdate(doc, change)) {\n // This is a whole-line replace. Treated specially to make\n // sure line objects move the way they are supposed to.\n for (var i = 0, added = []; i < text.length - 1; ++i)\n added.push(new Line(text[i], spansFor(i), estimateHeight));\n update(lastLine, lastLine.text, lastSpans);\n if (nlines) doc.remove(from.line, nlines);\n if (added.length) doc.insert(from.line, added);\n } else if (firstLine == lastLine) {\n if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n } else {\n for (var added = [], i = 1; i < text.length - 1; ++i)\n added.push(new Line(text[i], spansFor(i), estimateHeight));\n added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n doc.insert(from.line + 1, added);\n }\n } else if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n doc.remove(from.line + 1, nlines);\n } else {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n for (var i = 1, added = []; i < text.length - 1; ++i)\n added.push(new Line(text[i], spansFor(i), estimateHeight));\n if (nlines > 1) doc.remove(from.line + 1, nlines - 1);\n doc.insert(from.line + 1, added);\n }\n\n signalLater(doc, \"change\", doc, change);\n }\n\n // The document is represented as a BTree consisting of leaves, with\n // chunk of lines in them, and branches, with up to ten leaves or\n // other branch nodes below them. The top node is always a branch\n // node, and is the document object itself (meaning it has\n // additional methods and properties).\n //\n // All nodes have parent links. The tree is used both to go from\n // line numbers to line objects, and to go from objects to numbers.\n // It also indexes by height, and is used to convert between height\n // and line object, and to find the total height of the document.\n //\n // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n function LeafChunk(lines) {\n this.lines = lines;\n this.parent = null;\n for (var i = 0, height = 0; i < lines.length; ++i) {\n lines[i].parent = this;\n height += lines[i].height;\n }\n this.height = height;\n }\n\n LeafChunk.prototype = {\n chunkSize: function() { return this.lines.length; },\n // Remove the n lines at offset 'at'.\n removeInner: function(at, n) {\n for (var i = at, e = at + n; i < e; ++i) {\n var line = this.lines[i];\n this.height -= line.height;\n cleanUpLine(line);\n signalLater(line, \"delete\");\n }\n this.lines.splice(at, n);\n },\n // Helper used to collapse a small branch into a single leaf.\n collapse: function(lines) {\n lines.push.apply(lines, this.lines);\n },\n // Insert the given array of lines at offset 'at', count them as\n // having the given height.\n insertInner: function(at, lines, height) {\n this.height += height;\n this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n for (var i = 0; i < lines.length; ++i) lines[i].parent = this;\n },\n // Used to iterate over a part of the tree.\n iterN: function(at, n, op) {\n for (var e = at + n; at < e; ++at)\n if (op(this.lines[at])) return true;\n }\n };\n\n function BranchChunk(children) {\n this.children = children;\n var size = 0, height = 0;\n for (var i = 0; i < children.length; ++i) {\n var ch = children[i];\n size += ch.chunkSize(); height += ch.height;\n ch.parent = this;\n }\n this.size = size;\n this.height = height;\n this.parent = null;\n }\n\n BranchChunk.prototype = {\n chunkSize: function() { return this.size; },\n removeInner: function(at, n) {\n this.size -= n;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var rm = Math.min(n, sz - at), oldHeight = child.height;\n child.removeInner(at, rm);\n this.height -= oldHeight - child.height;\n if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n if ((n -= rm) == 0) break;\n at = 0;\n } else at -= sz;\n }\n // If the result is smaller than 25 lines, ensure that it is a\n // single leaf node.\n if (this.size - n < 25 &&\n (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n var lines = [];\n this.collapse(lines);\n this.children = [new LeafChunk(lines)];\n this.children[0].parent = this;\n }\n },\n collapse: function(lines) {\n for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);\n },\n insertInner: function(at, lines, height) {\n this.size += lines.length;\n this.height += height;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at <= sz) {\n child.insertInner(at, lines, height);\n if (child.lines && child.lines.length > 50) {\n while (child.lines.length > 50) {\n var spilled = child.lines.splice(child.lines.length - 25, 25);\n var newleaf = new LeafChunk(spilled);\n child.height -= newleaf.height;\n this.children.splice(i + 1, 0, newleaf);\n newleaf.parent = this;\n }\n this.maybeSpill();\n }\n break;\n }\n at -= sz;\n }\n },\n // When a node has grown, check whether it should be split.\n maybeSpill: function() {\n if (this.children.length <= 10) return;\n var me = this;\n do {\n var spilled = me.children.splice(me.children.length - 5, 5);\n var sibling = new BranchChunk(spilled);\n if (!me.parent) { // Become the parent node\n var copy = new BranchChunk(me.children);\n copy.parent = me;\n me.children = [copy, sibling];\n me = copy;\n } else {\n me.size -= sibling.size;\n me.height -= sibling.height;\n var myIndex = indexOf(me.parent.children, me);\n me.parent.children.splice(myIndex + 1, 0, sibling);\n }\n sibling.parent = me.parent;\n } while (me.children.length > 10);\n me.parent.maybeSpill();\n },\n iterN: function(at, n, op) {\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var used = Math.min(n, sz - at);\n if (child.iterN(at, used, op)) return true;\n if ((n -= used) == 0) break;\n at = 0;\n } else at -= sz;\n }\n }\n };\n\n var nextDocId = 0;\n var Doc = CodeMirror.Doc = function(text, mode, firstLine) {\n if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);\n if (firstLine == null) firstLine = 0;\n\n BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n this.first = firstLine;\n this.scrollTop = this.scrollLeft = 0;\n this.cantEdit = false;\n this.cleanGeneration = 1;\n this.frontier = firstLine;\n var start = Pos(firstLine, 0);\n this.sel = simpleSelection(start);\n this.history = new History(null);\n this.id = ++nextDocId;\n this.modeOption = mode;\n\n if (typeof text == \"string\") text = splitLines(text);\n updateDoc(this, {from: start, to: start, text: text});\n setSelection(this, simpleSelection(start), sel_dontScroll);\n };\n\n Doc.prototype = createObj(BranchChunk.prototype, {\n constructor: Doc,\n // Iterate over the document. Supports two forms -- with only one\n // argument, it calls that for each line in the document. With\n // three, it iterates over the range given by the first two (with\n // the second being non-inclusive).\n iter: function(from, to, op) {\n if (op) this.iterN(from - this.first, to - from, op);\n else this.iterN(this.first, this.first + this.size, from);\n },\n\n // Non-public interface for adding and removing lines.\n insert: function(at, lines) {\n var height = 0;\n for (var i = 0; i < lines.length; ++i) height += lines[i].height;\n this.insertInner(at - this.first, lines, height);\n },\n remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n // From here, the methods are part of the public interface. Most\n // are also available from CodeMirror (editor) instances.\n\n getValue: function(lineSep) {\n var lines = getLines(this, this.first, this.first + this.size);\n if (lineSep === false) return lines;\n return lines.join(lineSep || \"\\n\");\n },\n setValue: docMethodOp(function(code) {\n var top = Pos(this.first, 0), last = this.first + this.size - 1;\n makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n text: splitLines(code), origin: \"setValue\"}, true);\n setSelection(this, simpleSelection(top));\n }),\n replaceRange: function(code, from, to, origin) {\n from = clipPos(this, from);\n to = to ? clipPos(this, to) : from;\n replaceRange(this, code, from, to, origin);\n },\n getRange: function(from, to, lineSep) {\n var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n if (lineSep === false) return lines;\n return lines.join(lineSep || \"\\n\");\n },\n\n getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},\n\n getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},\n getLineNumber: function(line) {return lineNo(line);},\n\n getLineHandleVisualStart: function(line) {\n if (typeof line == \"number\") line = getLine(this, line);\n return visualLine(line);\n },\n\n lineCount: function() {return this.size;},\n firstLine: function() {return this.first;},\n lastLine: function() {return this.first + this.size - 1;},\n\n clipPos: function(pos) {return clipPos(this, pos);},\n\n getCursor: function(start) {\n var range = this.sel.primary(), pos;\n if (start == null || start == \"head\") pos = range.head;\n else if (start == \"anchor\") pos = range.anchor;\n else if (start == \"end\" || start == \"to\" || start === false) pos = range.to();\n else pos = range.from();\n return pos;\n },\n listSelections: function() { return this.sel.ranges; },\n somethingSelected: function() {return this.sel.somethingSelected();},\n\n setCursor: docMethodOp(function(line, ch, options) {\n setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n }),\n setSelection: docMethodOp(function(anchor, head, options) {\n setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n }),\n extendSelection: docMethodOp(function(head, other, options) {\n extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n }),\n extendSelections: docMethodOp(function(heads, options) {\n extendSelections(this, clipPosArray(this, heads, options));\n }),\n extendSelectionsBy: docMethodOp(function(f, options) {\n extendSelections(this, map(this.sel.ranges, f), options);\n }),\n setSelections: docMethodOp(function(ranges, primary, options) {\n if (!ranges.length) return;\n for (var i = 0, out = []; i < ranges.length; i++)\n out[i] = new Range(clipPos(this, ranges[i].anchor),\n clipPos(this, ranges[i].head));\n if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);\n setSelection(this, normalizeSelection(out, primary), options);\n }),\n addSelection: docMethodOp(function(anchor, head, options) {\n var ranges = this.sel.ranges.slice(0);\n ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);\n }),\n\n getSelection: function(lineSep) {\n var ranges = this.sel.ranges, lines;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n lines = lines ? lines.concat(sel) : sel;\n }\n if (lineSep === false) return lines;\n else return lines.join(lineSep || \"\\n\");\n },\n getSelections: function(lineSep) {\n var parts = [], ranges = this.sel.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n if (lineSep !== false) sel = sel.join(lineSep || \"\\n\");\n parts[i] = sel;\n }\n return parts;\n },\n replaceSelection: function(code, collapse, origin) {\n var dup = [];\n for (var i = 0; i < this.sel.ranges.length; i++)\n dup[i] = code;\n this.replaceSelections(dup, collapse, origin || \"+input\");\n },\n replaceSelections: docMethodOp(function(code, collapse, origin) {\n var changes = [], sel = this.sel;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin};\n }\n var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n for (var i = changes.length - 1; i >= 0; i--)\n makeChange(this, changes[i]);\n if (newSel) setSelectionReplaceHistory(this, newSel);\n else if (this.cm) ensureCursorVisible(this.cm);\n }),\n undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n setExtending: function(val) {this.extend = val;},\n getExtending: function() {return this.extend;},\n\n historySize: function() {\n var hist = this.history, done = 0, undone = 0;\n for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;\n for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;\n return {undo: done, redo: undone};\n },\n clearHistory: function() {this.history = new History(this.history.maxGeneration);},\n\n markClean: function() {\n this.cleanGeneration = this.changeGeneration(true);\n },\n changeGeneration: function(forceSplit) {\n if (forceSplit)\n this.history.lastOp = this.history.lastOrigin = null;\n return this.history.generation;\n },\n isClean: function (gen) {\n return this.history.generation == (gen || this.cleanGeneration);\n },\n\n getHistory: function() {\n return {done: copyHistoryArray(this.history.done),\n undone: copyHistoryArray(this.history.undone)};\n },\n setHistory: function(histData) {\n var hist = this.history = new History(this.history.maxGeneration);\n hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n },\n\n markText: function(from, to, options) {\n return markText(this, clipPos(this, from), clipPos(this, to), options, \"range\");\n },\n setBookmark: function(pos, options) {\n var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n insertLeft: options && options.insertLeft,\n clearWhenEmpty: false, shared: options && options.shared};\n pos = clipPos(this, pos);\n return markText(this, pos, pos, realOpts, \"bookmark\");\n },\n findMarksAt: function(pos) {\n pos = clipPos(this, pos);\n var markers = [], spans = getLine(this, pos.line).markedSpans;\n if (spans) for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if ((span.from == null || span.from <= pos.ch) &&\n (span.to == null || span.to >= pos.ch))\n markers.push(span.marker.parent || span.marker);\n }\n return markers;\n },\n findMarks: function(from, to, filter) {\n from = clipPos(this, from); to = clipPos(this, to);\n var found = [], lineNo = from.line;\n this.iter(from.line, to.line + 1, function(line) {\n var spans = line.markedSpans;\n if (spans) for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n if (!(lineNo == from.line && from.ch > span.to ||\n span.from == null && lineNo != from.line||\n lineNo == to.line && span.from > to.ch) &&\n (!filter || filter(span.marker)))\n found.push(span.marker.parent || span.marker);\n }\n ++lineNo;\n });\n return found;\n },\n getAllMarks: function() {\n var markers = [];\n this.iter(function(line) {\n var sps = line.markedSpans;\n if (sps) for (var i = 0; i < sps.length; ++i)\n if (sps[i].from != null) markers.push(sps[i].marker);\n });\n return markers;\n },\n\n posFromIndex: function(off) {\n var ch, lineNo = this.first;\n this.iter(function(line) {\n var sz = line.text.length + 1;\n if (sz > off) { ch = off; return true; }\n off -= sz;\n ++lineNo;\n });\n return clipPos(this, Pos(lineNo, ch));\n },\n indexFromPos: function (coords) {\n coords = clipPos(this, coords);\n var index = coords.ch;\n if (coords.line < this.first || coords.ch < 0) return 0;\n this.iter(this.first, coords.line, function (line) {\n index += line.text.length + 1;\n });\n return index;\n },\n\n copy: function(copyHistory) {\n var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);\n doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n doc.sel = this.sel;\n doc.extend = false;\n if (copyHistory) {\n doc.history.undoDepth = this.history.undoDepth;\n doc.setHistory(this.getHistory());\n }\n return doc;\n },\n\n linkedDoc: function(options) {\n if (!options) options = {};\n var from = this.first, to = this.first + this.size;\n if (options.from != null && options.from > from) from = options.from;\n if (options.to != null && options.to < to) to = options.to;\n var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);\n if (options.sharedHist) copy.history = this.history;\n (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n copySharedMarkers(copy, findSharedMarkers(this));\n return copy;\n },\n unlinkDoc: function(other) {\n if (other instanceof CodeMirror) other = other.doc;\n if (this.linked) for (var i = 0; i < this.linked.length; ++i) {\n var link = this.linked[i];\n if (link.doc != other) continue;\n this.linked.splice(i, 1);\n other.unlinkDoc(this);\n detachSharedMarkers(findSharedMarkers(this));\n break;\n }\n // If the histories were shared, split them again\n if (other.history == this.history) {\n var splitIds = [other.id];\n linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);\n other.history = new History(null);\n other.history.done = copyHistoryArray(this.history.done, splitIds);\n other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n }\n },\n iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n getMode: function() {return this.mode;},\n getEditor: function() {return this.cm;}\n });\n\n // Public alias.\n Doc.prototype.eachLine = Doc.prototype.iter;\n\n // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n var dontDelegate = \"iter insert remove copy getEditor\".split(\" \");\n for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n CodeMirror.prototype[prop] = (function(method) {\n return function() {return method.apply(this.doc, arguments);};\n })(Doc.prototype[prop]);\n\n eventMixin(Doc);\n\n // Call f for all linked documents.\n function linkedDocs(doc, f, sharedHistOnly) {\n function propagate(doc, skip, sharedHist) {\n if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {\n var rel = doc.linked[i];\n if (rel.doc == skip) continue;\n var shared = sharedHist && rel.sharedHist;\n if (sharedHistOnly && !shared) continue;\n f(rel.doc, shared);\n propagate(rel.doc, doc, shared);\n }\n }\n propagate(doc, null, true);\n }\n\n // Attach a document to an editor.\n function attachDoc(cm, doc) {\n if (doc.cm) throw new Error(\"This document is already in use.\");\n cm.doc = doc;\n doc.cm = cm;\n estimateLineHeights(cm);\n loadMode(cm);\n if (!cm.options.lineWrapping) findMaxLine(cm);\n cm.options.mode = doc.modeOption;\n regChange(cm);\n }\n\n // LINE UTILITIES\n\n // Find the line object corresponding to the given line number.\n function getLine(doc, n) {\n n -= doc.first;\n if (n < 0 || n >= doc.size) throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\");\n for (var chunk = doc; !chunk.lines;) {\n for (var i = 0;; ++i) {\n var child = chunk.children[i], sz = child.chunkSize();\n if (n < sz) { chunk = child; break; }\n n -= sz;\n }\n }\n return chunk.lines[n];\n }\n\n // Get the part of a document between two positions, as an array of\n // strings.\n function getBetween(doc, start, end) {\n var out = [], n = start.line;\n doc.iter(start.line, end.line + 1, function(line) {\n var text = line.text;\n if (n == end.line) text = text.slice(0, end.ch);\n if (n == start.line) text = text.slice(start.ch);\n out.push(text);\n ++n;\n });\n return out;\n }\n // Get the lines between from and to, as array of strings.\n function getLines(doc, from, to) {\n var out = [];\n doc.iter(from, to, function(line) { out.push(line.text); });\n return out;\n }\n\n // Update the height of a line, propagating the height change\n // upwards to parent nodes.\n function updateLineHeight(line, height) {\n var diff = height - line.height;\n if (diff) for (var n = line; n; n = n.parent) n.height += diff;\n }\n\n // Given a line object, find its line number by walking up through\n // its parent links.\n function lineNo(line) {\n if (line.parent == null) return null;\n var cur = line.parent, no = indexOf(cur.lines, line);\n for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n for (var i = 0;; ++i) {\n if (chunk.children[i] == cur) break;\n no += chunk.children[i].chunkSize();\n }\n }\n return no + cur.first;\n }\n\n // Find the line at the given vertical position, using the height\n // information in the document tree.\n function lineAtHeight(chunk, h) {\n var n = chunk.first;\n outer: do {\n for (var i = 0; i < chunk.children.length; ++i) {\n var child = chunk.children[i], ch = child.height;\n if (h < ch) { chunk = child; continue outer; }\n h -= ch;\n n += child.chunkSize();\n }\n return n;\n } while (!chunk.lines);\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i], lh = line.height;\n if (h < lh) break;\n h -= lh;\n }\n return n + i;\n }\n\n\n // Find the height above the given line.\n function heightAtLine(lineObj) {\n lineObj = visualLine(lineObj);\n\n var h = 0, chunk = lineObj.parent;\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i];\n if (line == lineObj) break;\n else h += line.height;\n }\n for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n for (var i = 0; i < p.children.length; ++i) {\n var cur = p.children[i];\n if (cur == chunk) break;\n else h += cur.height;\n }\n }\n return h;\n }\n\n // Get the bidi ordering for the given line (and cache it). Returns\n // false for lines that are fully left-to-right, and an array of\n // BidiSpan objects otherwise.\n function getOrder(line) {\n var order = line.order;\n if (order == null) order = line.order = bidiOrdering(line.text);\n return order;\n }\n\n // HISTORY\n\n function History(startGen) {\n // Arrays of change events and selections. Doing something adds an\n // event to done and clears undo. Undoing moves events from done\n // to undone, redoing moves them in the other direction.\n this.done = []; this.undone = [];\n this.undoDepth = Infinity;\n // Used to track when changes can be merged into a single undo\n // event\n this.lastModTime = this.lastSelTime = 0;\n this.lastOp = null;\n this.lastOrigin = this.lastSelOrigin = null;\n // Used by the isClean() method\n this.generation = this.maxGeneration = startGen || 1;\n }\n\n // Create a history change event from an updateDoc-style change\n // object.\n function historyChangeFromChange(doc, change) {\n var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);\n return histChange;\n }\n\n // Pop all selection events off the end of a history array. Stop at\n // a change event.\n function clearSelectionEvents(array) {\n while (array.length) {\n var last = lst(array);\n if (last.ranges) array.pop();\n else break;\n }\n }\n\n // Find the top change event in the history. Pop off selection\n // events that are in the way.\n function lastChangeEvent(hist, force) {\n if (force) {\n clearSelectionEvents(hist.done);\n return lst(hist.done);\n } else if (hist.done.length && !lst(hist.done).ranges) {\n return lst(hist.done);\n } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n hist.done.pop();\n return lst(hist.done);\n }\n }\n\n // Register a change in the history. Merges changes that are within\n // a single operation, ore are close together with an origin that\n // allows merging (starting with \"+\") into a single event.\n function addChangeToHistory(doc, change, selAfter, opId) {\n var hist = doc.history;\n hist.undone.length = 0;\n var time = +new Date, cur;\n\n if ((hist.lastOp == opId ||\n hist.lastOrigin == change.origin && change.origin &&\n ((change.origin.charAt(0) == \"+\" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||\n change.origin.charAt(0) == \"*\")) &&\n (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n // Merge this change into the last event\n var last = lst(cur.changes);\n if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n // Optimized case for simple insertion -- don't want to add\n // new changesets for every character typed\n last.to = changeEnd(change);\n } else {\n // Add new sub-event\n cur.changes.push(historyChangeFromChange(doc, change));\n }\n } else {\n // Can not be merged, start a new event.\n var before = lst(hist.done);\n if (!before || !before.ranges)\n pushSelectionToHistory(doc.sel, hist.done);\n cur = {changes: [historyChangeFromChange(doc, change)],\n generation: hist.generation};\n hist.done.push(cur);\n while (hist.done.length > hist.undoDepth) {\n hist.done.shift();\n if (!hist.done[0].ranges) hist.done.shift();\n }\n }\n hist.done.push(selAfter);\n hist.generation = ++hist.maxGeneration;\n hist.lastModTime = hist.lastSelTime = time;\n hist.lastOp = opId;\n hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n if (!last) signal(doc, \"historyAdded\");\n }\n\n function selectionEventCanBeMerged(doc, origin, prev, sel) {\n var ch = origin.charAt(0);\n return ch == \"*\" ||\n ch == \"+\" &&\n prev.ranges.length == sel.ranges.length &&\n prev.somethingSelected() == sel.somethingSelected() &&\n new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);\n }\n\n // Called whenever the selection changes, sets the new selection as\n // the pending selection in the history, and pushes the old pending\n // selection into the 'done' array when it was significantly\n // different (in number of selected ranges, emptiness, or time).\n function addSelectionToHistory(doc, sel, opId, options) {\n var hist = doc.history, origin = options && options.origin;\n\n // A new event is started when the previous origin does not match\n // the current, or the origins don't allow matching. Origins\n // starting with * are always merged, those starting with + are\n // merged when similar and close together in time.\n if (opId == hist.lastOp ||\n (origin && hist.lastSelOrigin == origin &&\n (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n hist.done[hist.done.length - 1] = sel;\n else\n pushSelectionToHistory(sel, hist.done);\n\n hist.lastSelTime = +new Date;\n hist.lastSelOrigin = origin;\n hist.lastOp = opId;\n if (options && options.clearRedo !== false)\n clearSelectionEvents(hist.undone);\n }\n\n function pushSelectionToHistory(sel, dest) {\n var top = lst(dest);\n if (!(top && top.ranges && top.equals(sel)))\n dest.push(sel);\n }\n\n // Used to store marked span information in the history.\n function attachLocalSpans(doc, change, from, to) {\n var existing = change[\"spans_\" + doc.id], n = 0;\n doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {\n if (line.markedSpans)\n (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans;\n ++n;\n });\n }\n\n // When un/re-doing restores text containing marked spans, those\n // that have been explicitly cleared should not be restored.\n function removeClearedSpans(spans) {\n if (!spans) return null;\n for (var i = 0, out; i < spans.length; ++i) {\n if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }\n else if (out) out.push(spans[i]);\n }\n return !out ? spans : out.length ? out : null;\n }\n\n // Retrieve and filter the old marked spans stored in a change event.\n function getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) return null;\n for (var i = 0, nw = []; i < change.text.length; ++i)\n nw.push(removeClearedSpans(found[i]));\n return nw;\n }\n\n // Used both to provide a JSON-safe object in .getHistory, and, when\n // detaching a document, to split the history in two\n function copyHistoryArray(events, newGroup, instantiateSel) {\n for (var i = 0, copy = []; i < events.length; ++i) {\n var event = events[i];\n if (event.ranges) {\n copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n continue;\n }\n var changes = event.changes, newChanges = [];\n copy.push({changes: newChanges});\n for (var j = 0; j < changes.length; ++j) {\n var change = changes[j], m;\n newChanges.push({from: change.from, to: change.to, text: change.text});\n if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\\d+)$/)) {\n if (indexOf(newGroup, Number(m[1])) > -1) {\n lst(newChanges)[prop] = change[prop];\n delete change[prop];\n }\n }\n }\n }\n return copy;\n }\n\n // Rebasing/resetting history to deal with externally-sourced changes\n\n function rebaseHistSelSingle(pos, from, to, diff) {\n if (to < pos.line) {\n pos.line += diff;\n } else if (from < pos.line) {\n pos.line = from;\n pos.ch = 0;\n }\n }\n\n // Tries to rebase an array of history events given a change in the\n // document. If the change touches the same lines as the event, the\n // event, and everything 'behind' it, is discarded. If the change is\n // before the event, the event's positions are updated. Uses a\n // copy-on-write scheme for the positions, to avoid having to\n // reallocate them all on every rebase, but also avoid problems with\n // shared position objects being unsafely updated.\n function rebaseHistArray(array, from, to, diff) {\n for (var i = 0; i < array.length; ++i) {\n var sub = array[i], ok = true;\n if (sub.ranges) {\n if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n for (var j = 0; j < sub.ranges.length; j++) {\n rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n }\n continue;\n }\n for (var j = 0; j < sub.changes.length; ++j) {\n var cur = sub.changes[j];\n if (to < cur.from.line) {\n cur.from = Pos(cur.from.line + diff, cur.from.ch);\n cur.to = Pos(cur.to.line + diff, cur.to.ch);\n } else if (from <= cur.to.line) {\n ok = false;\n break;\n }\n }\n if (!ok) {\n array.splice(0, i + 1);\n i = 0;\n }\n }\n }\n\n function rebaseHist(hist, change) {\n var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n rebaseHistArray(hist.done, from, to, diff);\n rebaseHistArray(hist.undone, from, to, diff);\n }\n\n // EVENT UTILITIES\n\n // Due to the fact that we still support jurassic IE versions, some\n // compatibility wrappers are needed.\n\n var e_preventDefault = CodeMirror.e_preventDefault = function(e) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n };\n var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {\n if (e.stopPropagation) e.stopPropagation();\n else e.cancelBubble = true;\n };\n function e_defaultPrevented(e) {\n return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;\n }\n var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};\n\n function e_target(e) {return e.target || e.srcElement;}\n function e_button(e) {\n var b = e.which;\n if (b == null) {\n if (e.button & 1) b = 1;\n else if (e.button & 2) b = 3;\n else if (e.button & 4) b = 2;\n }\n if (mac && e.ctrlKey && b == 1) b = 3;\n return b;\n }\n\n // EVENT HANDLING\n\n // Lightweight event framework. on/off also work on DOM nodes,\n // registering native DOM handlers.\n\n var on = CodeMirror.on = function(emitter, type, f) {\n if (emitter.addEventListener)\n emitter.addEventListener(type, f, false);\n else if (emitter.attachEvent)\n emitter.attachEvent(\"on\" + type, f);\n else {\n var map = emitter._handlers || (emitter._handlers = {});\n var arr = map[type] || (map[type] = []);\n arr.push(f);\n }\n };\n\n var off = CodeMirror.off = function(emitter, type, f) {\n if (emitter.removeEventListener)\n emitter.removeEventListener(type, f, false);\n else if (emitter.detachEvent)\n emitter.detachEvent(\"on\" + type, f);\n else {\n var arr = emitter._handlers && emitter._handlers[type];\n if (!arr) return;\n for (var i = 0; i < arr.length; ++i)\n if (arr[i] == f) { arr.splice(i, 1); break; }\n }\n };\n\n var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {\n var arr = emitter._handlers && emitter._handlers[type];\n if (!arr) return;\n var args = Array.prototype.slice.call(arguments, 2);\n for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);\n };\n\n // Often, we want to signal events at a point where we are in the\n // middle of some work, but don't want the handler to start calling\n // other methods on the editor, which might be in an inconsistent\n // state or simply not expect any other events to happen.\n // signalLater looks whether there are any handlers, and schedules\n // them to be executed when the last operation ends, or, if no\n // operation is active, when a timeout fires.\n var delayedCallbacks, delayedCallbackDepth = 0;\n function signalLater(emitter, type /*, values...*/) {\n var arr = emitter._handlers && emitter._handlers[type];\n if (!arr) return;\n var args = Array.prototype.slice.call(arguments, 2);\n if (!delayedCallbacks) {\n ++delayedCallbackDepth;\n delayedCallbacks = [];\n setTimeout(fireDelayed, 0);\n }\n function bnd(f) {return function(){f.apply(null, args);};};\n for (var i = 0; i < arr.length; ++i)\n delayedCallbacks.push(bnd(arr[i]));\n }\n\n function fireDelayed() {\n --delayedCallbackDepth;\n var delayed = delayedCallbacks;\n delayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) delayed[i]();\n }\n\n // The DOM events that CodeMirror handles can be overridden by\n // registering a (non-DOM) handler on the editor for the event name,\n // and preventDefault-ing the event in that handler.\n function signalDOMEvent(cm, e, override) {\n signal(cm, override || e.type, cm, e);\n return e_defaultPrevented(e) || e.codemirrorIgnore;\n }\n\n function signalCursorActivity(cm) {\n var arr = cm._handlers && cm._handlers.cursorActivity;\n if (!arr) return;\n var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)\n set.push(arr[i]);\n }\n\n function hasHandler(emitter, type) {\n var arr = emitter._handlers && emitter._handlers[type];\n return arr && arr.length > 0;\n }\n\n // Add on and off methods to a constructor's prototype, to make\n // registering events on such objects more convenient.\n function eventMixin(ctor) {\n ctor.prototype.on = function(type, f) {on(this, type, f);};\n ctor.prototype.off = function(type, f) {off(this, type, f);};\n }\n\n // MISC UTILITIES\n\n // Number of pixels added to scroller and sizer to hide scrollbar\n var scrollerCutOff = 30;\n\n // Returned or thrown by various protocols to signal 'I'm not\n // handling this'.\n var Pass = CodeMirror.Pass = {toString: function(){return \"CodeMirror.Pass\";}};\n\n // Reused option objects for setSelection & friends\n var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n function Delayed() {this.id = null;}\n Delayed.prototype.set = function(ms, f) {\n clearTimeout(this.id);\n this.id = setTimeout(f, ms);\n };\n\n // Counts the column offset in a string, taking tabs into account.\n // Used mostly to find indentation.\n var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {\n if (end == null) {\n end = string.search(/[^\\s\\u00a0]/);\n if (end == -1) end = string.length;\n }\n for (var i = startIndex || 0, n = startValue || 0;;) {\n var nextTab = string.indexOf(\"\\t\", i);\n if (nextTab < 0 || nextTab >= end)\n return n + (end - i);\n n += nextTab - i;\n n += tabSize - (n % tabSize);\n i = nextTab + 1;\n }\n };\n\n // The inverse of countColumn -- find the offset that corresponds to\n // a particular column.\n function findColumn(string, goal, tabSize) {\n for (var pos = 0, col = 0;;) {\n var nextTab = string.indexOf(\"\\t\", pos);\n if (nextTab == -1) nextTab = string.length;\n var skipped = nextTab - pos;\n if (nextTab == string.length || col + skipped >= goal)\n return pos + Math.min(skipped, goal - col);\n col += nextTab - pos;\n col += tabSize - (col % tabSize);\n pos = nextTab + 1;\n if (col >= goal) return pos;\n }\n }\n\n var spaceStrs = [\"\"];\n function spaceStr(n) {\n while (spaceStrs.length <= n)\n spaceStrs.push(lst(spaceStrs) + \" \");\n return spaceStrs[n];\n }\n\n function lst(arr) { return arr[arr.length-1]; }\n\n var selectInput = function(node) { node.select(); };\n if (ios) // Mobile Safari apparently has a bug where select() is broken.\n selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };\n else if (ie) // Suppress mysterious IE10 errors\n selectInput = function(node) { try { node.select(); } catch(_e) {} };\n\n function indexOf(array, elt) {\n for (var i = 0; i < array.length; ++i)\n if (array[i] == elt) return i;\n return -1;\n }\n if ([].indexOf) indexOf = function(array, elt) { return array.indexOf(elt); };\n function map(array, f) {\n var out = [];\n for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);\n return out;\n }\n if ([].map) map = function(array, f) { return array.map(f); };\n\n function createObj(base, props) {\n var inst;\n if (Object.create) {\n inst = Object.create(base);\n } else {\n var ctor = function() {};\n ctor.prototype = base;\n inst = new ctor();\n }\n if (props) copyObj(props, inst);\n return inst;\n };\n\n function copyObj(obj, target, overwrite) {\n if (!target) target = {};\n for (var prop in obj)\n if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n target[prop] = obj[prop];\n return target;\n }\n\n function bind(f) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function(){return f.apply(null, args);};\n }\n\n var nonASCIISingleCaseWordChar = /[\\u00df\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n var isWordCharBasic = CodeMirror.isWordChar = function(ch) {\n return /\\w/.test(ch) || ch > \"\\x80\" &&\n (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));\n };\n function isWordChar(ch, helper) {\n if (!helper) return isWordCharBasic(ch);\n if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) return true;\n return helper.test(ch);\n }\n\n function isEmpty(obj) {\n for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;\n return true;\n }\n\n // Extending unicode characters. A series of a non-extending char +\n // any number of extending chars is treated as a single unit as far\n // as editing and measuring is concerned. This is not fully correct,\n // since some scripts/fonts/browsers also treat other configurations\n // of code points as a group.\n var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }\n\n // DOM UTILITIES\n\n function elt(tag, content, className, style) {\n var e = document.createElement(tag);\n if (className) e.className = className;\n if (style) e.style.cssText = style;\n if (typeof content == \"string\") e.appendChild(document.createTextNode(content));\n else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);\n return e;\n }\n\n var range;\n if (document.createRange) range = function(node, start, end) {\n var r = document.createRange();\n r.setEnd(node, end);\n r.setStart(node, start);\n return r;\n };\n else range = function(node, start, end) {\n var r = document.body.createTextRange();\n r.moveToElementText(node.parentNode);\n r.collapse(true);\n r.moveEnd(\"character\", end);\n r.moveStart(\"character\", start);\n return r;\n };\n\n function removeChildren(e) {\n for (var count = e.childNodes.length; count > 0; --count)\n e.removeChild(e.firstChild);\n return e;\n }\n\n function removeChildrenAndAdd(parent, e) {\n return removeChildren(parent).appendChild(e);\n }\n\n function contains(parent, child) {\n if (parent.contains)\n return parent.contains(child);\n while (child = child.parentNode)\n if (child == parent) return true;\n }\n\n function activeElt() { return document.activeElement; }\n // Older versions of IE throws unspecified error when touching\n // document.activeElement in some cases (during loading, in iframe)\n if (ie_upto10) activeElt = function() {\n try { return document.activeElement; }\n catch(e) { return document.body; }\n };\n\n function classTest(cls) { return new RegExp(\"\\\\b\" + cls + \"\\\\b\\\\s*\"); }\n function rmClass(node, cls) {\n var test = classTest(cls);\n if (test.test(node.className)) node.className = node.className.replace(test, \"\");\n }\n function addClass(node, cls) {\n if (!classTest(cls).test(node.className)) node.className += \" \" + cls;\n }\n function joinClasses(a, b) {\n var as = a.split(\" \");\n for (var i = 0; i < as.length; i++)\n if (as[i] && !classTest(as[i]).test(b)) b += \" \" + as[i];\n return b;\n }\n\n // WINDOW-WIDE EVENTS\n\n // These must be handled carefully, because naively registering a\n // handler for each editor will cause the editors to never be\n // garbage collected.\n\n function forEachCodeMirror(f) {\n if (!document.body.getElementsByClassName) return;\n var byClass = document.body.getElementsByClassName(\"CodeMirror\");\n for (var i = 0; i < byClass.length; i++) {\n var cm = byClass[i].CodeMirror;\n if (cm) f(cm);\n }\n }\n\n var globalsRegistered = false;\n function ensureGlobalHandlers() {\n if (globalsRegistered) return;\n registerGlobalHandlers();\n globalsRegistered = true;\n }\n function registerGlobalHandlers() {\n // When the window resizes, we need to refresh active editors.\n var resizeTimer;\n on(window, \"resize\", function() {\n if (resizeTimer == null) resizeTimer = setTimeout(function() {\n resizeTimer = null;\n knownScrollbarWidth = null;\n forEachCodeMirror(onResize);\n }, 100);\n });\n // When the window loses focus, we want to show the editor as blurred\n on(window, \"blur\", function() {\n forEachCodeMirror(onBlur);\n });\n }\n\n // FEATURE DETECTION\n\n // Detect drag-and-drop\n var dragAndDrop = function() {\n // There is *some* kind of drag-and-drop support in IE6-8, but I\n // couldn't get it to work yet.\n if (ie_upto8) return false;\n var div = elt('div');\n return \"draggable\" in div || \"dragDrop\" in div;\n }();\n\n var knownScrollbarWidth;\n function scrollbarWidth(measure) {\n if (knownScrollbarWidth != null) return knownScrollbarWidth;\n var test = elt(\"div\", null, null, \"width: 50px; height: 50px; overflow-x: scroll\");\n removeChildrenAndAdd(measure, test);\n if (test.offsetWidth)\n knownScrollbarWidth = test.offsetHeight - test.clientHeight;\n return knownScrollbarWidth || 0;\n }\n\n var zwspSupported;\n function zeroWidthElement(measure) {\n if (zwspSupported == null) {\n var test = elt(\"span\", \"\\u200b\");\n removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n if (measure.firstChild.offsetHeight != 0)\n zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_upto7;\n }\n if (zwspSupported) return elt(\"span\", \"\\u200b\");\n else return elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n }\n\n // Feature-detect IE's crummy client rect reporting for bidi text\n var badBidiRects;\n function hasBadBidiRects(measure) {\n if (badBidiRects != null) return badBidiRects;\n var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n var r0 = range(txt, 0, 1).getBoundingClientRect();\n if (r0.left == r0.right) return false;\n var r1 = range(txt, 1, 2).getBoundingClientRect();\n return badBidiRects = (r1.right - r0.right < 3);\n }\n\n // See if \"\".split is the broken IE version, if so, provide an\n // alternative way to split lines.\n var splitLines = CodeMirror.splitLines = \"\\n\\nb\".split(/\\n/).length != 3 ? function(string) {\n var pos = 0, result = [], l = string.length;\n while (pos <= l) {\n var nl = string.indexOf(\"\\n\", pos);\n if (nl == -1) nl = string.length;\n var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n var rt = line.indexOf(\"\\r\");\n if (rt != -1) {\n result.push(line.slice(0, rt));\n pos += rt + 1;\n } else {\n result.push(line);\n pos = nl + 1;\n }\n }\n return result;\n } : function(string){return string.split(/\\r\\n?|\\n/);};\n\n var hasSelection = window.getSelection ? function(te) {\n try { return te.selectionStart != te.selectionEnd; }\n catch(e) { return false; }\n } : function(te) {\n try {var range = te.ownerDocument.selection.createRange();}\n catch(e) {}\n if (!range || range.parentElement() != te) return false;\n return range.compareEndPoints(\"StartToEnd\", range) != 0;\n };\n\n var hasCopyEvent = (function() {\n var e = elt(\"div\");\n if (\"oncopy\" in e) return true;\n e.setAttribute(\"oncopy\", \"return;\");\n return typeof e.oncopy == \"function\";\n })();\n\n // KEY NAMES\n\n var keyNames = {3: \"Enter\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n 19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n 36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n 46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\", 107: \"=\", 109: \"-\", 127: \"Delete\",\n 173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n 221: \"]\", 222: \"'\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n 63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"};\n CodeMirror.keyNames = keyNames;\n (function() {\n // Number keys\n for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);\n // Alphabetic keys\n for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);\n // Function keys\n for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i;\n })();\n\n // BIDI HELPERS\n\n function iterateBidiSections(order, from, to, f) {\n if (!order) return f(from, to, \"ltr\");\n var found = false;\n for (var i = 0; i < order.length; ++i) {\n var part = order[i];\n if (part.from < to && part.to > from || from == to && part.to == from) {\n f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\");\n found = true;\n }\n }\n if (!found) f(from, to, \"ltr\");\n }\n\n function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }\n function bidiRight(part) { return part.level % 2 ? part.from : part.to; }\n\n function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }\n function lineRight(line) {\n var order = getOrder(line);\n if (!order) return line.text.length;\n return bidiRight(lst(order));\n }\n\n function lineStart(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLine(line);\n if (visual != line) lineN = lineNo(visual);\n var order = getOrder(visual);\n var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);\n return Pos(lineN, ch);\n }\n function lineEnd(cm, lineN) {\n var merged, line = getLine(cm.doc, lineN);\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line;\n lineN = null;\n }\n var order = getOrder(line);\n var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);\n return Pos(lineN == null ? lineNo(line) : lineN, ch);\n }\n\n function compareBidiLevel(order, a, b) {\n var linedir = order[0].level;\n if (a == linedir) return true;\n if (b == linedir) return false;\n return a < b;\n }\n var bidiOther;\n function getBidiPartAt(order, pos) {\n bidiOther = null;\n for (var i = 0, found; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < pos && cur.to > pos) return i;\n if ((cur.from == pos || cur.to == pos)) {\n if (found == null) {\n found = i;\n } else if (compareBidiLevel(order, cur.level, order[found].level)) {\n if (cur.from != cur.to) bidiOther = found;\n return i;\n } else {\n if (cur.from != cur.to) bidiOther = i;\n return found;\n }\n }\n }\n return found;\n }\n\n function moveInLine(line, pos, dir, byUnit) {\n if (!byUnit) return pos + dir;\n do pos += dir;\n while (pos > 0 && isExtendingChar(line.text.charAt(pos)));\n return pos;\n }\n\n // This is needed in order to move 'visually' through bi-directional\n // text -- i.e., pressing left should make the cursor go left, even\n // when in RTL text. The tricky part is the 'jumps', where RTL and\n // LTR text touch each other. This often requires the cursor offset\n // to move more than one unit, in order to visually move one unit.\n function moveVisually(line, start, dir, byUnit) {\n var bidi = getOrder(line);\n if (!bidi) return moveLogically(line, start, dir, byUnit);\n var pos = getBidiPartAt(bidi, start), part = bidi[pos];\n var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);\n\n for (;;) {\n if (target > part.from && target < part.to) return target;\n if (target == part.from || target == part.to) {\n if (getBidiPartAt(bidi, target) == pos) return target;\n part = bidi[pos += dir];\n return (dir > 0) == part.level % 2 ? part.to : part.from;\n } else {\n part = bidi[pos += dir];\n if (!part) return null;\n if ((dir > 0) == part.level % 2)\n target = moveInLine(line, part.to, -1, byUnit);\n else\n target = moveInLine(line, part.from, 1, byUnit);\n }\n }\n }\n\n function moveLogically(line, start, dir, byUnit) {\n var target = start + dir;\n if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;\n return target < 0 || target > line.text.length ? null : target;\n }\n\n // Bidirectional ordering algorithm\n // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n // that this (partially) implements.\n\n // One-char codes used for character types:\n // L (L): Left-to-Right\n // R (R): Right-to-Left\n // r (AL): Right-to-Left Arabic\n // 1 (EN): European Number\n // + (ES): European Number Separator\n // % (ET): European Number Terminator\n // n (AN): Arabic Number\n // , (CS): Common Number Separator\n // m (NSM): Non-Spacing Mark\n // b (BN): Boundary Neutral\n // s (B): Paragraph Separator\n // t (S): Segment Separator\n // w (WS): Whitespace\n // N (ON): Other Neutrals\n\n // Returns null if characters are ordered as they appear\n // (left-to-right), or an array of sections ({from, to, level}\n // objects) in the order in which they occur visually.\n var bidiOrdering = (function() {\n // Character types for codepoints 0 to 0xff\n var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n // Character types for codepoints 0x600 to 0x6ff\n var arabicTypes = \"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\";\n function charType(code) {\n if (code <= 0xf7) return lowTypes.charAt(code);\n else if (0x590 <= code && code <= 0x5f4) return \"R\";\n else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);\n else if (0x6ee <= code && code <= 0x8ac) return \"r\";\n else if (0x2000 <= code && code <= 0x200b) return \"w\";\n else if (code == 0x200c) return \"b\";\n else return \"L\";\n }\n\n var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n // Browsers seem to always treat the boundaries of block elements as being L.\n var outerType = \"L\";\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str) {\n if (!bidiRE.test(str)) return false;\n var len = str.length, types = [];\n for (var i = 0, type; i < len; ++i)\n types.push(type = charType(str.charCodeAt(i)));\n\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n for (var i = 0, prev = outerType; i < len; ++i) {\n var type = types[i];\n if (type == \"m\") types[i] = prev;\n else prev = type;\n }\n\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n for (var i = 0, cur = outerType; i < len; ++i) {\n var type = types[i];\n if (type == \"1\" && cur == \"r\") types[i] = \"n\";\n else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"R\"; }\n }\n\n // W4. A single European separator between two European numbers\n // changes to a European number. A single common separator between\n // two numbers of the same type changes to that type.\n for (var i = 1, prev = types[0]; i < len - 1; ++i) {\n var type = types[i];\n if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\";\n else if (type == \",\" && prev == types[i+1] &&\n (prev == \"1\" || prev == \"n\")) types[i] = prev;\n prev = type;\n }\n\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n for (var i = 0; i < len; ++i) {\n var type = types[i];\n if (type == \",\") types[i] = \"N\";\n else if (type == \"%\") {\n for (var end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i; j < end; ++j) types[j] = replace;\n i = end - 1;\n }\n }\n\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n for (var i = 0, cur = outerType; i < len; ++i) {\n var type = types[i];\n if (cur == \"L\" && type == \"1\") types[i] = \"L\";\n else if (isStrong.test(type)) cur = type;\n }\n\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n for (var i = 0; i < len; ++i) {\n if (isNeutral.test(types[i])) {\n for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n var before = (i ? types[i-1] : outerType) == \"L\";\n var after = (end < len ? types[end] : outerType) == \"L\";\n var replace = before || after ? \"L\" : \"R\";\n for (var j = i; j < end; ++j) types[j] = replace;\n i = end - 1;\n }\n }\n\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n var order = [], m;\n for (var i = 0; i < len;) {\n if (countsAsLeft.test(types[i])) {\n var start = i;\n for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n order.push(new BidiSpan(0, start, i));\n } else {\n var pos = i, at = order.length;\n for (++i; i < len && types[i] != \"L\"; ++i) {}\n for (var j = pos; j < i;) {\n if (countsAsNum.test(types[j])) {\n if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));\n var nstart = j;\n for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j));\n pos = j;\n } else ++j;\n }\n if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));\n }\n }\n if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n order[0].from = m[0].length;\n order.unshift(new BidiSpan(0, 0, m[0].length));\n }\n if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n lst(order).to -= m[0].length;\n order.push(new BidiSpan(0, len - m[0].length, len));\n }\n if (order[0].level != lst(order).level)\n order.push(new BidiSpan(order[0].level, len, len));\n\n return order;\n };\n })();\n\n // THE END\n\n CodeMirror.version = \"4.1.1\";\n\n return CodeMirror;\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.css": {
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* BASICS */\n\n.CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-family: monospace;\n height: 300px;\n}\n.CodeMirror-scroll {\n /* Set scrolling behaviour here */\n overflow: auto;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\n\n/* CURSOR */\n\n.CodeMirror div.CodeMirror-cursor {\n border-left: 1px solid black;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n}\n.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {\n width: auto;\n border: 0;\n background: #7e7;\n}\n/* Can style cursor different in overwrite (non-insert) mode */\ndiv.CodeMirror-overwrite div.CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; }\n\n.CodeMirror-ruler {\n border-left: 1px solid #ccc;\n position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3 {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n line-height: 1;\n position: relative;\n overflow: hidden;\n background: white;\n color: black;\n}\n\n.CodeMirror-scroll {\n /* 30px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -30px; margin-right: -30px;\n padding-bottom: 30px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\n.CodeMirror-sizer {\n position: relative;\n border-right: 30px solid transparent;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n before actuall scrolling happens, thus preventing shaking and\n flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 6;\n display: none;\n}\n.CodeMirror-vscrollbar {\n right: 0; top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n bottom: 0; left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n position: absolute; left: 0; top: 0;\n padding-bottom: 30px;\n z-index: 3;\n}\n.CodeMirror-gutter {\n white-space: normal;\n height: 100%;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n padding-bottom: 30px;\n margin-bottom: -32px;\n display: inline-block;\n /* Hack to make IE7 behave */\n *zoom:1;\n *display:inline;\n}\n.CodeMirror-gutter-elt {\n position: absolute;\n cursor: default;\n z-index: 4;\n}\n\n.CodeMirror-lines {\n cursor: text;\n}\n.CodeMirror pre {\n /* Reset some styles that the rest of the page might have set */\n -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: inherit;\n color: inherit;\n z-index: 2;\n position: relative;\n overflow: visible;\n}\n.CodeMirror-wrap pre {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: normal;\n}\n\n.CodeMirror-linebackground {\n position: absolute;\n left: 0; right: 0; top: 0; bottom: 0;\n z-index: 0;\n}\n\n.CodeMirror-linewidget {\n position: relative;\n z-index: 2;\n overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-wrap .CodeMirror-scroll {\n overflow-x: hidden;\n}\n\n.CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n}\n.CodeMirror-measure pre { position: static; }\n\n.CodeMirror div.CodeMirror-cursor {\n position: absolute;\n border-right: none;\n width: 0;\n}\n\ndiv.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n z-index: 1;\n}\n.CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n\n.cm-searching {\n background: #ffa;\n background: rgba(255, 255, 0, .4);\n}\n\n/* IE7 hack to prevent it from returning funny offsetTops on the spans */\n.CodeMirror span { *vertical-align: text-bottom; }\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n /* Hide the cursor when printing */\n .CodeMirror div.CodeMirror-cursors {\n visibility: hidden;\n }\n}\n"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css": {
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": ".CodeMirror-dialog {\n position: absolute;\n left: 0; right: 0;\n background: white;\n z-index: 15;\n padding: .1em .8em;\n overflow: hidden;\n color: #333;\n}\n\n.CodeMirror-dialog-top {\n border-bottom: 1px solid #eee;\n top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n border-top: 1px solid #eee;\n bottom: 0;\n}\n\n.CodeMirror-dialog input {\n border: none;\n outline: none;\n background: transparent;\n width: 20em;\n color: inherit;\n font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n font-size: 70%;\n}\n"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
"module-type": "library",
"text": "// Open simple dialogs on top of an editor. Relies on dialog.css.\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n function dialogDiv(cm, template, bottom) {\n var wrap = cm.getWrapperElement();\n var dialog;\n dialog = wrap.appendChild(document.createElement(\"div\"));\n if (bottom) {\n dialog.className = \"CodeMirror-dialog CodeMirror-dialog-bottom\";\n } else {\n dialog.className = \"CodeMirror-dialog CodeMirror-dialog-top\";\n }\n if (typeof template == \"string\") {\n dialog.innerHTML = template;\n } else { // Assuming it's a detached DOM element.\n dialog.appendChild(template);\n }\n return dialog;\n }\n\n function closeNotification(cm, newVal) {\n if (cm.state.currentNotificationClose)\n cm.state.currentNotificationClose();\n cm.state.currentNotificationClose = newVal;\n }\n\n CodeMirror.defineExtension(\"openDialog\", function(template, callback, options) {\n closeNotification(this, null);\n var dialog = dialogDiv(this, template, options && options.bottom);\n var closed = false, me = this;\n function close() {\n if (closed) return;\n closed = true;\n dialog.parentNode.removeChild(dialog);\n }\n var inp = dialog.getElementsByTagName(\"input\")[0], button;\n if (inp) {\n if (options && options.value) inp.value = options.value;\n CodeMirror.on(inp, \"keydown\", function(e) {\n if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }\n if (e.keyCode == 13 || e.keyCode == 27) {\n inp.blur();\n CodeMirror.e_stop(e);\n close();\n me.focus();\n if (e.keyCode == 13) callback(inp.value);\n }\n });\n if (options && options.onKeyUp) {\n CodeMirror.on(inp, \"keyup\", function(e) {options.onKeyUp(e, inp.value, close);});\n }\n if (options && options.value) inp.value = options.value;\n inp.focus();\n CodeMirror.on(inp, \"blur\", close);\n } else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n CodeMirror.on(button, \"click\", function() {\n close();\n me.focus();\n });\n button.focus();\n CodeMirror.on(button, \"blur\", close);\n }\n return close;\n });\n\n CodeMirror.defineExtension(\"openConfirm\", function(template, callbacks, options) {\n closeNotification(this, null);\n var dialog = dialogDiv(this, template, options && options.bottom);\n var buttons = dialog.getElementsByTagName(\"button\");\n var closed = false, me = this, blurring = 1;\n function close() {\n if (closed) return;\n closed = true;\n dialog.parentNode.removeChild(dialog);\n me.focus();\n }\n buttons[0].focus();\n for (var i = 0; i < buttons.length; ++i) {\n var b = buttons[i];\n (function(callback) {\n CodeMirror.on(b, \"click\", function(e) {\n CodeMirror.e_preventDefault(e);\n close();\n if (callback) callback(me);\n });\n })(callbacks[i]);\n CodeMirror.on(b, \"blur\", function() {\n --blurring;\n setTimeout(function() { if (blurring <= 0) close(); }, 200);\n });\n CodeMirror.on(b, \"focus\", function() { ++blurring; });\n }\n });\n\n /*\n * openNotification\n * Opens a notification, that can be closed with an optional timer\n * (default 5000ms timer) and always closes on click.\n *\n * If a notification is opened while another is opened, it will close the\n * currently opened one and open the new one immediately.\n */\n CodeMirror.defineExtension(\"openNotification\", function(template, options) {\n closeNotification(this, close);\n var dialog = dialogDiv(this, template, options && options.bottom);\n var duration = options && (options.duration === undefined ? 5000 : options.duration);\n var closed = false, doneTimer;\n\n function close() {\n if (closed) return;\n closed = true;\n clearTimeout(doneTimer);\n dialog.parentNode.removeChild(dialog);\n }\n\n CodeMirror.on(dialog, 'click', function(e) {\n CodeMirror.e_preventDefault(e);\n close();\n });\n if (duration)\n doneTimer = setTimeout(close, options.duration);\n });\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js",
"module-type": "library",
"text": "(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n (document.documentMode == null || document.documentMode < 8);\n\n var Pos = CodeMirror.Pos;\n\n var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\"};\n\n function findMatchingBracket(cm, where, strict, config) {\n var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];\n if (!match) return null;\n var dir = match.charAt(1) == \">\" ? 1 : -1;\n if (strict && (dir > 0) != (pos == where.ch)) return null;\n var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);\n if (found == null) return null;\n return {from: Pos(where.line, pos), to: found && found.pos,\n match: found && found.ch == match.charAt(0), forward: dir > 0};\n }\n\n // bracketRegex is used to specify which type of bracket to scan\n // should be a regexp, e.g. /[[\\]]/\n //\n // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n //\n // Returns false when no bracket was found, null when it reached\n // maxScanLines and gave up\n function scanForBracket(cm, where, dir, style, config) {\n var maxScanLen = (config && config.maxScanLineLength) || 10000;\n var maxScanLines = (config && config.maxScanLines) || 1000;\n\n var stack = [];\n var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\\]]/;\n var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n var line = cm.getLine(lineNo);\n if (!line) continue;\n var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n if (line.length > maxScanLen) continue;\n if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n for (; pos != end; pos += dir) {\n var ch = line.charAt(pos);\n if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {\n var match = matching[ch];\n if ((match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n else stack.pop();\n }\n }\n }\n return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n }\n\n function matchBrackets(cm, autoclear, config) {\n // Disable brace matching in long lines, since it'll cause hugely slow updates\n var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;\n var marks = [], ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);\n if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {\n var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n }\n }\n\n if (marks.length) {\n // Kludge to work around the IE bug from issue #1193, where text\n // input stops going to the textare whever this fires.\n if (ie_lt8 && cm.state.focused) cm.display.input.focus();\n\n var clear = function() {\n cm.operation(function() {\n for (var i = 0; i < marks.length; i++) marks[i].clear();\n });\n };\n if (autoclear) setTimeout(clear, 800);\n else return clear;\n }\n }\n\n var currentlyHighlighted = null;\n function doMatchBrackets(cm) {\n cm.operation(function() {\n if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n });\n }\n\n CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n if (old && old != CodeMirror.Init)\n cm.off(\"cursorActivity\", doMatchBrackets);\n if (val) {\n cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n cm.on(\"cursorActivity\", doMatchBrackets);\n }\n });\n\n CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, strict, config){\n return findMatchingBracket(this, pos, strict, config);\n });\n CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n return scanForBracket(this, pos, dir, style, config);\n });\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js",
"module-type": "library",
"text": "(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n var Pos = CodeMirror.Pos;\n\n function SearchCursor(doc, query, pos, caseFold) {\n this.atOccurrence = false; this.doc = doc;\n if (caseFold == null && typeof query == \"string\") caseFold = false;\n\n pos = pos ? doc.clipPos(pos) : Pos(0, 0);\n this.pos = {from: pos, to: pos};\n\n // The matches method is filled in based on the type of query.\n // It takes a position and a direction, and returns an object\n // describing the next occurrence of the query, or null if no\n // more matches were found.\n if (typeof query != \"string\") { // Regexp match\n if (!query.global) query = new RegExp(query.source, query.ignoreCase ? \"ig\" : \"g\");\n this.matches = function(reverse, pos) {\n if (reverse) {\n query.lastIndex = 0;\n var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start;\n for (;;) {\n query.lastIndex = cutOff;\n var newMatch = query.exec(line);\n if (!newMatch) break;\n match = newMatch;\n start = match.index;\n cutOff = match.index + (match[0].length || 1);\n if (cutOff == line.length) break;\n }\n var matchLen = (match && match[0].length) || 0;\n if (!matchLen) {\n if (start == 0 && line.length == 0) {match = undefined;}\n else if (start != doc.getLine(pos.line).length) {\n matchLen++;\n }\n }\n } else {\n query.lastIndex = pos.ch;\n var line = doc.getLine(pos.line), match = query.exec(line);\n var matchLen = (match && match[0].length) || 0;\n var start = match && match.index;\n if (start + matchLen != line.length && !matchLen) matchLen = 1;\n }\n if (match && matchLen)\n return {from: Pos(pos.line, start),\n to: Pos(pos.line, start + matchLen),\n match: match};\n };\n } else { // String query\n var origQuery = query;\n if (caseFold) query = query.toLowerCase();\n var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};\n var target = query.split(\"\\n\");\n // Different methods for single-line and multi-line queries\n if (target.length == 1) {\n if (!query.length) {\n // Empty string would match anything and never progress, so\n // we define it to match nothing instead.\n this.matches = function() {};\n } else {\n this.matches = function(reverse, pos) {\n if (reverse) {\n var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig);\n var match = line.lastIndexOf(query);\n if (match > -1) {\n match = adjustPos(orig, line, match);\n return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};\n }\n } else {\n var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig);\n var match = line.indexOf(query);\n if (match > -1) {\n match = adjustPos(orig, line, match) + pos.ch;\n return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};\n }\n }\n };\n }\n } else {\n var origTarget = origQuery.split(\"\\n\");\n this.matches = function(reverse, pos) {\n var last = target.length - 1;\n if (reverse) {\n if (pos.line - (target.length - 1) < doc.firstLine()) return;\n if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return;\n var to = Pos(pos.line, origTarget[last].length);\n for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln)\n if (target[i] != fold(doc.getLine(ln))) return;\n var line = doc.getLine(ln), cut = line.length - origTarget[0].length;\n if (fold(line.slice(cut)) != target[0]) return;\n return {from: Pos(ln, cut), to: to};\n } else {\n if (pos.line + (target.length - 1) > doc.lastLine()) return;\n var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length;\n if (fold(line.slice(cut)) != target[0]) return;\n var from = Pos(pos.line, cut);\n for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln)\n if (target[i] != fold(doc.getLine(ln))) return;\n if (doc.getLine(ln).slice(0, origTarget[last].length) != target[last]) return;\n return {from: from, to: Pos(ln, origTarget[last].length)};\n }\n };\n }\n }\n }\n\n SearchCursor.prototype = {\n findNext: function() {return this.find(false);},\n findPrevious: function() {return this.find(true);},\n\n find: function(reverse) {\n var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);\n function savePosAndFail(line) {\n var pos = Pos(line, 0);\n self.pos = {from: pos, to: pos};\n self.atOccurrence = false;\n return false;\n }\n\n for (;;) {\n if (this.pos = this.matches(reverse, pos)) {\n this.atOccurrence = true;\n return this.pos.match || true;\n }\n if (reverse) {\n if (!pos.line) return savePosAndFail(0);\n pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length);\n }\n else {\n var maxLine = this.doc.lineCount();\n if (pos.line == maxLine - 1) return savePosAndFail(maxLine);\n pos = Pos(pos.line + 1, 0);\n }\n }\n },\n\n from: function() {if (this.atOccurrence) return this.pos.from;},\n to: function() {if (this.atOccurrence) return this.pos.to;},\n\n replace: function(newText) {\n if (!this.atOccurrence) return;\n var lines = CodeMirror.splitLines(newText);\n this.doc.replaceRange(lines, this.pos.from, this.pos.to);\n this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));\n }\n };\n\n // Maps a position in a case-folded line back to a position in the original line\n // (compensating for codepoints increasing in number during folding)\n function adjustPos(orig, folded, pos) {\n if (orig.length == folded.length) return pos;\n for (var pos1 = Math.min(pos, orig.length);;) {\n var len1 = orig.slice(0, pos1).toLowerCase().length;\n if (len1 < pos) ++pos1;\n else if (len1 > pos) --pos1;\n else return pos1;\n }\n }\n\n CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n return new SearchCursor(this.doc, query, pos, caseFold);\n });\n CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n return new SearchCursor(this, query, pos, caseFold);\n });\n\n CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n var ranges = [], next;\n var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold);\n while (next = cur.findNext()) {\n if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break;\n ranges.push({anchor: cur.from(), head: cur.to()});\n }\n if (ranges.length)\n this.setSelections(ranges, 0);\n });\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js",
"module-type": "library",
"text": "// TODO actually recognize syntax of TypeScript constructs\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var statementIndent = parserConfig.statementIndent;\n var jsonldMode = parserConfig.jsonld;\n var jsonMode = parserConfig.json || jsonldMode;\n var isTS = parserConfig.typescript;\n\n // Tokenizer\n\n var keywords = function(){\n function kw(type) {return {type: type, style: \"keyword\"};}\n var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n var jsKeywords = {\n \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n \"return\": C, \"break\": C, \"continue\": C, \"new\": C, \"delete\": C, \"throw\": C, \"debugger\": C,\n \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n \"this\": kw(\"this\"), \"module\": kw(\"module\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C\n };\n\n // Extend the 'normal' keywords with the TypeScript language extensions\n if (isTS) {\n var type = {type: \"variable\", style: \"variable-3\"};\n var tsKeywords = {\n // object-like things\n \"interface\": kw(\"interface\"),\n \"extends\": kw(\"extends\"),\n \"constructor\": kw(\"constructor\"),\n\n // scope modifiers\n \"public\": kw(\"public\"),\n \"private\": kw(\"private\"),\n \"protected\": kw(\"protected\"),\n \"static\": kw(\"static\"),\n\n // types\n \"string\": type, \"number\": type, \"bool\": type, \"any\": type\n };\n\n for (var attr in tsKeywords) {\n jsKeywords[attr] = tsKeywords[attr];\n }\n }\n\n return jsKeywords;\n }();\n\n var isOperatorChar = /[+\\-*&%=<>!?|~^]/;\n var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n function readRegexp(stream) {\n var escaped = false, next, inSet = false;\n while ((next = stream.next()) != null) {\n if (!escaped) {\n if (next == \"/\" && !inSet) return;\n if (next == \"[\") inSet = true;\n else if (inSet && next == \"]\") inSet = false;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n }\n\n // Used as scratch variables to communicate multiple values without\n // consing up tons of objects.\n var type, content;\n function ret(tp, style, cont) {\n type = tp; content = cont;\n return style;\n }\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n return ret(\"number\", \"number\");\n } else if (ch == \".\" && stream.match(\"..\")) {\n return ret(\"spread\", \"meta\");\n } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n return ret(ch);\n } else if (ch == \"=\" && stream.eat(\">\")) {\n return ret(\"=>\", \"operator\");\n } else if (ch == \"0\" && stream.eat(/x/i)) {\n stream.eatWhile(/[\\da-f]/i);\n return ret(\"number\", \"number\");\n } else if (/\\d/.test(ch)) {\n stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n return ret(\"number\", \"number\");\n } else if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n } else if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return ret(\"comment\", \"comment\");\n } else if (state.lastType == \"operator\" || state.lastType == \"keyword c\" ||\n state.lastType == \"sof\" || /^[\\[{}\\(,;:]$/.test(state.lastType)) {\n readRegexp(stream);\n stream.eatWhile(/[gimy]/); // 'y' is \"sticky\" option in Mozilla\n return ret(\"regexp\", \"string-2\");\n } else {\n stream.eatWhile(isOperatorChar);\n return ret(\"operator\", \"operator\", stream.current());\n }\n } else if (ch == \"`\") {\n state.tokenize = tokenQuasi;\n return tokenQuasi(stream, state);\n } else if (ch == \"#\") {\n stream.skipToEnd();\n return ret(\"error\", \"error\");\n } else if (isOperatorChar.test(ch)) {\n stream.eatWhile(isOperatorChar);\n return ret(\"operator\", \"operator\", stream.current());\n } else {\n stream.eatWhile(/[\\w\\$_]/);\n var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n ret(\"variable\", \"variable\", word);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next;\n if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n state.tokenize = tokenBase;\n return ret(\"jsonld-keyword\", \"meta\");\n }\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) break;\n escaped = !escaped && next == \"\\\\\";\n }\n if (!escaped) state.tokenize = tokenBase;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = tokenBase;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return ret(\"comment\", \"comment\");\n }\n\n function tokenQuasi(stream, state) {\n var escaped = false, next;\n while ((next = stream.next()) != null) {\n if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n return ret(\"quasi\", \"string-2\", stream.current());\n }\n\n var brackets = \"([{}])\";\n // This is a crude lookahead trick to try and notice that we're\n // parsing the argument patterns for a fat-arrow function before we\n // actually hit the arrow token. It only works if the arrow is on\n // the same line as the arguments and there's no strange noise\n // (comments) in between. Fallback is to only notice when we hit the\n // arrow, and not declare the arguments as locals for the arrow\n // body.\n function findFatArrow(stream, state) {\n if (state.fatArrowAt) state.fatArrowAt = null;\n var arrow = stream.string.indexOf(\"=>\", stream.start);\n if (arrow < 0) return;\n\n var depth = 0, sawSomething = false;\n for (var pos = arrow - 1; pos >= 0; --pos) {\n var ch = stream.string.charAt(pos);\n var bracket = brackets.indexOf(ch);\n if (bracket >= 0 && bracket < 3) {\n if (!depth) { ++pos; break; }\n if (--depth == 0) break;\n } else if (bracket >= 3 && bracket < 6) {\n ++depth;\n } else if (/[$\\w]/.test(ch)) {\n sawSomething = true;\n } else if (sawSomething && !depth) {\n ++pos;\n break;\n }\n }\n if (sawSomething && !depth) state.fatArrowAt = pos;\n }\n\n // Parser\n\n var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n function JSLexical(indented, column, type, align, prev, info) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.prev = prev;\n this.info = info;\n if (align != null) this.align = align;\n }\n\n function inScope(state, varname) {\n for (var v = state.localVars; v; v = v.next)\n if (v.name == varname) return true;\n for (var cx = state.context; cx; cx = cx.prev) {\n for (var v = cx.vars; v; v = v.next)\n if (v.name == varname) return true;\n }\n }\n\n function parseJS(state, style, type, content, stream) {\n var cc = state.cc;\n // Communicate our context to the combinators.\n // (Less wasteful than consing up a hundred closures on every call.)\n cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;\n\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = true;\n\n while(true) {\n var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n if (combinator(type, content)) {\n while(cc.length && cc[cc.length - 1].lex)\n cc.pop()();\n if (cx.marked) return cx.marked;\n if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n return style;\n }\n }\n }\n\n // Combinator utils\n\n var cx = {state: null, column: null, marked: null, cc: null};\n function pass() {\n for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n }\n function cont() {\n pass.apply(null, arguments);\n return true;\n }\n function register(varname) {\n function inList(list) {\n for (var v = list; v; v = v.next)\n if (v.name == varname) return true;\n return false;\n }\n var state = cx.state;\n if (state.context) {\n cx.marked = \"def\";\n if (inList(state.localVars)) return;\n state.localVars = {name: varname, next: state.localVars};\n } else {\n if (inList(state.globalVars)) return;\n if (parserConfig.globalVars)\n state.globalVars = {name: varname, next: state.globalVars};\n }\n }\n\n // Combinators\n\n var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n function pushcontext() {\n cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n cx.state.localVars = defaultVars;\n }\n function popcontext() {\n cx.state.localVars = cx.state.context.vars;\n cx.state.context = cx.state.context.prev;\n }\n function pushlex(type, info) {\n var result = function() {\n var state = cx.state, indent = state.indented;\n if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n };\n result.lex = true;\n return result;\n }\n function poplex() {\n var state = cx.state;\n if (state.lexical.prev) {\n if (state.lexical.type == \")\")\n state.indented = state.lexical.indented;\n state.lexical = state.lexical.prev;\n }\n }\n poplex.lex = true;\n\n function expect(wanted) {\n function exp(type) {\n if (type == wanted) return cont();\n else if (wanted == \";\") return pass();\n else return cont(exp);\n };\n return exp;\n }\n\n function statement(type, value) {\n if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, expect(\";\"), poplex);\n if (type == \"keyword a\") return cont(pushlex(\"form\"), expression, statement, poplex);\n if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n if (type == \";\") return cont();\n if (type == \"if\") {\n if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n cx.state.cc.pop()();\n return cont(pushlex(\"form\"), expression, statement, poplex, maybeelse);\n }\n if (type == \"function\") return cont(functiondef);\n if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n if (type == \"switch\") return cont(pushlex(\"form\"), expression, pushlex(\"}\", \"switch\"), expect(\"{\"),\n block, poplex, poplex);\n if (type == \"case\") return cont(expression, expect(\":\"));\n if (type == \"default\") return cont(expect(\":\"));\n if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n statement, poplex, popcontext);\n if (type == \"module\") return cont(pushlex(\"form\"), pushcontext, afterModule, popcontext, poplex);\n if (type == \"class\") return cont(pushlex(\"form\"), className, objlit, poplex);\n if (type == \"export\") return cont(pushlex(\"form\"), afterExport, poplex);\n if (type == \"import\") return cont(pushlex(\"form\"), afterImport, poplex);\n return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n }\n function expression(type) {\n return expressionInner(type, false);\n }\n function expressionNoComma(type) {\n return expressionInner(type, true);\n }\n function expressionInner(type, noComma) {\n if (cx.state.fatArrowAt == cx.stream.start) {\n var body = noComma ? arrowBodyNoComma : arrowBody;\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(pattern, \")\"), poplex, expect(\"=>\"), body, popcontext);\n else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n }\n\n var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n if (type == \"function\") return cont(functiondef, maybeop);\n if (type == \"keyword c\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\n if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, comprehension, expect(\")\"), poplex, maybeop);\n if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n if (type == \"quasi\") { return pass(quasi, maybeop); }\n return cont();\n }\n function maybeexpression(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expression);\n }\n function maybeexpressionNoComma(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expressionNoComma);\n }\n\n function maybeoperatorComma(type, value) {\n if (type == \",\") return cont(expression);\n return maybeoperatorNoComma(type, value, false);\n }\n function maybeoperatorNoComma(type, value, noComma) {\n var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n var expr = noComma == false ? expression : expressionNoComma;\n if (value == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n if (type == \"operator\") {\n if (/\\+\\+|--/.test(value)) return cont(me);\n if (value == \"?\") return cont(expression, expect(\":\"), expr);\n return cont(expr);\n }\n if (type == \"quasi\") { return pass(quasi, me); }\n if (type == \";\") return;\n if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n if (type == \".\") return cont(property, me);\n if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n }\n function quasi(type, value) {\n if (type != \"quasi\") return pass();\n if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n return cont(expression, continueQuasi);\n }\n function continueQuasi(type) {\n if (type == \"}\") {\n cx.marked = \"string-2\";\n cx.state.tokenize = tokenQuasi;\n return cont(quasi);\n }\n }\n function arrowBody(type) {\n findFatArrow(cx.stream, cx.state);\n if (type == \"{\") return pass(statement);\n return pass(expression);\n }\n function arrowBodyNoComma(type) {\n findFatArrow(cx.stream, cx.state);\n if (type == \"{\") return pass(statement);\n return pass(expressionNoComma);\n }\n function maybelabel(type) {\n if (type == \":\") return cont(poplex, statement);\n return pass(maybeoperatorComma, expect(\";\"), poplex);\n }\n function property(type) {\n if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n }\n function objprop(type, value) {\n if (type == \"variable\") {\n cx.marked = \"property\";\n if (value == \"get\" || value == \"set\") return cont(getterSetter);\n } else if (type == \"number\" || type == \"string\") {\n cx.marked = jsonldMode ? \"property\" : (type + \" property\");\n } else if (type == \"[\") {\n return cont(expression, expect(\"]\"), afterprop);\n }\n if (atomicTypes.hasOwnProperty(type)) return cont(afterprop);\n }\n function getterSetter(type) {\n if (type != \"variable\") return pass(afterprop);\n cx.marked = \"property\";\n return cont(functiondef);\n }\n function afterprop(type) {\n if (type == \":\") return cont(expressionNoComma);\n if (type == \"(\") return pass(functiondef);\n }\n function commasep(what, end) {\n function proceed(type) {\n if (type == \",\") {\n var lex = cx.state.lexical;\n if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n return cont(what, proceed);\n }\n if (type == end) return cont();\n return cont(expect(end));\n }\n return function(type) {\n if (type == end) return cont();\n return pass(what, proceed);\n };\n }\n function contCommasep(what, end, info) {\n for (var i = 3; i < arguments.length; i++)\n cx.cc.push(arguments[i]);\n return cont(pushlex(end, info), commasep(what, end), poplex);\n }\n function block(type) {\n if (type == \"}\") return cont();\n return pass(statement, block);\n }\n function maybetype(type) {\n if (isTS && type == \":\") return cont(typedef);\n }\n function typedef(type) {\n if (type == \"variable\"){cx.marked = \"variable-3\"; return cont();}\n }\n function vardef() {\n return pass(pattern, maybetype, maybeAssign, vardefCont);\n }\n function pattern(type, value) {\n if (type == \"variable\") { register(value); return cont(); }\n if (type == \"[\") return contCommasep(pattern, \"]\");\n if (type == \"{\") return contCommasep(proppattern, \"}\");\n }\n function proppattern(type, value) {\n if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n register(value);\n return cont(maybeAssign);\n }\n if (type == \"variable\") cx.marked = \"property\";\n return cont(expect(\":\"), pattern, maybeAssign);\n }\n function maybeAssign(_type, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function vardefCont(type) {\n if (type == \",\") return cont(vardef);\n }\n function maybeelse(type, value) {\n if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n }\n function forspec(type) {\n if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n }\n function forspec1(type) {\n if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n if (type == \";\") return cont(forspec2);\n if (type == \"variable\") return cont(formaybeinof);\n return pass(expression, expect(\";\"), forspec2);\n }\n function formaybeinof(_type, value) {\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n return cont(maybeoperatorComma, forspec2);\n }\n function forspec2(type, value) {\n if (type == \";\") return cont(forspec3);\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n return pass(expression, expect(\";\"), forspec3);\n }\n function forspec3(type) {\n if (type != \")\") cont(expression);\n }\n function functiondef(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n if (type == \"variable\") {register(value); return cont(functiondef);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, statement, popcontext);\n }\n function funarg(type) {\n if (type == \"spread\") return cont(funarg);\n return pass(pattern, maybetype);\n }\n function className(type, value) {\n if (type == \"variable\") {register(value); return cont(classNameAfter);}\n }\n function classNameAfter(_type, value) {\n if (value == \"extends\") return cont(expression);\n }\n function objlit(type) {\n if (type == \"{\") return contCommasep(objprop, \"}\");\n }\n function afterModule(type, value) {\n if (type == \"string\") return cont(statement);\n if (type == \"variable\") { register(value); return cont(maybeFrom); }\n }\n function afterExport(_type, value) {\n if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n return pass(statement);\n }\n function afterImport(type) {\n if (type == \"string\") return cont();\n return pass(importSpec, maybeFrom);\n }\n function importSpec(type, value) {\n if (type == \"{\") return contCommasep(importSpec, \"}\");\n if (type == \"variable\") register(value);\n return cont();\n }\n function maybeFrom(_type, value) {\n if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n }\n function arrayLiteral(type) {\n if (type == \"]\") return cont();\n return pass(expressionNoComma, maybeArrayComprehension);\n }\n function maybeArrayComprehension(type) {\n if (type == \"for\") return pass(comprehension, expect(\"]\"));\n if (type == \",\") return cont(commasep(expressionNoComma, \"]\"));\n return pass(commasep(expressionNoComma, \"]\"));\n }\n function comprehension(type) {\n if (type == \"for\") return cont(forspec, comprehension);\n if (type == \"if\") return cont(expression, comprehension);\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n var state = {\n tokenize: tokenBase,\n lastType: \"sof\",\n cc: [],\n lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n localVars: parserConfig.localVars,\n context: parserConfig.localVars && {vars: parserConfig.localVars},\n indented: 0\n };\n if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n state.globalVars = parserConfig.globalVars;\n return state;\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = false;\n state.indented = stream.indentation();\n findFatArrow(stream, state);\n }\n if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n if (type == \"comment\") return style;\n state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n return parseJS(state, style, type, content, stream);\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize == tokenComment) return CodeMirror.Pass;\n if (state.tokenize != tokenBase) return 0;\n var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;\n // Kludge to prevent 'maybelse' from blocking lexical scope pops\n if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n var c = state.cc[i];\n if (c == poplex) lexical = lexical.prev;\n else if (c != maybeelse) break;\n }\n if (lexical.type == \"stat\" && firstChar == \"}\") lexical = lexical.prev;\n if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n lexical = lexical.prev;\n var type = lexical.type, closing = firstChar == type;\n\n if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n else if (type == \"form\") return lexical.indented + indentUnit;\n else if (type == \"stat\")\n return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? statementIndent || indentUnit : 0);\n else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n else return lexical.indented + (closing ? 0 : indentUnit);\n },\n\n electricChars: \":{}\",\n blockCommentStart: jsonMode ? null : \"/*\",\n blockCommentEnd: jsonMode ? null : \"*/\",\n lineComment: jsonMode ? null : \"//\",\n fold: \"brace\",\n\n helperType: jsonMode ? \"json\" : \"javascript\",\n jsonldMode: jsonldMode,\n jsonMode: jsonMode\n };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/keymap/vim.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/keymap/vim.js",
"module-type": "library",
"text": "/**\n * Supported keybindings:\n *\n * Motion:\n * h, j, k, l\n * gj, gk\n * e, E, w, W, b, B, ge, gE\n * f<character>, F<character>, t<character>, T<character>\n * $, ^, 0, -, +, _\n * gg, G\n * %\n * '<character>, `<character>\n *\n * Operator:\n * d, y, c\n * dd, yy, cc\n * g~, g~g~\n * >, <, >>, <<\n *\n * Operator-Motion:\n * x, X, D, Y, C, ~\n *\n * Action:\n * a, i, s, A, I, S, o, O\n * zz, z., z<CR>, zt, zb, z-\n * J\n * u, Ctrl-r\n * m<character>\n * r<character>\n *\n * Modes:\n * ESC - leave insert mode, visual mode, and clear input state.\n * Ctrl-[, Ctrl-c - same as ESC.\n *\n * Registers: unnamed, -, a-z, A-Z, 0-9\n * (Does not respect the special case for number registers when delete\n * operator is made with these commands: %, (, ), , /, ?, n, N, {, } )\n * TODO: Implement the remaining registers.\n * Marks: a-z, A-Z, and 0-9\n * TODO: Implement the remaining special marks. They have more complex\n * behavior.\n *\n * Events:\n * 'vim-mode-change' - raised on the editor anytime the current mode changes,\n * Event object: {mode: \"visual\", subMode: \"linewise\"}\n *\n * Code structure:\n * 1. Default keymap\n * 2. Variable declarations and short basic helpers\n * 3. Instance (External API) implementation\n * 4. Internal state tracking objects (input state, counter) implementation\n * and instanstiation\n * 5. Key handler (the main command dispatcher) implementation\n * 6. Motion, operator, and action implementations\n * 7. Helper functions for the key handler, motions, operators, and actions\n * 8. Set up Vim to work as a keymap for CodeMirror.\n */\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/dialog/dialog\"), require(\"../addon/edit/matchbrackets.js\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/dialog/dialog\", \"../addon/edit/matchbrackets\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n 'use strict';\n\n var defaultKeymap = [\n // Key to key mapping. This goes first to make it possible to override\n // existing mappings.\n { keys: ['<Left>'], type: 'keyToKey', toKeys: ['h'] },\n { keys: ['<Right>'], type: 'keyToKey', toKeys: ['l'] },\n { keys: ['<Up>'], type: 'keyToKey', toKeys: ['k'] },\n { keys: ['<Down>'], type: 'keyToKey', toKeys: ['j'] },\n { keys: ['<Space>'], type: 'keyToKey', toKeys: ['l'] },\n { keys: ['<BS>'], type: 'keyToKey', toKeys: ['h'] },\n { keys: ['<C-Space>'], type: 'keyToKey', toKeys: ['W'] },\n { keys: ['<C-BS>'], type: 'keyToKey', toKeys: ['B'] },\n { keys: ['<S-Space>'], type: 'keyToKey', toKeys: ['w'] },\n { keys: ['<S-BS>'], type: 'keyToKey', toKeys: ['b'] },\n { keys: ['<C-n>'], type: 'keyToKey', toKeys: ['j'] },\n { keys: ['<C-p>'], type: 'keyToKey', toKeys: ['k'] },\n { keys: ['<C-[>'], type: 'keyToKey', toKeys: ['<Esc>'] },\n { keys: ['<C-c>'], type: 'keyToKey', toKeys: ['<Esc>'] },\n { keys: ['s'], type: 'keyToKey', toKeys: ['c', 'l'], context: 'normal' },\n { keys: ['s'], type: 'keyToKey', toKeys: ['x', 'i'], context: 'visual'},\n { keys: ['S'], type: 'keyToKey', toKeys: ['c', 'c'], context: 'normal' },\n { keys: ['S'], type: 'keyToKey', toKeys: ['d', 'c', 'c'], context: 'visual' },\n { keys: ['<Home>'], type: 'keyToKey', toKeys: ['0'] },\n { keys: ['<End>'], type: 'keyToKey', toKeys: ['$'] },\n { keys: ['<PageUp>'], type: 'keyToKey', toKeys: ['<C-b>'] },\n { keys: ['<PageDown>'], type: 'keyToKey', toKeys: ['<C-f>'] },\n { keys: ['<CR>'], type: 'keyToKey', toKeys: ['j', '^'], context: 'normal' },\n // Motions\n { keys: ['H'], type: 'motion',\n motion: 'moveToTopLine',\n motionArgs: { linewise: true, toJumplist: true }},\n { keys: ['M'], type: 'motion',\n motion: 'moveToMiddleLine',\n motionArgs: { linewise: true, toJumplist: true }},\n { keys: ['L'], type: 'motion',\n motion: 'moveToBottomLine',\n motionArgs: { linewise: true, toJumplist: true }},\n { keys: ['h'], type: 'motion',\n motion: 'moveByCharacters',\n motionArgs: { forward: false }},\n { keys: ['l'], type: 'motion',\n motion: 'moveByCharacters',\n motionArgs: { forward: true }},\n { keys: ['j'], type: 'motion',\n motion: 'moveByLines',\n motionArgs: { forward: true, linewise: true }},\n { keys: ['k'], type: 'motion',\n motion: 'moveByLines',\n motionArgs: { forward: false, linewise: true }},\n { keys: ['g','j'], type: 'motion',\n motion: 'moveByDisplayLines',\n motionArgs: { forward: true }},\n { keys: ['g','k'], type: 'motion',\n motion: 'moveByDisplayLines',\n motionArgs: { forward: false }},\n { keys: ['w'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: true, wordEnd: false }},\n { keys: ['W'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: true, wordEnd: false, bigWord: true }},\n { keys: ['e'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: true, wordEnd: true, inclusive: true }},\n { keys: ['E'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: true, wordEnd: true, bigWord: true,\n inclusive: true }},\n { keys: ['b'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: false, wordEnd: false }},\n { keys: ['B'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: false, wordEnd: false, bigWord: true }},\n { keys: ['g', 'e'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: false, wordEnd: true, inclusive: true }},\n { keys: ['g', 'E'], type: 'motion',\n motion: 'moveByWords',\n motionArgs: { forward: false, wordEnd: true, bigWord: true,\n inclusive: true }},\n { keys: ['{'], type: 'motion', motion: 'moveByParagraph',\n motionArgs: { forward: false, toJumplist: true }},\n { keys: ['}'], type: 'motion', motion: 'moveByParagraph',\n motionArgs: { forward: true, toJumplist: true }},\n { keys: ['<C-f>'], type: 'motion',\n motion: 'moveByPage', motionArgs: { forward: true }},\n { keys: ['<C-b>'], type: 'motion',\n motion: 'moveByPage', motionArgs: { forward: false }},\n { keys: ['<C-d>'], type: 'motion',\n motion: 'moveByScroll',\n motionArgs: { forward: true, explicitRepeat: true }},\n { keys: ['<C-u>'], type: 'motion',\n motion: 'moveByScroll',\n motionArgs: { forward: false, explicitRepeat: true }},\n { keys: ['g', 'g'], type: 'motion',\n motion: 'moveToLineOrEdgeOfDocument',\n motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},\n { keys: ['G'], type: 'motion',\n motion: 'moveToLineOrEdgeOfDocument',\n motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},\n { keys: ['0'], type: 'motion', motion: 'moveToStartOfLine' },\n { keys: ['^'], type: 'motion',\n motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: ['+'], type: 'motion',\n motion: 'moveByLines',\n motionArgs: { forward: true, toFirstChar:true }},\n { keys: ['-'], type: 'motion',\n motion: 'moveByLines',\n motionArgs: { forward: false, toFirstChar:true }},\n { keys: ['_'], type: 'motion',\n motion: 'moveByLines',\n motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},\n { keys: ['$'], type: 'motion',\n motion: 'moveToEol',\n motionArgs: { inclusive: true }},\n { keys: ['%'], type: 'motion',\n motion: 'moveToMatchedSymbol',\n motionArgs: { inclusive: true, toJumplist: true }},\n { keys: ['f', 'character'], type: 'motion',\n motion: 'moveToCharacter',\n motionArgs: { forward: true , inclusive: true }},\n { keys: ['F', 'character'], type: 'motion',\n motion: 'moveToCharacter',\n motionArgs: { forward: false }},\n { keys: ['t', 'character'], type: 'motion',\n motion: 'moveTillCharacter',\n motionArgs: { forward: true, inclusive: true }},\n { keys: ['T', 'character'], type: 'motion',\n motion: 'moveTillCharacter',\n motionArgs: { forward: false }},\n { keys: [';'], type: 'motion', motion: 'repeatLastCharacterSearch',\n motionArgs: { forward: true }},\n { keys: [','], type: 'motion', motion: 'repeatLastCharacterSearch',\n motionArgs: { forward: false }},\n { keys: ['\\'', 'character'], type: 'motion', motion: 'goToMark',\n motionArgs: {toJumplist: true, linewise: true}},\n { keys: ['`', 'character'], type: 'motion', motion: 'goToMark',\n motionArgs: {toJumplist: true}},\n { keys: [']', '`'], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n { keys: ['[', '`'], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n { keys: [']', '\\''], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n { keys: ['[', '\\''], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n // the next two aren't motions but must come before more general motion declarations\n { keys: [']', 'p'], type: 'action', action: 'paste', isEdit: true,\n actionArgs: { after: true, isEdit: true, matchIndent: true}},\n { keys: ['[', 'p'], type: 'action', action: 'paste', isEdit: true,\n actionArgs: { after: false, isEdit: true, matchIndent: true}},\n { keys: [']', 'character'], type: 'motion',\n motion: 'moveToSymbol',\n motionArgs: { forward: true, toJumplist: true}},\n { keys: ['[', 'character'], type: 'motion',\n motion: 'moveToSymbol',\n motionArgs: { forward: false, toJumplist: true}},\n { keys: ['|'], type: 'motion',\n motion: 'moveToColumn',\n motionArgs: { }},\n { keys: ['o'], type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: { },context:'visual'},\n // Operators\n { keys: ['d'], type: 'operator', operator: 'delete' },\n { keys: ['y'], type: 'operator', operator: 'yank' },\n { keys: ['c'], type: 'operator', operator: 'change' },\n { keys: ['>'], type: 'operator', operator: 'indent',\n operatorArgs: { indentRight: true }},\n { keys: ['<'], type: 'operator', operator: 'indent',\n operatorArgs: { indentRight: false }},\n { keys: ['g', '~'], type: 'operator', operator: 'swapcase' },\n { keys: ['n'], type: 'motion', motion: 'findNext',\n motionArgs: { forward: true, toJumplist: true }},\n { keys: ['N'], type: 'motion', motion: 'findNext',\n motionArgs: { forward: false, toJumplist: true }},\n // Operator-Motion dual commands\n { keys: ['x'], type: 'operatorMotion', operator: 'delete',\n motion: 'moveByCharacters', motionArgs: { forward: true },\n operatorMotionArgs: { visualLine: false }},\n { keys: ['X'], type: 'operatorMotion', operator: 'delete',\n motion: 'moveByCharacters', motionArgs: { forward: false },\n operatorMotionArgs: { visualLine: true }},\n { keys: ['D'], type: 'operatorMotion', operator: 'delete',\n motion: 'moveToEol', motionArgs: { inclusive: true },\n operatorMotionArgs: { visualLine: true }},\n { keys: ['Y'], type: 'operatorMotion', operator: 'yank',\n motion: 'moveToEol', motionArgs: { inclusive: true },\n operatorMotionArgs: { visualLine: true }},\n { keys: ['C'], type: 'operatorMotion',\n operator: 'change',\n motion: 'moveToEol', motionArgs: { inclusive: true },\n operatorMotionArgs: { visualLine: true }},\n { keys: ['~'], type: 'operatorMotion',\n operator: 'swapcase', operatorArgs: { shouldMoveCursor: true },\n motion: 'moveByCharacters', motionArgs: { forward: true }},\n // Actions\n { keys: ['<C-i>'], type: 'action', action: 'jumpListWalk',\n actionArgs: { forward: true }},\n { keys: ['<C-o>'], type: 'action', action: 'jumpListWalk',\n actionArgs: { forward: false }},\n { keys: ['<C-e>'], type: 'action',\n action: 'scroll',\n actionArgs: { forward: true, linewise: true }},\n { keys: ['<C-y>'], type: 'action',\n action: 'scroll',\n actionArgs: { forward: false, linewise: true }},\n { keys: ['a'], type: 'action', action: 'enterInsertMode', isEdit: true,\n actionArgs: { insertAt: 'charAfter' }},\n { keys: ['A'], type: 'action', action: 'enterInsertMode', isEdit: true,\n actionArgs: { insertAt: 'eol' }},\n { keys: ['i'], type: 'action', action: 'enterInsertMode', isEdit: true,\n actionArgs: { insertAt: 'inplace' }},\n { keys: ['I'], type: 'action', action: 'enterInsertMode', isEdit: true,\n actionArgs: { insertAt: 'firstNonBlank' }},\n { keys: ['o'], type: 'action', action: 'newLineAndEnterInsertMode',\n isEdit: true, interlaceInsertRepeat: true,\n actionArgs: { after: true }},\n { keys: ['O'], type: 'action', action: 'newLineAndEnterInsertMode',\n isEdit: true, interlaceInsertRepeat: true,\n actionArgs: { after: false }},\n { keys: ['v'], type: 'action', action: 'toggleVisualMode' },\n { keys: ['V'], type: 'action', action: 'toggleVisualMode',\n actionArgs: { linewise: true }},\n { keys: ['g', 'v'], type: 'action', action: 'reselectLastSelection' },\n { keys: ['J'], type: 'action', action: 'joinLines', isEdit: true },\n { keys: ['p'], type: 'action', action: 'paste', isEdit: true,\n actionArgs: { after: true, isEdit: true }},\n { keys: ['P'], type: 'action', action: 'paste', isEdit: true,\n actionArgs: { after: false, isEdit: true }},\n { keys: ['r', 'character'], type: 'action', action: 'replace', isEdit: true },\n { keys: ['@', 'character'], type: 'action', action: 'replayMacro' },\n { keys: ['q', 'character'], type: 'action', action: 'enterMacroRecordMode' },\n // Handle Replace-mode as a special case of insert mode.\n { keys: ['R'], type: 'action', action: 'enterInsertMode', isEdit: true,\n actionArgs: { replace: true }},\n { keys: ['u'], type: 'action', action: 'undo' },\n { keys: ['u'], type: 'action', action: 'changeCase', actionArgs: {toLower: true}, context: 'visual', isEdit: true },\n { keys: ['U'],type: 'action', action: 'changeCase', actionArgs: {toLower: false}, context: 'visual', isEdit: true },\n { keys: ['<C-r>'], type: 'action', action: 'redo' },\n { keys: ['m', 'character'], type: 'action', action: 'setMark' },\n { keys: ['\"', 'character'], type: 'action', action: 'setRegister' },\n { keys: ['z', 'z'], type: 'action', action: 'scrollToCursor',\n actionArgs: { position: 'center' }},\n { keys: ['z', '.'], type: 'action', action: 'scrollToCursor',\n actionArgs: { position: 'center' },\n motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: ['z', 't'], type: 'action', action: 'scrollToCursor',\n actionArgs: { position: 'top' }},\n { keys: ['z', '<CR>'], type: 'action', action: 'scrollToCursor',\n actionArgs: { position: 'top' },\n motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: ['z', '-'], type: 'action', action: 'scrollToCursor',\n actionArgs: { position: 'bottom' }},\n { keys: ['z', 'b'], type: 'action', action: 'scrollToCursor',\n actionArgs: { position: 'bottom' },\n motion: 'moveToFirstNonWhiteSpaceCharacter' },\n { keys: ['.'], type: 'action', action: 'repeatLastEdit' },\n { keys: ['<C-a>'], type: 'action', action: 'incrementNumberToken',\n isEdit: true,\n actionArgs: {increase: true, backtrack: false}},\n { keys: ['<C-x>'], type: 'action', action: 'incrementNumberToken',\n isEdit: true,\n actionArgs: {increase: false, backtrack: false}},\n // Text object motions\n { keys: ['a', 'character'], type: 'motion',\n motion: 'textObjectManipulation' },\n { keys: ['i', 'character'], type: 'motion',\n motion: 'textObjectManipulation',\n motionArgs: { textObjectInner: true }},\n // Search\n { keys: ['/'], type: 'search',\n searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},\n { keys: ['?'], type: 'search',\n searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},\n { keys: ['*'], type: 'search',\n searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n { keys: ['#'], type: 'search',\n searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n { keys: ['g', '*'], type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},\n { keys: ['g', '#'], type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},\n // Ex command\n { keys: [':'], type: 'ex' }\n ];\n\n var Pos = CodeMirror.Pos;\n\n var Vim = function() {\n CodeMirror.defineOption('vimMode', false, function(cm, val) {\n if (val) {\n cm.setOption('keyMap', 'vim');\n cm.setOption('disableInput', true);\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n cm.on('beforeSelectionChange', beforeSelectionChange);\n cm.on('cursorActivity', onCursorActivity);\n maybeInitVimState(cm);\n CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n } else if (cm.state.vim) {\n cm.setOption('keyMap', 'default');\n cm.setOption('disableInput', false);\n cm.off('beforeSelectionChange', beforeSelectionChange);\n cm.off('cursorActivity', onCursorActivity);\n CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n cm.state.vim = null;\n }\n });\n function beforeSelectionChange(cm, obj) {\n var vim = cm.state.vim;\n if (vim.insertMode || vim.exMode) return;\n\n var head = obj.ranges[0].head;\n var anchor = obj.ranges[0].anchor;\n if (head.ch && head.ch == cm.doc.getLine(head.line).length) {\n var pos = Pos(head.line, head.ch - 1);\n obj.update([{anchor: cursorEqual(head, anchor) ? pos : anchor,\n head: pos}]);\n }\n }\n function getOnPasteFn(cm) {\n var vim = cm.state.vim;\n if (!vim.onPasteFn) {\n vim.onPasteFn = function() {\n if (!vim.insertMode) {\n cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n actions.enterInsertMode(cm, {}, vim);\n }\n };\n }\n return vim.onPasteFn;\n }\n\n var numberRegex = /[\\d]/;\n var wordRegexp = [(/\\w/), (/[^\\w\\s]/)], bigWordRegexp = [(/\\S/)];\n function makeKeyRange(start, size) {\n var keys = [];\n for (var i = start; i < start + size; i++) {\n keys.push(String.fromCharCode(i));\n }\n return keys;\n }\n var upperCaseAlphabet = makeKeyRange(65, 26);\n var lowerCaseAlphabet = makeKeyRange(97, 26);\n var numbers = makeKeyRange(48, 10);\n var specialSymbols = '~`!@#$%^&*()_-+=[{}]\\\\|/?.,<>:;\"\\''.split('');\n var specialKeys = ['Left', 'Right', 'Up', 'Down', 'Space', 'Backspace',\n 'Esc', 'Home', 'End', 'PageUp', 'PageDown', 'Enter'];\n var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);\n var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '\"', '.', ':']);\n\n function isLine(cm, line) {\n return line >= cm.firstLine() && line <= cm.lastLine();\n }\n function isLowerCase(k) {\n return (/^[a-z]$/).test(k);\n }\n function isMatchableSymbol(k) {\n return '()[]{}'.indexOf(k) != -1;\n }\n function isNumber(k) {\n return numberRegex.test(k);\n }\n function isUpperCase(k) {\n return (/^[A-Z]$/).test(k);\n }\n function isWhiteSpaceString(k) {\n return (/^\\s*$/).test(k);\n }\n function inArray(val, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] == val) {\n return true;\n }\n }\n return false;\n }\n\n var options = {};\n function defineOption(name, defaultValue, type) {\n if (defaultValue === undefined) { throw Error('defaultValue is required'); }\n if (!type) { type = 'string'; }\n options[name] = {\n type: type,\n defaultValue: defaultValue\n };\n setOption(name, defaultValue);\n }\n\n function setOption(name, value) {\n var option = options[name];\n if (!option) {\n throw Error('Unknown option: ' + name);\n }\n if (option.type == 'boolean') {\n if (value && value !== true) {\n throw Error('Invalid argument: ' + name + '=' + value);\n } else if (value !== false) {\n // Boolean options are set to true if value is not defined.\n value = true;\n }\n }\n option.value = option.type == 'boolean' ? !!value : value;\n }\n\n function getOption(name) {\n var option = options[name];\n if (!option) {\n throw Error('Unknown option: ' + name);\n }\n return option.value;\n }\n\n var createCircularJumpList = function() {\n var size = 100;\n var pointer = -1;\n var head = 0;\n var tail = 0;\n var buffer = new Array(size);\n function add(cm, oldCur, newCur) {\n var current = pointer % size;\n var curMark = buffer[current];\n function useNextSlot(cursor) {\n var next = ++pointer % size;\n var trashMark = buffer[next];\n if (trashMark) {\n trashMark.clear();\n }\n buffer[next] = cm.setBookmark(cursor);\n }\n if (curMark) {\n var markPos = curMark.find();\n // avoid recording redundant cursor position\n if (markPos && !cursorEqual(markPos, oldCur)) {\n useNextSlot(oldCur);\n }\n } else {\n useNextSlot(oldCur);\n }\n useNextSlot(newCur);\n head = pointer;\n tail = pointer - size + 1;\n if (tail < 0) {\n tail = 0;\n }\n }\n function move(cm, offset) {\n pointer += offset;\n if (pointer > head) {\n pointer = head;\n } else if (pointer < tail) {\n pointer = tail;\n }\n var mark = buffer[(size + pointer) % size];\n // skip marks that are temporarily removed from text buffer\n if (mark && !mark.find()) {\n var inc = offset > 0 ? 1 : -1;\n var newCur;\n var oldCur = cm.getCursor();\n do {\n pointer += inc;\n mark = buffer[(size + pointer) % size];\n // skip marks that are the same as current position\n if (mark &&\n (newCur = mark.find()) &&\n !cursorEqual(oldCur, newCur)) {\n break;\n }\n } while (pointer < head && pointer > tail);\n }\n return mark;\n }\n return {\n cachedCursor: undefined, //used for # and * jumps\n add: add,\n move: move\n };\n };\n\n // Returns an object to track the changes associated insert mode. It\n // clones the object that is passed in, or creates an empty object one if\n // none is provided.\n var createInsertModeChanges = function(c) {\n if (c) {\n // Copy construction\n return {\n changes: c.changes,\n expectCursorActivityForChange: c.expectCursorActivityForChange\n };\n }\n return {\n // Change list\n changes: [],\n // Set to true on change, false on cursorActivity.\n expectCursorActivityForChange: false\n };\n };\n\n function MacroModeState() {\n this.latestRegister = undefined;\n this.isPlaying = false;\n this.isRecording = false;\n this.replaySearchQueries = [];\n this.onRecordingDone = undefined;\n this.lastInsertModeChanges = createInsertModeChanges();\n }\n MacroModeState.prototype = {\n exitMacroRecordMode: function() {\n var macroModeState = vimGlobalState.macroModeState;\n macroModeState.onRecordingDone(); // close dialog\n macroModeState.onRecordingDone = undefined;\n macroModeState.isRecording = false;\n },\n enterMacroRecordMode: function(cm, registerName) {\n var register =\n vimGlobalState.registerController.getRegister(registerName);\n if (register) {\n register.clear();\n this.latestRegister = registerName;\n this.onRecordingDone = cm.openDialog(\n '(recording)['+registerName+']', null, {bottom:true});\n this.isRecording = true;\n }\n }\n };\n\n function maybeInitVimState(cm) {\n if (!cm.state.vim) {\n // Store instance state in the CodeMirror object.\n cm.state.vim = {\n inputState: new InputState(),\n // Vim's input state that triggered the last edit, used to repeat\n // motions and operators with '.'.\n lastEditInputState: undefined,\n // Vim's action command before the last edit, used to repeat actions\n // with '.' and insert mode repeat.\n lastEditActionCommand: undefined,\n // When using jk for navigation, if you move from a longer line to a\n // shorter line, the cursor may clip to the end of the shorter line.\n // If j is pressed again and cursor goes to the next line, the\n // cursor should go back to its horizontal position on the longer\n // line if it can. This is to keep track of the horizontal position.\n lastHPos: -1,\n // Doing the same with screen-position for gj/gk\n lastHSPos: -1,\n // The last motion command run. Cleared if a non-motion command gets\n // executed in between.\n lastMotion: null,\n marks: {},\n insertMode: false,\n // Repeat count for changes made in insert mode, triggered by key\n // sequences like 3,i. Only exists when insertMode is true.\n insertModeRepeat: undefined,\n visualMode: false,\n // If we are in visual line mode. No effect if visualMode is false.\n visualLine: false,\n lastSelection: null\n };\n }\n return cm.state.vim;\n }\n var vimGlobalState;\n function resetVimGlobalState() {\n vimGlobalState = {\n // The current search query.\n searchQuery: null,\n // Whether we are searching backwards.\n searchIsReversed: false,\n // Replace part of the last substituted pattern\n lastSubstituteReplacePart: undefined,\n jumpList: createCircularJumpList(),\n macroModeState: new MacroModeState,\n // Recording latest f, t, F or T motion command.\n lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},\n registerController: new RegisterController({})\n };\n for (var optionName in options) {\n var option = options[optionName];\n option.value = option.defaultValue;\n }\n }\n\n var vimApi= {\n buildKeyMap: function() {\n // TODO: Convert keymap into dictionary format for fast lookup.\n },\n // Testing hook, though it might be useful to expose the register\n // controller anyways.\n getRegisterController: function() {\n return vimGlobalState.registerController;\n },\n // Testing hook.\n resetVimGlobalState_: resetVimGlobalState,\n\n // Testing hook.\n getVimGlobalState_: function() {\n return vimGlobalState;\n },\n\n // Testing hook.\n maybeInitVimState_: maybeInitVimState,\n\n InsertModeKey: InsertModeKey,\n map: function(lhs, rhs, ctx) {\n // Add user defined key bindings.\n exCommandDispatcher.map(lhs, rhs, ctx);\n },\n setOption: setOption,\n getOption: getOption,\n defineOption: defineOption,\n defineEx: function(name, prefix, func){\n if (name.indexOf(prefix) !== 0) {\n throw new Error('(Vim.defineEx) \"'+prefix+'\" is not a prefix of \"'+name+'\", command not registered');\n }\n exCommands[name]=func;\n exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};\n },\n // This is the outermost function called by CodeMirror, after keys have\n // been mapped to their Vim equivalents.\n handleKey: function(cm, key) {\n var command;\n var vim = maybeInitVimState(cm);\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isRecording) {\n if (key == 'q') {\n macroModeState.exitMacroRecordMode();\n vim.inputState = new InputState();\n return;\n }\n }\n if (key == '<Esc>') {\n // Clear input state and get back to normal mode.\n vim.inputState = new InputState();\n if (vim.visualMode) {\n exitVisualMode(cm);\n }\n return;\n }\n // Enter visual mode when the mouse selects text.\n if (!vim.visualMode &&\n !cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {\n vim.visualMode = true;\n vim.visualLine = false;\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n cm.on('mousedown', exitVisualMode);\n }\n if (key != '0' || (key == '0' && vim.inputState.getRepeat() === 0)) {\n // Have to special case 0 since it's both a motion and a number.\n command = commandDispatcher.matchCommand(key, defaultKeymap, vim);\n }\n if (!command) {\n if (isNumber(key)) {\n // Increment count unless count is 0 and key is 0.\n vim.inputState.pushRepeatDigit(key);\n }\n if (macroModeState.isRecording) {\n logKey(macroModeState, key);\n }\n return;\n }\n if (command.type == 'keyToKey') {\n // TODO: prevent infinite recursion.\n for (var i = 0; i < command.toKeys.length; i++) {\n this.handleKey(cm, command.toKeys[i]);\n }\n } else {\n if (macroModeState.isRecording) {\n logKey(macroModeState, key);\n }\n commandDispatcher.processCommand(cm, vim, command);\n }\n },\n handleEx: function(cm, input) {\n exCommandDispatcher.processCommand(cm, input);\n }\n };\n\n // Represents the current input state.\n function InputState() {\n this.prefixRepeat = [];\n this.motionRepeat = [];\n\n this.operator = null;\n this.operatorArgs = null;\n this.motion = null;\n this.motionArgs = null;\n this.keyBuffer = []; // For matching multi-key commands.\n this.registerName = null; // Defaults to the unnamed register.\n }\n InputState.prototype.pushRepeatDigit = function(n) {\n if (!this.operator) {\n this.prefixRepeat = this.prefixRepeat.concat(n);\n } else {\n this.motionRepeat = this.motionRepeat.concat(n);\n }\n };\n InputState.prototype.getRepeat = function() {\n var repeat = 0;\n if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n repeat = 1;\n if (this.prefixRepeat.length > 0) {\n repeat *= parseInt(this.prefixRepeat.join(''), 10);\n }\n if (this.motionRepeat.length > 0) {\n repeat *= parseInt(this.motionRepeat.join(''), 10);\n }\n }\n return repeat;\n };\n\n /*\n * Register stores information about copy and paste registers. Besides\n * text, a register must store whether it is linewise (i.e., when it is\n * pasted, should it insert itself into a new line, or should the text be\n * inserted at the cursor position.)\n */\n function Register(text, linewise) {\n this.clear();\n this.keyBuffer = [text || ''];\n this.insertModeChanges = [];\n this.searchQueries = [];\n this.linewise = !!linewise;\n }\n Register.prototype = {\n setText: function(text, linewise) {\n this.keyBuffer = [text || ''];\n this.linewise = !!linewise;\n },\n pushText: function(text, linewise) {\n // if this register has ever been set to linewise, use linewise.\n if (linewise) {\n if (!this.linewise) {\n this.keyBuffer.push('\\n');\n }\n this.linewise = true;\n }\n this.keyBuffer.push(text);\n },\n pushInsertModeChanges: function(changes) {\n this.insertModeChanges.push(createInsertModeChanges(changes));\n },\n pushSearchQuery: function(query) {\n this.searchQueries.push(query);\n },\n clear: function() {\n this.keyBuffer = [];\n this.insertModeChanges = [];\n this.searchQueries = [];\n this.linewise = false;\n },\n toString: function() {\n return this.keyBuffer.join('');\n }\n };\n\n /*\n * vim registers allow you to keep many independent copy and paste buffers.\n * See http://usevim.com/2012/04/13/registers/ for an introduction.\n *\n * RegisterController keeps the state of all the registers. An initial\n * state may be passed in. The unnamed register '\"' will always be\n * overridden.\n */\n function RegisterController(registers) {\n this.registers = registers;\n this.unnamedRegister = registers['\"'] = new Register();\n registers['.'] = new Register();\n registers[':'] = new Register();\n }\n RegisterController.prototype = {\n pushText: function(registerName, operator, text, linewise) {\n if (linewise && text.charAt(0) == '\\n') {\n text = text.slice(1) + '\\n';\n }\n if (linewise && text.charAt(text.length - 1) !== '\\n'){\n text += '\\n';\n }\n // Lowercase and uppercase registers refer to the same register.\n // Uppercase just means append.\n var register = this.isValidRegister(registerName) ?\n this.getRegister(registerName) : null;\n // if no register/an invalid register was specified, things go to the\n // default registers\n if (!register) {\n switch (operator) {\n case 'yank':\n // The 0 register contains the text from the most recent yank.\n this.registers['0'] = new Register(text, linewise);\n break;\n case 'delete':\n case 'change':\n if (text.indexOf('\\n') == -1) {\n // Delete less than 1 line. Update the small delete register.\n this.registers['-'] = new Register(text, linewise);\n } else {\n // Shift down the contents of the numbered registers and put the\n // deleted text into register 1.\n this.shiftNumericRegisters_();\n this.registers['1'] = new Register(text, linewise);\n }\n break;\n }\n // Make sure the unnamed register is set to what just happened\n this.unnamedRegister.setText(text, linewise);\n return;\n }\n\n // If we've gotten to this point, we've actually specified a register\n var append = isUpperCase(registerName);\n if (append) {\n register.pushText(text, linewise);\n } else {\n register.setText(text, linewise);\n }\n // The unnamed register always has the same value as the last used\n // register.\n this.unnamedRegister.setText(register.toString(), linewise);\n },\n // Gets the register named @name. If one of @name doesn't already exist,\n // create it. If @name is invalid, return the unnamedRegister.\n getRegister: function(name) {\n if (!this.isValidRegister(name)) {\n return this.unnamedRegister;\n }\n name = name.toLowerCase();\n if (!this.registers[name]) {\n this.registers[name] = new Register();\n }\n return this.registers[name];\n },\n isValidRegister: function(name) {\n return name && inArray(name, validRegisters);\n },\n shiftNumericRegisters_: function() {\n for (var i = 9; i >= 2; i--) {\n this.registers[i] = this.getRegister('' + (i - 1));\n }\n }\n };\n\n var commandDispatcher = {\n matchCommand: function(key, keyMap, vim) {\n var inputState = vim.inputState;\n var keys = inputState.keyBuffer.concat(key);\n var matchedCommands = [];\n var selectedCharacter;\n for (var i = 0; i < keyMap.length; i++) {\n var command = keyMap[i];\n if (matchKeysPartial(keys, command.keys)) {\n if (inputState.operator && command.type == 'action') {\n // Ignore matched action commands after an operator. Operators\n // only operate on motions. This check is really for text\n // objects since aW, a[ etcs conflicts with a.\n continue;\n }\n // Match commands that take <character> as an argument.\n if (command.keys[keys.length - 1] == 'character') {\n selectedCharacter = keys[keys.length - 1];\n if (selectedCharacter.length>1){\n switch(selectedCharacter){\n case '<CR>':\n selectedCharacter='\\n';\n break;\n case '<Space>':\n selectedCharacter=' ';\n break;\n default:\n continue;\n }\n }\n }\n // Add the command to the list of matched commands. Choose the best\n // command later.\n matchedCommands.push(command);\n }\n }\n\n // Returns the command if it is a full match, or null if not.\n function getFullyMatchedCommandOrNull(command) {\n if (keys.length < command.keys.length) {\n // Matches part of a multi-key command. Buffer and wait for next\n // stroke.\n inputState.keyBuffer.push(key);\n return null;\n } else {\n if (command.keys[keys.length - 1] == 'character') {\n inputState.selectedCharacter = selectedCharacter;\n }\n // Clear the buffer since a full match was found.\n inputState.keyBuffer = [];\n return command;\n }\n }\n\n if (!matchedCommands.length) {\n // Clear the buffer since there were no matches.\n inputState.keyBuffer = [];\n return null;\n } else if (matchedCommands.length == 1) {\n return getFullyMatchedCommandOrNull(matchedCommands[0]);\n } else {\n // Find the best match in the list of matchedCommands.\n var context = vim.visualMode ? 'visual' : 'normal';\n var bestMatch; // Default to first in the list.\n for (var i = 0; i < matchedCommands.length; i++) {\n var current = matchedCommands[i];\n if (current.context == context) {\n bestMatch = current;\n break;\n } else if (!bestMatch && !current.context) {\n // Only set an imperfect match to best match if no best match is\n // set and the imperfect match is not restricted to another\n // context.\n bestMatch = current;\n }\n }\n return getFullyMatchedCommandOrNull(bestMatch);\n }\n },\n processCommand: function(cm, vim, command) {\n vim.inputState.repeatOverride = command.repeatOverride;\n switch (command.type) {\n case 'motion':\n this.processMotion(cm, vim, command);\n break;\n case 'operator':\n this.processOperator(cm, vim, command);\n break;\n case 'operatorMotion':\n this.processOperatorMotion(cm, vim, command);\n break;\n case 'action':\n this.processAction(cm, vim, command);\n break;\n case 'search':\n this.processSearch(cm, vim, command);\n break;\n case 'ex':\n case 'keyToEx':\n this.processEx(cm, vim, command);\n break;\n default:\n break;\n }\n },\n processMotion: function(cm, vim, command) {\n vim.inputState.motion = command.motion;\n vim.inputState.motionArgs = copyArgs(command.motionArgs);\n this.evalInput(cm, vim);\n },\n processOperator: function(cm, vim, command) {\n var inputState = vim.inputState;\n if (inputState.operator) {\n if (inputState.operator == command.operator) {\n // Typing an operator twice like 'dd' makes the operator operate\n // linewise\n inputState.motion = 'expandToLine';\n inputState.motionArgs = { linewise: true };\n this.evalInput(cm, vim);\n return;\n } else {\n // 2 different operators in a row doesn't make sense.\n vim.inputState = new InputState();\n }\n }\n inputState.operator = command.operator;\n inputState.operatorArgs = copyArgs(command.operatorArgs);\n if (vim.visualMode) {\n // Operating on a selection in visual mode. We don't need a motion.\n this.evalInput(cm, vim);\n }\n },\n processOperatorMotion: function(cm, vim, command) {\n var visualMode = vim.visualMode;\n var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n if (operatorMotionArgs) {\n // Operator motions may have special behavior in visual mode.\n if (visualMode && operatorMotionArgs.visualLine) {\n vim.visualLine = true;\n }\n }\n this.processOperator(cm, vim, command);\n if (!visualMode) {\n this.processMotion(cm, vim, command);\n }\n },\n processAction: function(cm, vim, command) {\n var inputState = vim.inputState;\n var repeat = inputState.getRepeat();\n var repeatIsExplicit = !!repeat;\n var actionArgs = copyArgs(command.actionArgs) || {};\n if (inputState.selectedCharacter) {\n actionArgs.selectedCharacter = inputState.selectedCharacter;\n }\n // Actions may or may not have motions and operators. Do these first.\n if (command.operator) {\n this.processOperator(cm, vim, command);\n }\n if (command.motion) {\n this.processMotion(cm, vim, command);\n }\n if (command.motion || command.operator) {\n this.evalInput(cm, vim);\n }\n actionArgs.repeat = repeat || 1;\n actionArgs.repeatIsExplicit = repeatIsExplicit;\n actionArgs.registerName = inputState.registerName;\n vim.inputState = new InputState();\n vim.lastMotion = null;\n if (command.isEdit) {\n this.recordLastEdit(vim, inputState, command);\n }\n actions[command.action](cm, actionArgs, vim);\n },\n processSearch: function(cm, vim, command) {\n if (!cm.getSearchCursor) {\n // Search depends on SearchCursor.\n return;\n }\n var forward = command.searchArgs.forward;\n var wholeWordOnly = command.searchArgs.wholeWordOnly;\n getSearchState(cm).setReversed(!forward);\n var promptPrefix = (forward) ? '/' : '?';\n var originalQuery = getSearchState(cm).getQuery();\n var originalScrollPos = cm.getScrollInfo();\n function handleQuery(query, ignoreCase, smartCase) {\n try {\n updateSearchQuery(cm, query, ignoreCase, smartCase);\n } catch (e) {\n showConfirm(cm, 'Invalid regex: ' + query);\n return;\n }\n commandDispatcher.processMotion(cm, vim, {\n type: 'motion',\n motion: 'findNext',\n motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n });\n }\n function onPromptClose(query) {\n cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isRecording) {\n logSearchQuery(macroModeState, query);\n }\n }\n function onPromptKeyUp(_e, query) {\n var parsedQuery;\n try {\n parsedQuery = updateSearchQuery(cm, query,\n true /** ignoreCase */, true /** smartCase */);\n } catch (e) {\n // Swallow bad regexes for incremental search.\n }\n if (parsedQuery) {\n cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n } else {\n clearSearchHighlight(cm);\n cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n }\n }\n function onPromptKeyDown(e, _query, close) {\n var keyName = CodeMirror.keyName(e);\n if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {\n updateSearchQuery(cm, originalQuery);\n clearSearchHighlight(cm);\n cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n\n CodeMirror.e_stop(e);\n close();\n cm.focus();\n }\n }\n switch (command.searchArgs.querySrc) {\n case 'prompt':\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isPlaying) {\n var query = macroModeState.replaySearchQueries.shift();\n handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n } else {\n showPrompt(cm, {\n onClose: onPromptClose,\n prefix: promptPrefix,\n desc: searchPromptDesc,\n onKeyUp: onPromptKeyUp,\n onKeyDown: onPromptKeyDown\n });\n }\n break;\n case 'wordUnderCursor':\n var word = expandWordUnderCursor(cm, false /** inclusive */,\n true /** forward */, false /** bigWord */,\n true /** noSymbol */);\n var isKeyword = true;\n if (!word) {\n word = expandWordUnderCursor(cm, false /** inclusive */,\n true /** forward */, false /** bigWord */,\n false /** noSymbol */);\n isKeyword = false;\n }\n if (!word) {\n return;\n }\n var query = cm.getLine(word.start.line).substring(word.start.ch,\n word.end.ch);\n if (isKeyword && wholeWordOnly) {\n query = '\\\\b' + query + '\\\\b';\n } else {\n query = escapeRegex(query);\n }\n\n // cachedCursor is used to save the old position of the cursor\n // when * or # causes vim to seek for the nearest word and shift\n // the cursor before entering the motion.\n vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n cm.setCursor(word.start);\n\n handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n break;\n }\n },\n processEx: function(cm, vim, command) {\n function onPromptClose(input) {\n // Give the prompt some time to close so that if processCommand shows\n // an error, the elements don't overlap.\n exCommandDispatcher.processCommand(cm, input);\n }\n function onPromptKeyDown(e, _input, close) {\n var keyName = CodeMirror.keyName(e);\n if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {\n CodeMirror.e_stop(e);\n close();\n cm.focus();\n }\n }\n if (command.type == 'keyToEx') {\n // Handle user defined Ex to Ex mappings\n exCommandDispatcher.processCommand(cm, command.exArgs.input);\n } else {\n if (vim.visualMode) {\n showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n onKeyDown: onPromptKeyDown});\n } else {\n showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n onKeyDown: onPromptKeyDown});\n }\n }\n },\n evalInput: function(cm, vim) {\n // If the motion comand is set, execute both the operator and motion.\n // Otherwise return.\n var inputState = vim.inputState;\n var motion = inputState.motion;\n var motionArgs = inputState.motionArgs || {};\n var operator = inputState.operator;\n var operatorArgs = inputState.operatorArgs || {};\n var registerName = inputState.registerName;\n var selectionEnd = copyCursor(cm.getCursor('head'));\n var selectionStart = copyCursor(cm.getCursor('anchor'));\n // The difference between cur and selection cursors are that cur is\n // being operated on and ignores that there is a selection.\n var curStart = copyCursor(selectionEnd);\n var curOriginal = copyCursor(curStart);\n var curEnd;\n var repeat;\n if (operator) {\n this.recordLastEdit(vim, inputState);\n }\n if (inputState.repeatOverride !== undefined) {\n // If repeatOverride is specified, that takes precedence over the\n // input state's repeat. Used by Ex mode and can be user defined.\n repeat = inputState.repeatOverride;\n } else {\n repeat = inputState.getRepeat();\n }\n if (repeat > 0 && motionArgs.explicitRepeat) {\n motionArgs.repeatIsExplicit = true;\n } else if (motionArgs.noRepeat ||\n (!motionArgs.explicitRepeat && repeat === 0)) {\n repeat = 1;\n motionArgs.repeatIsExplicit = false;\n }\n if (inputState.selectedCharacter) {\n // If there is a character input, stick it in all of the arg arrays.\n motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n inputState.selectedCharacter;\n }\n motionArgs.repeat = repeat;\n vim.inputState = new InputState();\n if (motion) {\n var motionResult = motions[motion](cm, motionArgs, vim);\n vim.lastMotion = motions[motion];\n if (!motionResult) {\n return;\n }\n if (motionArgs.toJumplist) {\n var jumpList = vimGlobalState.jumpList;\n // if the current motion is # or *, use cachedCursor\n var cachedCursor = jumpList.cachedCursor;\n if (cachedCursor) {\n recordJumpPosition(cm, cachedCursor, motionResult);\n delete jumpList.cachedCursor;\n } else {\n recordJumpPosition(cm, curOriginal, motionResult);\n }\n }\n if (motionResult instanceof Array) {\n curStart = motionResult[0];\n curEnd = motionResult[1];\n } else {\n curEnd = motionResult;\n }\n // TODO: Handle null returns from motion commands better.\n if (!curEnd) {\n curEnd = Pos(curStart.line, curStart.ch);\n }\n if (vim.visualMode) {\n // Check if the selection crossed over itself. Will need to shift\n // the start point if that happened.\n if (cursorIsBefore(selectionStart, selectionEnd) &&\n (cursorEqual(selectionStart, curEnd) ||\n cursorIsBefore(curEnd, selectionStart))) {\n // The end of the selection has moved from after the start to\n // before the start. We will shift the start right by 1.\n selectionStart.ch += 1;\n } else if (cursorIsBefore(selectionEnd, selectionStart) &&\n (cursorEqual(selectionStart, curEnd) ||\n cursorIsBefore(selectionStart, curEnd))) {\n // The opposite happened. We will shift the start left by 1.\n selectionStart.ch -= 1;\n }\n selectionEnd = curEnd;\n selectionStart = (motionResult instanceof Array) ? curStart : selectionStart;\n if (vim.visualLine) {\n if (cursorIsBefore(selectionStart, selectionEnd)) {\n selectionStart.ch = 0;\n\n var lastLine = cm.lastLine();\n if (selectionEnd.line > lastLine) {\n selectionEnd.line = lastLine;\n }\n selectionEnd.ch = lineLength(cm, selectionEnd.line);\n } else {\n selectionEnd.ch = 0;\n selectionStart.ch = lineLength(cm, selectionStart.line);\n }\n }\n cm.setSelection(selectionStart, selectionEnd);\n updateMark(cm, vim, '<',\n cursorIsBefore(selectionStart, selectionEnd) ? selectionStart\n : selectionEnd);\n updateMark(cm, vim, '>',\n cursorIsBefore(selectionStart, selectionEnd) ? selectionEnd\n : selectionStart);\n } else if (!operator) {\n curEnd = clipCursorToContent(cm, curEnd);\n cm.setCursor(curEnd.line, curEnd.ch);\n }\n }\n\n if (operator) {\n var inverted = false;\n vim.lastMotion = null;\n operatorArgs.repeat = repeat; // Indent in visual mode needs this.\n if (vim.visualMode) {\n curStart = selectionStart;\n curEnd = selectionEnd;\n motionArgs.inclusive = true;\n }\n // Swap start and end if motion was backward.\n if (curEnd && cursorIsBefore(curEnd, curStart)) {\n var tmp = curStart;\n curStart = curEnd;\n curEnd = tmp;\n inverted = true;\n } else if (!curEnd) {\n curEnd = copyCursor(curStart);\n }\n if (motionArgs.inclusive && !(vim.visualMode && inverted)) {\n // Move the selection end one to the right to include the last\n // character.\n curEnd.ch++;\n }\n if (operatorArgs.selOffset) {\n // Replaying a visual mode operation\n curEnd.line = curStart.line + operatorArgs.selOffset.line;\n if (operatorArgs.selOffset.line) {curEnd.ch = operatorArgs.selOffset.ch; }\n else { curEnd.ch = curStart.ch + operatorArgs.selOffset.ch; }\n } else if (vim.visualMode) {\n var selOffset = Pos();\n selOffset.line = curEnd.line - curStart.line;\n if (selOffset.line) { selOffset.ch = curEnd.ch; }\n else { selOffset.ch = curEnd.ch - curStart.ch; }\n operatorArgs.selOffset = selOffset;\n }\n var linewise = motionArgs.linewise ||\n (vim.visualMode && vim.visualLine) ||\n operatorArgs.linewise;\n if (linewise) {\n // Expand selection to entire line.\n expandSelectionToLine(cm, curStart, curEnd);\n } else if (motionArgs.forward) {\n // Clip to trailing newlines only if the motion goes forward.\n clipToLine(cm, curStart, curEnd);\n }\n operatorArgs.registerName = registerName;\n // Keep track of linewise as it affects how paste and change behave.\n operatorArgs.linewise = linewise;\n operators[operator](cm, operatorArgs, vim, curStart,\n curEnd, curOriginal);\n if (vim.visualMode) {\n exitVisualMode(cm);\n }\n }\n },\n recordLastEdit: function(vim, inputState, actionCommand) {\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isPlaying) { return; }\n vim.lastEditInputState = inputState;\n vim.lastEditActionCommand = actionCommand;\n macroModeState.lastInsertModeChanges.changes = [];\n macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n }\n };\n\n /**\n * typedef {Object{line:number,ch:number}} Cursor An object containing the\n * position of the cursor.\n */\n // All of the functions below return Cursor objects.\n var motions = {\n moveToTopLine: function(cm, motionArgs) {\n var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;\n return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n },\n moveToMiddleLine: function(cm) {\n var range = getUserVisibleLines(cm);\n var line = Math.floor((range.top + range.bottom) * 0.5);\n return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n },\n moveToBottomLine: function(cm, motionArgs) {\n var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;\n return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n },\n expandToLine: function(cm, motionArgs) {\n // Expands forward to end of line, and then to next line if repeat is\n // >1. Does not handle backward motion!\n var cur = cm.getCursor();\n return Pos(cur.line + motionArgs.repeat - 1, Infinity);\n },\n findNext: function(cm, motionArgs) {\n var state = getSearchState(cm);\n var query = state.getQuery();\n if (!query) {\n return;\n }\n var prev = !motionArgs.forward;\n // If search is initiated with ? instead of /, negate direction.\n prev = (state.isReversed()) ? !prev : prev;\n highlightSearchMatches(cm, query);\n return findNext(cm, prev/** prev */, query, motionArgs.repeat);\n },\n goToMark: function(cm, motionArgs, vim) {\n var mark = vim.marks[motionArgs.selectedCharacter];\n if (mark) {\n var pos = mark.find();\n return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n }\n return null;\n },\n moveToOtherHighlightedEnd: function(cm) {\n var curEnd = copyCursor(cm.getCursor('head'));\n var curStart = copyCursor(cm.getCursor('anchor'));\n if (cursorIsBefore(curStart, curEnd)) {\n curEnd.ch += 1;\n } else if (cursorIsBefore(curEnd, curStart)) {\n curStart.ch -= 1;\n }\n return ([curEnd,curStart]);\n },\n jumpToMark: function(cm, motionArgs, vim) {\n var best = cm.getCursor();\n for (var i = 0; i < motionArgs.repeat; i++) {\n var cursor = best;\n for (var key in vim.marks) {\n if (!isLowerCase(key)) {\n continue;\n }\n var mark = vim.marks[key].find();\n var isWrongDirection = (motionArgs.forward) ?\n cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n\n if (isWrongDirection) {\n continue;\n }\n if (motionArgs.linewise && (mark.line == cursor.line)) {\n continue;\n }\n\n var equal = cursorEqual(cursor, best);\n var between = (motionArgs.forward) ?\n cusrorIsBetween(cursor, mark, best) :\n cusrorIsBetween(best, mark, cursor);\n\n if (equal || between) {\n best = mark;\n }\n }\n }\n\n if (motionArgs.linewise) {\n // Vim places the cursor on the first non-whitespace character of\n // the line if there is one, else it places the cursor at the end\n // of the line, regardless of whether a mark was found.\n best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n }\n return best;\n },\n moveByCharacters: function(cm, motionArgs) {\n var cur = cm.getCursor();\n var repeat = motionArgs.repeat;\n var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n return Pos(cur.line, ch);\n },\n moveByLines: function(cm, motionArgs, vim) {\n var cur = cm.getCursor();\n var endCh = cur.ch;\n // Depending what our last motion was, we may want to do different\n // things. If our last motion was moving vertically, we want to\n // preserve the HPos from our last horizontal move. If our last motion\n // was going to the end of a line, moving vertically we should go to\n // the end of the line, etc.\n switch (vim.lastMotion) {\n case this.moveByLines:\n case this.moveByDisplayLines:\n case this.moveByScroll:\n case this.moveToColumn:\n case this.moveToEol:\n endCh = vim.lastHPos;\n break;\n default:\n vim.lastHPos = endCh;\n }\n var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);\n var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n var first = cm.firstLine();\n var last = cm.lastLine();\n // Vim cancels linewise motions that start on an edge and move beyond\n // that edge. It does not cancel motions that do not start on an edge.\n if ((line < first && cur.line == first) ||\n (line > last && cur.line == last)) {\n return;\n }\n if (motionArgs.toFirstChar){\n endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n vim.lastHPos = endCh;\n }\n vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left;\n return Pos(line, endCh);\n },\n moveByDisplayLines: function(cm, motionArgs, vim) {\n var cur = cm.getCursor();\n switch (vim.lastMotion) {\n case this.moveByDisplayLines:\n case this.moveByScroll:\n case this.moveByLines:\n case this.moveToColumn:\n case this.moveToEol:\n break;\n default:\n vim.lastHSPos = cm.charCoords(cur,'div').left;\n }\n var repeat = motionArgs.repeat;\n var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos);\n if (res.hitSide) {\n if (motionArgs.forward) {\n var lastCharCoords = cm.charCoords(res, 'div');\n var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n var res = cm.coordsChar(goalCoords, 'div');\n } else {\n var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div');\n resCoords.left = vim.lastHSPos;\n res = cm.coordsChar(resCoords, 'div');\n }\n }\n vim.lastHPos = res.ch;\n return res;\n },\n moveByPage: function(cm, motionArgs) {\n // CodeMirror only exposes functions that move the cursor page down, so\n // doing this bad hack to move the cursor and move it back. evalInput\n // will move the cursor to where it should be in the end.\n var curStart = cm.getCursor();\n var repeat = motionArgs.repeat;\n return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n },\n moveByParagraph: function(cm, motionArgs) {\n var line = cm.getCursor().line;\n var repeat = motionArgs.repeat;\n var inc = motionArgs.forward ? 1 : -1;\n for (var i = 0; i < repeat; i++) {\n if ((!motionArgs.forward && line === cm.firstLine() ) ||\n (motionArgs.forward && line == cm.lastLine())) {\n break;\n }\n line += inc;\n while (line !== cm.firstLine() && line != cm.lastLine() && cm.getLine(line)) {\n line += inc;\n }\n }\n return Pos(line, 0);\n },\n moveByScroll: function(cm, motionArgs, vim) {\n var scrollbox = cm.getScrollInfo();\n var curEnd = null;\n var repeat = motionArgs.repeat;\n if (!repeat) {\n repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n }\n var orig = cm.charCoords(cm.getCursor(), 'local');\n motionArgs.repeat = repeat;\n var curEnd = motions.moveByDisplayLines(cm, motionArgs, vim);\n if (!curEnd) {\n return null;\n }\n var dest = cm.charCoords(curEnd, 'local');\n cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n return curEnd;\n },\n moveByWords: function(cm, motionArgs) {\n return moveToWord(cm, motionArgs.repeat, !!motionArgs.forward,\n !!motionArgs.wordEnd, !!motionArgs.bigWord);\n },\n moveTillCharacter: function(cm, motionArgs) {\n var repeat = motionArgs.repeat;\n var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,\n motionArgs.selectedCharacter);\n var increment = motionArgs.forward ? -1 : 1;\n recordLastCharacterSearch(increment, motionArgs);\n if (!curEnd) return null;\n curEnd.ch += increment;\n return curEnd;\n },\n moveToCharacter: function(cm, motionArgs) {\n var repeat = motionArgs.repeat;\n recordLastCharacterSearch(0, motionArgs);\n return moveToCharacter(cm, repeat, motionArgs.forward,\n motionArgs.selectedCharacter) || cm.getCursor();\n },\n moveToSymbol: function(cm, motionArgs) {\n var repeat = motionArgs.repeat;\n return findSymbol(cm, repeat, motionArgs.forward,\n motionArgs.selectedCharacter) || cm.getCursor();\n },\n moveToColumn: function(cm, motionArgs, vim) {\n var repeat = motionArgs.repeat;\n // repeat is equivalent to which column we want to move to!\n vim.lastHPos = repeat - 1;\n vim.lastHSPos = cm.charCoords(cm.getCursor(),'div').left;\n return moveToColumn(cm, repeat);\n },\n moveToEol: function(cm, motionArgs, vim) {\n var cur = cm.getCursor();\n vim.lastHPos = Infinity;\n var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);\n var end=cm.clipPos(retval);\n end.ch--;\n vim.lastHSPos = cm.charCoords(end,'div').left;\n return retval;\n },\n moveToFirstNonWhiteSpaceCharacter: function(cm) {\n // Go to the start of the line where the text begins, or the end for\n // whitespace-only lines\n var cursor = cm.getCursor();\n return Pos(cursor.line,\n findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n },\n moveToMatchedSymbol: function(cm) {\n var cursor = cm.getCursor();\n var line = cursor.line;\n var ch = cursor.ch;\n var lineText = cm.getLine(line);\n var symbol;\n do {\n symbol = lineText.charAt(ch++);\n if (symbol && isMatchableSymbol(symbol)) {\n var style = cm.getTokenTypeAt(Pos(line, ch));\n if (style !== \"string\" && style !== \"comment\") {\n break;\n }\n }\n } while (symbol);\n if (symbol) {\n var matched = cm.findMatchingBracket(Pos(line, ch));\n return matched.to;\n } else {\n return cursor;\n }\n },\n moveToStartOfLine: function(cm) {\n var cursor = cm.getCursor();\n return Pos(cursor.line, 0);\n },\n moveToLineOrEdgeOfDocument: function(cm, motionArgs) {\n var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n if (motionArgs.repeatIsExplicit) {\n lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n }\n return Pos(lineNum,\n findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n },\n textObjectManipulation: function(cm, motionArgs) {\n // TODO: lots of possible exceptions that can be thrown here. Try da(\n // outside of a () block.\n\n // TODO: adding <> >< to this map doesn't work, presumably because\n // they're operators\n var mirroredPairs = {'(': ')', ')': '(',\n '{': '}', '}': '{',\n '[': ']', ']': '['};\n var selfPaired = {'\\'': true, '\"': true};\n\n var character = motionArgs.selectedCharacter;\n // 'b' refers to '()' block.\n // 'B' refers to '{}' block.\n if (character == 'b') {\n character = '(';\n } else if (character == 'B') {\n character = '{';\n }\n\n // Inclusive is the difference between a and i\n // TODO: Instead of using the additional text object map to perform text\n // object operations, merge the map into the defaultKeyMap and use\n // motionArgs to define behavior. Define separate entries for 'aw',\n // 'iw', 'a[', 'i[', etc.\n var inclusive = !motionArgs.textObjectInner;\n\n var tmp;\n if (mirroredPairs[character]) {\n tmp = selectCompanionObject(cm, character, inclusive);\n } else if (selfPaired[character]) {\n tmp = findBeginningAndEnd(cm, character, inclusive);\n } else if (character === 'W') {\n tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n true /** bigWord */);\n } else if (character === 'w') {\n tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n false /** bigWord */);\n } else {\n // No text object defined for this, don't move.\n return null;\n }\n\n return [tmp.start, tmp.end];\n },\n\n repeatLastCharacterSearch: function(cm, motionArgs) {\n var lastSearch = vimGlobalState.lastChararacterSearch;\n var repeat = motionArgs.repeat;\n var forward = motionArgs.forward === lastSearch.forward;\n var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n cm.moveH(-increment, 'char');\n motionArgs.inclusive = forward ? true : false;\n var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n if (!curEnd) {\n cm.moveH(increment, 'char');\n return cm.getCursor();\n }\n curEnd.ch += increment;\n return curEnd;\n }\n };\n\n var operators = {\n change: function(cm, operatorArgs, _vim, curStart, curEnd) {\n vimGlobalState.registerController.pushText(\n operatorArgs.registerName, 'change', cm.getRange(curStart, curEnd),\n operatorArgs.linewise);\n if (operatorArgs.linewise) {\n // Push the next line back down, if there is a next line.\n var replacement = curEnd.line > cm.lastLine() ? '' : '\\n';\n cm.replaceRange(replacement, curStart, curEnd);\n cm.indentLine(curStart.line, 'smart');\n // null ch so setCursor moves to end of line.\n curStart.ch = null;\n } else {\n // Exclude trailing whitespace if the range is not all whitespace.\n var text = cm.getRange(curStart, curEnd);\n if (!isWhiteSpaceString(text)) {\n var match = (/\\s+$/).exec(text);\n if (match) {\n curEnd = offsetCursor(curEnd, 0, - match[0].length);\n }\n }\n cm.replaceRange('', curStart, curEnd);\n }\n actions.enterInsertMode(cm, {}, cm.state.vim);\n cm.setCursor(curStart);\n },\n // delete is a javascript keyword.\n 'delete': function(cm, operatorArgs, _vim, curStart, curEnd) {\n // If the ending line is past the last line, inclusive, instead of\n // including the trailing \\n, include the \\n before the starting line\n if (operatorArgs.linewise &&\n curEnd.line > cm.lastLine() && curStart.line > cm.firstLine()) {\n curStart.line--;\n curStart.ch = lineLength(cm, curStart.line);\n }\n vimGlobalState.registerController.pushText(\n operatorArgs.registerName, 'delete', cm.getRange(curStart, curEnd),\n operatorArgs.linewise);\n cm.replaceRange('', curStart, curEnd);\n if (operatorArgs.linewise) {\n cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));\n } else {\n cm.setCursor(curStart);\n }\n },\n indent: function(cm, operatorArgs, vim, curStart, curEnd) {\n var startLine = curStart.line;\n var endLine = curEnd.line;\n // In visual mode, n> shifts the selection right n times, instead of\n // shifting n lines right once.\n var repeat = (vim.visualMode) ? operatorArgs.repeat : 1;\n if (operatorArgs.linewise) {\n // The only way to delete a newline is to delete until the start of\n // the next line, so in linewise mode evalInput will include the next\n // line. We don't want this in indent, so we go back a line.\n endLine--;\n }\n for (var i = startLine; i <= endLine; i++) {\n for (var j = 0; j < repeat; j++) {\n cm.indentLine(i, operatorArgs.indentRight);\n }\n }\n cm.setCursor(curStart);\n cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));\n },\n swapcase: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {\n var toSwap = cm.getRange(curStart, curEnd);\n var swapped = '';\n for (var i = 0; i < toSwap.length; i++) {\n var character = toSwap.charAt(i);\n swapped += isUpperCase(character) ? character.toLowerCase() :\n character.toUpperCase();\n }\n cm.replaceRange(swapped, curStart, curEnd);\n if (!operatorArgs.shouldMoveCursor) {\n cm.setCursor(curOriginal);\n }\n },\n yank: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {\n vimGlobalState.registerController.pushText(\n operatorArgs.registerName, 'yank',\n cm.getRange(curStart, curEnd), operatorArgs.linewise);\n cm.setCursor(curOriginal);\n }\n };\n\n var actions = {\n jumpListWalk: function(cm, actionArgs, vim) {\n if (vim.visualMode) {\n return;\n }\n var repeat = actionArgs.repeat;\n var forward = actionArgs.forward;\n var jumpList = vimGlobalState.jumpList;\n\n var mark = jumpList.move(cm, forward ? repeat : -repeat);\n var markPos = mark ? mark.find() : undefined;\n markPos = markPos ? markPos : cm.getCursor();\n cm.setCursor(markPos);\n },\n scroll: function(cm, actionArgs, vim) {\n if (vim.visualMode) {\n return;\n }\n var repeat = actionArgs.repeat || 1;\n var lineHeight = cm.defaultTextHeight();\n var top = cm.getScrollInfo().top;\n var delta = lineHeight * repeat;\n var newPos = actionArgs.forward ? top + delta : top - delta;\n var cursor = copyCursor(cm.getCursor());\n var cursorCoords = cm.charCoords(cursor, 'local');\n if (actionArgs.forward) {\n if (newPos > cursorCoords.top) {\n cursor.line += (newPos - cursorCoords.top) / lineHeight;\n cursor.line = Math.ceil(cursor.line);\n cm.setCursor(cursor);\n cursorCoords = cm.charCoords(cursor, 'local');\n cm.scrollTo(null, cursorCoords.top);\n } else {\n // Cursor stays within bounds. Just reposition the scroll window.\n cm.scrollTo(null, newPos);\n }\n } else {\n var newBottom = newPos + cm.getScrollInfo().clientHeight;\n if (newBottom < cursorCoords.bottom) {\n cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n cursor.line = Math.floor(cursor.line);\n cm.setCursor(cursor);\n cursorCoords = cm.charCoords(cursor, 'local');\n cm.scrollTo(\n null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n } else {\n // Cursor stays within bounds. Just reposition the scroll window.\n cm.scrollTo(null, newPos);\n }\n }\n },\n scrollToCursor: function(cm, actionArgs) {\n var lineNum = cm.getCursor().line;\n var charCoords = cm.charCoords(Pos(lineNum, 0), 'local');\n var height = cm.getScrollInfo().clientHeight;\n var y = charCoords.top;\n var lineHeight = charCoords.bottom - y;\n switch (actionArgs.position) {\n case 'center': y = y - (height / 2) + lineHeight;\n break;\n case 'bottom': y = y - height + lineHeight*1.4;\n break;\n case 'top': y = y + lineHeight*0.4;\n break;\n }\n cm.scrollTo(null, y);\n },\n replayMacro: function(cm, actionArgs, vim) {\n var registerName = actionArgs.selectedCharacter;\n var repeat = actionArgs.repeat;\n var macroModeState = vimGlobalState.macroModeState;\n if (registerName == '@') {\n registerName = macroModeState.latestRegister;\n }\n while(repeat--){\n executeMacroRegister(cm, vim, macroModeState, registerName);\n }\n },\n enterMacroRecordMode: function(cm, actionArgs) {\n var macroModeState = vimGlobalState.macroModeState;\n var registerName = actionArgs.selectedCharacter;\n macroModeState.enterMacroRecordMode(cm, registerName);\n },\n enterInsertMode: function(cm, actionArgs, vim) {\n if (cm.getOption('readOnly')) { return; }\n vim.insertMode = true;\n vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n if (insertAt == 'eol') {\n var cursor = cm.getCursor();\n cursor = Pos(cursor.line, lineLength(cm, cursor.line));\n cm.setCursor(cursor);\n } else if (insertAt == 'charAfter') {\n cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n } else if (insertAt == 'firstNonBlank') {\n cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));\n }\n cm.setOption('keyMap', 'vim-insert');\n cm.setOption('disableInput', false);\n if (actionArgs && actionArgs.replace) {\n // Handle Replace-mode as a special case of insert mode.\n cm.toggleOverwrite(true);\n cm.setOption('keyMap', 'vim-replace');\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n } else {\n cm.setOption('keyMap', 'vim-insert');\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n }\n if (!vimGlobalState.macroModeState.isPlaying) {\n // Only record if not replaying.\n cm.on('change', onChange);\n CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n }\n },\n toggleVisualMode: function(cm, actionArgs, vim) {\n var repeat = actionArgs.repeat;\n var curStart = cm.getCursor();\n var curEnd;\n // TODO: The repeat should actually select number of characters/lines\n // equal to the repeat times the size of the previous visual\n // operation.\n if (!vim.visualMode) {\n cm.on('mousedown', exitVisualMode);\n vim.visualMode = true;\n vim.visualLine = !!actionArgs.linewise;\n if (vim.visualLine) {\n curStart.ch = 0;\n curEnd = clipCursorToContent(\n cm, Pos(curStart.line + repeat - 1, lineLength(cm, curStart.line)),\n true /** includeLineBreak */);\n } else {\n curEnd = clipCursorToContent(\n cm, Pos(curStart.line, curStart.ch + repeat),\n true /** includeLineBreak */);\n }\n // Make the initial selection.\n if (!actionArgs.repeatIsExplicit && !vim.visualLine) {\n // This is a strange case. Here the implicit repeat is 1. The\n // following commands lets the cursor hover over the 1 character\n // selection.\n cm.setCursor(curEnd);\n cm.setSelection(curEnd, curStart);\n } else {\n cm.setSelection(curStart, curEnd);\n }\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : \"\"});\n } else {\n curStart = cm.getCursor('anchor');\n curEnd = cm.getCursor('head');\n if (!vim.visualLine && actionArgs.linewise) {\n // Shift-V pressed in characterwise visual mode. Switch to linewise\n // visual mode instead of exiting visual mode.\n vim.visualLine = true;\n curStart.ch = cursorIsBefore(curStart, curEnd) ? 0 :\n lineLength(cm, curStart.line);\n curEnd.ch = cursorIsBefore(curStart, curEnd) ?\n lineLength(cm, curEnd.line) : 0;\n cm.setSelection(curStart, curEnd);\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"linewise\"});\n } else if (vim.visualLine && !actionArgs.linewise) {\n // v pressed in linewise visual mode. Switch to characterwise visual\n // mode instead of exiting visual mode.\n vim.visualLine = false;\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n } else {\n exitVisualMode(cm);\n }\n }\n updateMark(cm, vim, '<', cursorIsBefore(curStart, curEnd) ? curStart\n : curEnd);\n updateMark(cm, vim, '>', cursorIsBefore(curStart, curEnd) ? curEnd\n : curStart);\n },\n reselectLastSelection: function(cm, _actionArgs, vim) {\n if (vim.lastSelection) {\n var lastSelection = vim.lastSelection;\n cm.setSelection(lastSelection.curStart, lastSelection.curEnd);\n if (lastSelection.visualLine) {\n vim.visualMode = true;\n vim.visualLine = true;\n }\n else {\n vim.visualMode = true;\n vim.visualLine = false;\n }\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : \"\"});\n }\n },\n joinLines: function(cm, actionArgs, vim) {\n var curStart, curEnd;\n if (vim.visualMode) {\n curStart = cm.getCursor('anchor');\n curEnd = cm.getCursor('head');\n curEnd.ch = lineLength(cm, curEnd.line) - 1;\n } else {\n // Repeat is the number of lines to join. Minimum 2 lines.\n var repeat = Math.max(actionArgs.repeat, 2);\n curStart = cm.getCursor();\n curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1,\n Infinity));\n }\n var finalCh = 0;\n cm.operation(function() {\n for (var i = curStart.line; i < curEnd.line; i++) {\n finalCh = lineLength(cm, curStart.line);\n var tmp = Pos(curStart.line + 1,\n lineLength(cm, curStart.line + 1));\n var text = cm.getRange(curStart, tmp);\n text = text.replace(/\\n\\s*/g, ' ');\n cm.replaceRange(text, curStart, tmp);\n }\n var curFinalPos = Pos(curStart.line, finalCh);\n cm.setCursor(curFinalPos);\n });\n },\n newLineAndEnterInsertMode: function(cm, actionArgs, vim) {\n vim.insertMode = true;\n var insertAt = copyCursor(cm.getCursor());\n if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n // Special case for inserting newline before start of document.\n cm.replaceRange('\\n', Pos(cm.firstLine(), 0));\n cm.setCursor(cm.firstLine(), 0);\n } else {\n insertAt.line = (actionArgs.after) ? insertAt.line :\n insertAt.line - 1;\n insertAt.ch = lineLength(cm, insertAt.line);\n cm.setCursor(insertAt);\n var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n CodeMirror.commands.newlineAndIndent;\n newlineFn(cm);\n }\n this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n },\n paste: function(cm, actionArgs) {\n var cur = copyCursor(cm.getCursor());\n var register = vimGlobalState.registerController.getRegister(\n actionArgs.registerName);\n var text = register.toString();\n if (!text) {\n return;\n }\n if (actionArgs.matchIndent) {\n // length that considers tabs and cm.options.tabSize\n var whitespaceLength = function(str) {\n var tabs = (str.split(\"\\t\").length - 1);\n var spaces = (str.split(\" \").length - 1);\n return tabs * cm.options.tabSize + spaces * 1;\n };\n var currentLine = cm.getLine(cm.getCursor().line);\n var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n // chomp last newline b/c don't want it to match /^\\s*/gm\n var chompedText = text.replace(/\\n$/, '');\n var wasChomped = text !== chompedText;\n var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n var text = chompedText.replace(/^\\s*/gm, function(wspace) {\n var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n if (newIndent < 0) {\n return \"\";\n }\n else if (cm.options.indentWithTabs) {\n var quotient = Math.floor(newIndent / cm.options.tabSize);\n return Array(quotient + 1).join('\\t');\n }\n else {\n return Array(newIndent + 1).join(' ');\n }\n });\n text += wasChomped ? \"\\n\" : \"\";\n }\n if (actionArgs.repeat > 1) {\n var text = Array(actionArgs.repeat + 1).join(text);\n }\n var linewise = register.linewise;\n if (linewise) {\n if (actionArgs.after) {\n // Move the newline at the end to the start instead, and paste just\n // before the newline character of the line we are on right now.\n text = '\\n' + text.slice(0, text.length - 1);\n cur.ch = lineLength(cm, cur.line);\n } else {\n cur.ch = 0;\n }\n } else {\n cur.ch += actionArgs.after ? 1 : 0;\n }\n cm.replaceRange(text, cur);\n // Now fine tune the cursor to where we want it.\n var curPosFinal;\n var idx;\n if (linewise && actionArgs.after) {\n curPosFinal = Pos(\n cur.line + 1,\n findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));\n } else if (linewise && !actionArgs.after) {\n curPosFinal = Pos(\n cur.line,\n findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));\n } else if (!linewise && actionArgs.after) {\n idx = cm.indexFromPos(cur);\n curPosFinal = cm.posFromIndex(idx + text.length - 1);\n } else {\n idx = cm.indexFromPos(cur);\n curPosFinal = cm.posFromIndex(idx + text.length);\n }\n cm.setCursor(curPosFinal);\n },\n undo: function(cm, actionArgs) {\n cm.operation(function() {\n repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n cm.setCursor(cm.getCursor('anchor'));\n });\n },\n redo: function(cm, actionArgs) {\n repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n },\n setRegister: function(_cm, actionArgs, vim) {\n vim.inputState.registerName = actionArgs.selectedCharacter;\n },\n setMark: function(cm, actionArgs, vim) {\n var markName = actionArgs.selectedCharacter;\n updateMark(cm, vim, markName, cm.getCursor());\n },\n replace: function(cm, actionArgs, vim) {\n var replaceWith = actionArgs.selectedCharacter;\n var curStart = cm.getCursor();\n var replaceTo;\n var curEnd;\n if (vim.visualMode){\n curStart=cm.getCursor('start');\n curEnd=cm.getCursor('end');\n // workaround to catch the character under the cursor\n // existing workaround doesn't cover actions\n curEnd=cm.clipPos(Pos(curEnd.line, curEnd.ch+1));\n }else{\n var line = cm.getLine(curStart.line);\n replaceTo = curStart.ch + actionArgs.repeat;\n if (replaceTo > line.length) {\n replaceTo=line.length;\n }\n curEnd = Pos(curStart.line, replaceTo);\n }\n if (replaceWith=='\\n'){\n if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);\n // special case, where vim help says to replace by just one line-break\n (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n }else {\n var replaceWithStr=cm.getRange(curStart, curEnd);\n //replace all characters in range by selected, but keep linebreaks\n replaceWithStr=replaceWithStr.replace(/[^\\n]/g,replaceWith);\n cm.replaceRange(replaceWithStr, curStart, curEnd);\n if (vim.visualMode){\n cm.setCursor(curStart);\n exitVisualMode(cm);\n }else{\n cm.setCursor(offsetCursor(curEnd, 0, -1));\n }\n }\n },\n incrementNumberToken: function(cm, actionArgs) {\n var cur = cm.getCursor();\n var lineStr = cm.getLine(cur.line);\n var re = /-?\\d+/g;\n var match;\n var start;\n var end;\n var numberStr;\n var token;\n while ((match = re.exec(lineStr)) !== null) {\n token = match[0];\n start = match.index;\n end = start + token.length;\n if (cur.ch < end)break;\n }\n if (!actionArgs.backtrack && (end <= cur.ch))return;\n if (token) {\n var increment = actionArgs.increase ? 1 : -1;\n var number = parseInt(token) + (increment * actionArgs.repeat);\n var from = Pos(cur.line, start);\n var to = Pos(cur.line, end);\n numberStr = number.toString();\n cm.replaceRange(numberStr, from, to);\n } else {\n return;\n }\n cm.setCursor(Pos(cur.line, start + numberStr.length - 1));\n },\n repeatLastEdit: function(cm, actionArgs, vim) {\n var lastEditInputState = vim.lastEditInputState;\n if (!lastEditInputState) { return; }\n var repeat = actionArgs.repeat;\n if (repeat && actionArgs.repeatIsExplicit) {\n vim.lastEditInputState.repeatOverride = repeat;\n } else {\n repeat = vim.lastEditInputState.repeatOverride || repeat;\n }\n repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n },\n changeCase: function(cm, actionArgs, vim) {\n var selectedAreaRange = getSelectedAreaRange(cm, vim);\n var selectionStart = selectedAreaRange[0];\n var selectionEnd = selectedAreaRange[1];\n var toLower = actionArgs.toLower;\n if (cursorIsBefore(selectionEnd, selectionStart)) {\n var tmp = selectionStart;\n selectionStart = selectionEnd;\n selectionEnd = tmp;\n } else {\n selectionEnd = cm.clipPos(Pos(selectionEnd.line, selectionEnd.ch+1));\n }\n var text = cm.getRange(selectionStart, selectionEnd);\n cm.replaceRange(toLower ? text.toLowerCase() : text.toUpperCase(), selectionStart, selectionEnd);\n cm.setCursor(selectionStart);\n }\n };\n\n /*\n * Below are miscellaneous utility functions used by vim.js\n */\n\n /**\n * Clips cursor to ensure that line is within the buffer's range\n * If includeLineBreak is true, then allow cur.ch == lineLength.\n */\n function clipCursorToContent(cm, cur, includeLineBreak) {\n var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );\n var maxCh = lineLength(cm, line) - 1;\n maxCh = (includeLineBreak) ? maxCh + 1 : maxCh;\n var ch = Math.min(Math.max(0, cur.ch), maxCh);\n return Pos(line, ch);\n }\n function copyArgs(args) {\n var ret = {};\n for (var prop in args) {\n if (args.hasOwnProperty(prop)) {\n ret[prop] = args[prop];\n }\n }\n return ret;\n }\n function offsetCursor(cur, offsetLine, offsetCh) {\n return Pos(cur.line + offsetLine, cur.ch + offsetCh);\n }\n function matchKeysPartial(pressed, mapped) {\n for (var i = 0; i < pressed.length; i++) {\n // 'character' means any character. For mark, register commads, etc.\n if (pressed[i] != mapped[i] && mapped[i] != 'character') {\n return false;\n }\n }\n return true;\n }\n function repeatFn(cm, fn, repeat) {\n return function() {\n for (var i = 0; i < repeat; i++) {\n fn(cm);\n }\n };\n }\n function copyCursor(cur) {\n return Pos(cur.line, cur.ch);\n }\n function cursorEqual(cur1, cur2) {\n return cur1.ch == cur2.ch && cur1.line == cur2.line;\n }\n function cursorIsBefore(cur1, cur2) {\n if (cur1.line < cur2.line) {\n return true;\n }\n if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n return true;\n }\n return false;\n }\n function cusrorIsBetween(cur1, cur2, cur3) {\n // returns true if cur2 is between cur1 and cur3.\n var cur1before2 = cursorIsBefore(cur1, cur2);\n var cur2before3 = cursorIsBefore(cur2, cur3);\n return cur1before2 && cur2before3;\n }\n function lineLength(cm, lineNum) {\n return cm.getLine(lineNum).length;\n }\n function reverse(s){\n return s.split('').reverse().join('');\n }\n function trim(s) {\n if (s.trim) {\n return s.trim();\n }\n return s.replace(/^\\s+|\\s+$/g, '');\n }\n function escapeRegex(s) {\n return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n }\n function getSelectedAreaRange(cm, vim) {\n var selectionStart = cm.getCursor('anchor');\n var selectionEnd = cm.getCursor('head');\n var lastSelection = vim.lastSelection;\n if (!vim.visualMode) {\n var line = lastSelection.curEnd.line - lastSelection.curStart.line;\n var ch = line ? lastSelection.curEnd.ch : lastSelection.curEnd.ch - lastSelection.curStart.ch;\n selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch};\n if (lastSelection.visualLine) {\n return [{line: selectionStart.line, ch: 0}, {line: selectionEnd.line, ch: lineLength(cm, selectionEnd.line)}];\n }\n } else {\n exitVisualMode(cm);\n }\n return [selectionStart, selectionEnd];\n }\n\n function exitVisualMode(cm) {\n cm.off('mousedown', exitVisualMode);\n var vim = cm.state.vim;\n // can't use selection state here because yank has already reset its cursor\n vim.lastSelection = {'curStart': vim.marks['<'].find(),\n 'curEnd': vim.marks['>'].find(), 'visualMode': vim.visualMode,\n 'visualLine': vim.visualLine};\n vim.visualMode = false;\n vim.visualLine = false;\n var selectionStart = cm.getCursor('anchor');\n var selectionEnd = cm.getCursor('head');\n if (!cursorEqual(selectionStart, selectionEnd)) {\n // Clear the selection and set the cursor only if the selection has not\n // already been cleared. Otherwise we risk moving the cursor somewhere\n // it's not supposed to be.\n cm.setCursor(clipCursorToContent(cm, selectionEnd));\n }\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n }\n\n // Remove any trailing newlines from the selection. For\n // example, with the caret at the start of the last word on the line,\n // 'dw' should word, but not the newline, while 'w' should advance the\n // caret to the first character of the next line.\n function clipToLine(cm, curStart, curEnd) {\n var selection = cm.getRange(curStart, curEnd);\n // Only clip if the selection ends with trailing newline + whitespace\n if (/\\n\\s*$/.test(selection)) {\n var lines = selection.split('\\n');\n // We know this is all whitepsace.\n lines.pop();\n\n // Cases:\n // 1. Last word is an empty line - do not clip the trailing '\\n'\n // 2. Last word is not an empty line - clip the trailing '\\n'\n var line;\n // Find the line containing the last word, and clip all whitespace up\n // to it.\n for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n curEnd.line--;\n curEnd.ch = 0;\n }\n // If the last word is not an empty line, clip an additional newline\n if (line) {\n curEnd.line--;\n curEnd.ch = lineLength(cm, curEnd.line);\n } else {\n curEnd.ch = 0;\n }\n }\n }\n\n // Expand the selection to line ends.\n function expandSelectionToLine(_cm, curStart, curEnd) {\n curStart.ch = 0;\n curEnd.ch = 0;\n curEnd.line++;\n }\n\n function findFirstNonWhiteSpaceCharacter(text) {\n if (!text) {\n return 0;\n }\n var firstNonWS = text.search(/\\S/);\n return firstNonWS == -1 ? text.length : firstNonWS;\n }\n\n function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) {\n var cur = cm.getCursor();\n var line = cm.getLine(cur.line);\n var idx = cur.ch;\n\n // Seek to first word or non-whitespace character, depending on if\n // noSymbol is true.\n var textAfterIdx = line.substring(idx);\n var firstMatchedChar;\n if (noSymbol) {\n firstMatchedChar = textAfterIdx.search(/\\w/);\n } else {\n firstMatchedChar = textAfterIdx.search(/\\S/);\n }\n if (firstMatchedChar == -1) {\n return null;\n }\n idx += firstMatchedChar;\n textAfterIdx = line.substring(idx);\n var textBeforeIdx = line.substring(0, idx);\n\n var matchRegex;\n // Greedy matchers for the \"word\" we are trying to expand.\n if (bigWord) {\n matchRegex = /^\\S+/;\n } else {\n if ((/\\w/).test(line.charAt(idx))) {\n matchRegex = /^\\w+/;\n } else {\n matchRegex = /^[^\\w\\s]+/;\n }\n }\n\n var wordAfterRegex = matchRegex.exec(textAfterIdx);\n var wordStart = idx;\n var wordEnd = idx + wordAfterRegex[0].length;\n // TODO: Find a better way to do this. It will be slow on very long lines.\n var revTextBeforeIdx = reverse(textBeforeIdx);\n var wordBeforeRegex = matchRegex.exec(revTextBeforeIdx);\n if (wordBeforeRegex) {\n wordStart -= wordBeforeRegex[0].length;\n }\n\n if (inclusive) {\n // If present, trim all whitespace after word.\n // Otherwise, trim all whitespace before word.\n var textAfterWordEnd = line.substring(wordEnd);\n var whitespacesAfterWord = textAfterWordEnd.match(/^\\s*/)[0].length;\n if (whitespacesAfterWord > 0) {\n wordEnd += whitespacesAfterWord;\n } else {\n var revTrim = revTextBeforeIdx.length - wordStart;\n var textBeforeWordStart = revTextBeforeIdx.substring(revTrim);\n var whitespacesBeforeWord = textBeforeWordStart.match(/^\\s*/)[0].length;\n wordStart -= whitespacesBeforeWord;\n }\n }\n\n return { start: Pos(cur.line, wordStart),\n end: Pos(cur.line, wordEnd) };\n }\n\n function recordJumpPosition(cm, oldCur, newCur) {\n if (!cursorEqual(oldCur, newCur)) {\n vimGlobalState.jumpList.add(cm, oldCur, newCur);\n }\n }\n\n function recordLastCharacterSearch(increment, args) {\n vimGlobalState.lastChararacterSearch.increment = increment;\n vimGlobalState.lastChararacterSearch.forward = args.forward;\n vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;\n }\n\n var symbolToMode = {\n '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n '[': 'section', ']': 'section',\n '*': 'comment', '/': 'comment',\n 'm': 'method', 'M': 'method',\n '#': 'preprocess'\n };\n var findSymbolModes = {\n bracket: {\n isComplete: function(state) {\n if (state.nextCh === state.symb) {\n state.depth++;\n if (state.depth >= 1)return true;\n } else if (state.nextCh === state.reverseSymb) {\n state.depth--;\n }\n return false;\n }\n },\n section: {\n init: function(state) {\n state.curMoveThrough = true;\n state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n },\n isComplete: function(state) {\n return state.index === 0 && state.nextCh === state.symb;\n }\n },\n comment: {\n isComplete: function(state) {\n var found = state.lastCh === '*' && state.nextCh === '/';\n state.lastCh = state.nextCh;\n return found;\n }\n },\n // TODO: The original Vim implementation only operates on level 1 and 2.\n // The current implementation doesn't check for code block level and\n // therefore it operates on any levels.\n method: {\n init: function(state) {\n state.symb = (state.symb === 'm' ? '{' : '}');\n state.reverseSymb = state.symb === '{' ? '}' : '{';\n },\n isComplete: function(state) {\n if (state.nextCh === state.symb)return true;\n return false;\n }\n },\n preprocess: {\n init: function(state) {\n state.index = 0;\n },\n isComplete: function(state) {\n if (state.nextCh === '#') {\n var token = state.lineText.match(/#(\\w+)/)[1];\n if (token === 'endif') {\n if (state.forward && state.depth === 0) {\n return true;\n }\n state.depth++;\n } else if (token === 'if') {\n if (!state.forward && state.depth === 0) {\n return true;\n }\n state.depth--;\n }\n if (token === 'else' && state.depth === 0)return true;\n }\n return false;\n }\n }\n };\n function findSymbol(cm, repeat, forward, symb) {\n var cur = copyCursor(cm.getCursor());\n var increment = forward ? 1 : -1;\n var endLine = forward ? cm.lineCount() : -1;\n var curCh = cur.ch;\n var line = cur.line;\n var lineText = cm.getLine(line);\n var state = {\n lineText: lineText,\n nextCh: lineText.charAt(curCh),\n lastCh: null,\n index: curCh,\n symb: symb,\n reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n forward: forward,\n depth: 0,\n curMoveThrough: false\n };\n var mode = symbolToMode[symb];\n if (!mode)return cur;\n var init = findSymbolModes[mode].init;\n var isComplete = findSymbolModes[mode].isComplete;\n if (init) { init(state); }\n while (line !== endLine && repeat) {\n state.index += increment;\n state.nextCh = state.lineText.charAt(state.index);\n if (!state.nextCh) {\n line += increment;\n state.lineText = cm.getLine(line) || '';\n if (increment > 0) {\n state.index = 0;\n } else {\n var lineLen = state.lineText.length;\n state.index = (lineLen > 0) ? (lineLen-1) : 0;\n }\n state.nextCh = state.lineText.charAt(state.index);\n }\n if (isComplete(state)) {\n cur.line = line;\n cur.ch = state.index;\n repeat--;\n }\n }\n if (state.nextCh || state.curMoveThrough) {\n return Pos(line, state.index);\n }\n return cur;\n }\n\n /*\n * Returns the boundaries of the next word. If the cursor in the middle of\n * the word, then returns the boundaries of the current word, starting at\n * the cursor. If the cursor is at the start/end of a word, and we are going\n * forward/backward, respectively, find the boundaries of the next word.\n *\n * @param {CodeMirror} cm CodeMirror object.\n * @param {Cursor} cur The cursor position.\n * @param {boolean} forward True to search forward. False to search\n * backward.\n * @param {boolean} bigWord True if punctuation count as part of the word.\n * False if only [a-zA-Z0-9] characters count as part of the word.\n * @param {boolean} emptyLineIsWord True if empty lines should be treated\n * as words.\n * @return {Object{from:number, to:number, line: number}} The boundaries of\n * the word, or null if there are no more words.\n */\n function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n var lineNum = cur.line;\n var pos = cur.ch;\n var line = cm.getLine(lineNum);\n var dir = forward ? 1 : -1;\n var regexps = bigWord ? bigWordRegexp : wordRegexp;\n\n if (emptyLineIsWord && line == '') {\n lineNum += dir;\n line = cm.getLine(lineNum);\n if (!isLine(cm, lineNum)) {\n return null;\n }\n pos = (forward) ? 0 : line.length;\n }\n\n while (true) {\n if (emptyLineIsWord && line == '') {\n return { from: 0, to: 0, line: lineNum };\n }\n var stop = (dir > 0) ? line.length : -1;\n var wordStart = stop, wordEnd = stop;\n // Find bounds of next word.\n while (pos != stop) {\n var foundWord = false;\n for (var i = 0; i < regexps.length && !foundWord; ++i) {\n if (regexps[i].test(line.charAt(pos))) {\n wordStart = pos;\n // Advance to end of word.\n while (pos != stop && regexps[i].test(line.charAt(pos))) {\n pos += dir;\n }\n wordEnd = pos;\n foundWord = wordStart != wordEnd;\n if (wordStart == cur.ch && lineNum == cur.line &&\n wordEnd == wordStart + dir) {\n // We started at the end of a word. Find the next one.\n continue;\n } else {\n return {\n from: Math.min(wordStart, wordEnd + 1),\n to: Math.max(wordStart, wordEnd),\n line: lineNum };\n }\n }\n }\n if (!foundWord) {\n pos += dir;\n }\n }\n // Advance to next/prev line.\n lineNum += dir;\n if (!isLine(cm, lineNum)) {\n return null;\n }\n line = cm.getLine(lineNum);\n pos = (dir > 0) ? 0 : line.length;\n }\n // Should never get here.\n throw new Error('The impossible happened.');\n }\n\n /**\n * @param {CodeMirror} cm CodeMirror object.\n * @param {int} repeat Number of words to move past.\n * @param {boolean} forward True to search forward. False to search\n * backward.\n * @param {boolean} wordEnd True to move to end of word. False to move to\n * beginning of word.\n * @param {boolean} bigWord True if punctuation count as part of the word.\n * False if only alphabet characters count as part of the word.\n * @return {Cursor} The position the cursor should move to.\n */\n function moveToWord(cm, repeat, forward, wordEnd, bigWord) {\n var cur = cm.getCursor();\n var curStart = copyCursor(cur);\n var words = [];\n if (forward && !wordEnd || !forward && wordEnd) {\n repeat++;\n }\n // For 'e', empty lines are not considered words, go figure.\n var emptyLineIsWord = !(forward && wordEnd);\n for (var i = 0; i < repeat; i++) {\n var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n if (!word) {\n var eodCh = lineLength(cm, cm.lastLine());\n words.push(forward\n ? {line: cm.lastLine(), from: eodCh, to: eodCh}\n : {line: 0, from: 0, to: 0});\n break;\n }\n words.push(word);\n cur = Pos(word.line, forward ? (word.to - 1) : word.from);\n }\n var shortCircuit = words.length != repeat;\n var firstWord = words[0];\n var lastWord = words.pop();\n if (forward && !wordEnd) {\n // w\n if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n // We did not start in the middle of a word. Discard the extra word at the end.\n lastWord = words.pop();\n }\n return Pos(lastWord.line, lastWord.from);\n } else if (forward && wordEnd) {\n return Pos(lastWord.line, lastWord.to - 1);\n } else if (!forward && wordEnd) {\n // ge\n if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n // We did not start in the middle of a word. Discard the extra word at the end.\n lastWord = words.pop();\n }\n return Pos(lastWord.line, lastWord.to);\n } else {\n // b\n return Pos(lastWord.line, lastWord.from);\n }\n }\n\n function moveToCharacter(cm, repeat, forward, character) {\n var cur = cm.getCursor();\n var start = cur.ch;\n var idx;\n for (var i = 0; i < repeat; i ++) {\n var line = cm.getLine(cur.line);\n idx = charIdxInLine(start, line, character, forward, true);\n if (idx == -1) {\n return null;\n }\n start = idx;\n }\n return Pos(cm.getCursor().line, idx);\n }\n\n function moveToColumn(cm, repeat) {\n // repeat is always >= 1, so repeat - 1 always corresponds\n // to the column we want to go to.\n var line = cm.getCursor().line;\n return clipCursorToContent(cm, Pos(line, repeat - 1));\n }\n\n function updateMark(cm, vim, markName, pos) {\n if (!inArray(markName, validMarks)) {\n return;\n }\n if (vim.marks[markName]) {\n vim.marks[markName].clear();\n }\n vim.marks[markName] = cm.setBookmark(pos);\n }\n\n function charIdxInLine(start, line, character, forward, includeChar) {\n // Search for char in line.\n // motion_options: {forward, includeChar}\n // If includeChar = true, include it too.\n // If forward = true, search forward, else search backwards.\n // If char is not found on this line, do nothing\n var idx;\n if (forward) {\n idx = line.indexOf(character, start + 1);\n if (idx != -1 && !includeChar) {\n idx -= 1;\n }\n } else {\n idx = line.lastIndexOf(character, start - 1);\n if (idx != -1 && !includeChar) {\n idx += 1;\n }\n }\n return idx;\n }\n\n // TODO: perhaps this finagling of start and end positions belonds\n // in codmirror/replaceRange?\n function selectCompanionObject(cm, symb, inclusive) {\n var cur = cm.getCursor(), start, end;\n\n var bracketRegexp = ({\n '(': /[()]/, ')': /[()]/,\n '[': /[[\\]]/, ']': /[[\\]]/,\n '{': /[{}]/, '}': /[{}]/})[symb];\n var openSym = ({\n '(': '(', ')': '(',\n '[': '[', ']': '[',\n '{': '{', '}': '{'})[symb];\n var curChar = cm.getLine(cur.line).charAt(cur.ch);\n // Due to the behavior of scanForBracket, we need to add an offset if the\n // cursor is on a matching open bracket.\n var offset = curChar === openSym ? 1 : 0;\n\n start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp});\n end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp});\n\n if (!start || !end) {\n return { start: cur, end: cur };\n }\n\n start = start.pos;\n end = end.pos;\n\n if ((start.line == end.line && start.ch > end.ch)\n || (start.line > end.line)) {\n var tmp = start;\n start = end;\n end = tmp;\n }\n\n if (inclusive) {\n end.ch += 1;\n } else {\n start.ch += 1;\n }\n\n return { start: start, end: end };\n }\n\n // Takes in a symbol and a cursor and tries to simulate text objects that\n // have identical opening and closing symbols\n // TODO support across multiple lines\n function findBeginningAndEnd(cm, symb, inclusive) {\n var cur = copyCursor(cm.getCursor());\n var line = cm.getLine(cur.line);\n var chars = line.split('');\n var start, end, i, len;\n var firstIndex = chars.indexOf(symb);\n\n // the decision tree is to always look backwards for the beginning first,\n // but if the cursor is in front of the first instance of the symb,\n // then move the cursor forward\n if (cur.ch < firstIndex) {\n cur.ch = firstIndex;\n // Why is this line even here???\n // cm.setCursor(cur.line, firstIndex+1);\n }\n // otherwise if the cursor is currently on the closing symbol\n else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n end = cur.ch; // assign end to the current cursor\n --cur.ch; // make sure to look backwards\n }\n\n // if we're currently on the symbol, we've got a start\n if (chars[cur.ch] == symb && !end) {\n start = cur.ch + 1; // assign start to ahead of the cursor\n } else {\n // go backwards to find the start\n for (i = cur.ch; i > -1 && !start; i--) {\n if (chars[i] == symb) {\n start = i + 1;\n }\n }\n }\n\n // look forwards for the end symbol\n if (start && !end) {\n for (i = start, len = chars.length; i < len && !end; i++) {\n if (chars[i] == symb) {\n end = i;\n }\n }\n }\n\n // nothing found\n if (!start || !end) {\n return { start: cur, end: cur };\n }\n\n // include the symbols\n if (inclusive) {\n --start; ++end;\n }\n\n return {\n start: Pos(cur.line, start),\n end: Pos(cur.line, end)\n };\n }\n\n // Search functions\n defineOption('pcre', true, 'boolean');\n function SearchState() {}\n SearchState.prototype = {\n getQuery: function() {\n return vimGlobalState.query;\n },\n setQuery: function(query) {\n vimGlobalState.query = query;\n },\n getOverlay: function() {\n return this.searchOverlay;\n },\n setOverlay: function(overlay) {\n this.searchOverlay = overlay;\n },\n isReversed: function() {\n return vimGlobalState.isReversed;\n },\n setReversed: function(reversed) {\n vimGlobalState.isReversed = reversed;\n }\n };\n function getSearchState(cm) {\n var vim = cm.state.vim;\n return vim.searchState_ || (vim.searchState_ = new SearchState());\n }\n function dialog(cm, template, shortText, onClose, options) {\n if (cm.openDialog) {\n cm.openDialog(template, onClose, { bottom: true, value: options.value,\n onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp });\n }\n else {\n onClose(prompt(shortText, ''));\n }\n }\n\n function findUnescapedSlashes(str) {\n var escapeNextChar = false;\n var slashes = [];\n for (var i = 0; i < str.length; i++) {\n var c = str.charAt(i);\n if (!escapeNextChar && c == '/') {\n slashes.push(i);\n }\n escapeNextChar = !escapeNextChar && (c == '\\\\');\n }\n return slashes;\n }\n\n // Translates a search string from ex (vim) syntax into javascript form.\n function translateRegex(str) {\n // When these match, add a '\\' if unescaped or remove one if escaped.\n var specials = '|(){';\n // Remove, but never add, a '\\' for these.\n var unescape = '}';\n var escapeNextChar = false;\n var out = [];\n for (var i = -1; i < str.length; i++) {\n var c = str.charAt(i) || '';\n var n = str.charAt(i+1) || '';\n var specialComesNext = (n && specials.indexOf(n) != -1);\n if (escapeNextChar) {\n if (c !== '\\\\' || !specialComesNext) {\n out.push(c);\n }\n escapeNextChar = false;\n } else {\n if (c === '\\\\') {\n escapeNextChar = true;\n // Treat the unescape list as special for removing, but not adding '\\'.\n if (n && unescape.indexOf(n) != -1) {\n specialComesNext = true;\n }\n // Not passing this test means removing a '\\'.\n if (!specialComesNext || n === '\\\\') {\n out.push(c);\n }\n } else {\n out.push(c);\n if (specialComesNext && n !== '\\\\') {\n out.push('\\\\');\n }\n }\n }\n }\n return out.join('');\n }\n\n // Translates the replace part of a search and replace from ex (vim) syntax into\n // javascript form. Similar to translateRegex, but additionally fixes back references\n // (translates '\\[0..9]' to '$[0..9]') and follows different rules for escaping '$'.\n function translateRegexReplace(str) {\n var escapeNextChar = false;\n var out = [];\n for (var i = -1; i < str.length; i++) {\n var c = str.charAt(i) || '';\n var n = str.charAt(i+1) || '';\n if (escapeNextChar) {\n // At any point in the loop, escapeNextChar is true if the previous\n // character was a '\\' and was not escaped.\n out.push(c);\n escapeNextChar = false;\n } else {\n if (c === '\\\\') {\n escapeNextChar = true;\n if ((isNumber(n) || n === '$')) {\n out.push('$');\n } else if (n !== '/' && n !== '\\\\') {\n out.push('\\\\');\n }\n } else {\n if (c === '$') {\n out.push('$');\n }\n out.push(c);\n if (n === '/') {\n out.push('\\\\');\n }\n }\n }\n }\n return out.join('');\n }\n\n // Unescape \\ and / in the replace part, for PCRE mode.\n function unescapeRegexReplace(str) {\n var stream = new CodeMirror.StringStream(str);\n var output = [];\n while (!stream.eol()) {\n // Search for \\.\n while (stream.peek() && stream.peek() != '\\\\') {\n output.push(stream.next());\n }\n if (stream.match('\\\\/', true)) {\n // \\/ => /\n output.push('/');\n } else if (stream.match('\\\\\\\\', true)) {\n // \\\\ => \\\n output.push('\\\\');\n } else {\n // Don't change anything\n output.push(stream.next());\n }\n }\n return output.join('');\n }\n\n /**\n * Extract the regular expression from the query and return a Regexp object.\n * Returns null if the query is blank.\n * If ignoreCase is passed in, the Regexp object will have the 'i' flag set.\n * If smartCase is passed in, and the query contains upper case letters,\n * then ignoreCase is overridden, and the 'i' flag will not be set.\n * If the query contains the /i in the flag part of the regular expression,\n * then both ignoreCase and smartCase are ignored, and 'i' will be passed\n * through to the Regex object.\n */\n function parseQuery(query, ignoreCase, smartCase) {\n // Check if the query is already a regex.\n if (query instanceof RegExp) { return query; }\n // First try to extract regex + flags from the input. If no flags found,\n // extract just the regex. IE does not accept flags directly defined in\n // the regex string in the form /regex/flags\n var slashes = findUnescapedSlashes(query);\n var regexPart;\n var forceIgnoreCase;\n if (!slashes.length) {\n // Query looks like 'regexp'\n regexPart = query;\n } else {\n // Query looks like 'regexp/...'\n regexPart = query.substring(0, slashes[0]);\n var flagsPart = query.substring(slashes[0]);\n forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n }\n if (!regexPart) {\n return null;\n }\n if (!getOption('pcre')) {\n regexPart = translateRegex(regexPart);\n }\n if (smartCase) {\n ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n }\n var regexp = new RegExp(regexPart,\n (ignoreCase || forceIgnoreCase) ? 'i' : undefined);\n return regexp;\n }\n function showConfirm(cm, text) {\n if (cm.openNotification) {\n cm.openNotification('<span style=\"color: red\">' + text + '</span>',\n {bottom: true, duration: 5000});\n } else {\n alert(text);\n }\n }\n function makePrompt(prefix, desc) {\n var raw = '';\n if (prefix) {\n raw += '<span style=\"font-family: monospace\">' + prefix + '</span>';\n }\n raw += '<input type=\"text\"/> ' +\n '<span style=\"color: #888\">';\n if (desc) {\n raw += '<span style=\"color: #888\">';\n raw += desc;\n raw += '</span>';\n }\n return raw;\n }\n var searchPromptDesc = '(Javascript regexp)';\n function showPrompt(cm, options) {\n var shortText = (options.prefix || '') + ' ' + (options.desc || '');\n var prompt = makePrompt(options.prefix, options.desc);\n dialog(cm, prompt, shortText, options.onClose, options);\n }\n function regexEqual(r1, r2) {\n if (r1 instanceof RegExp && r2 instanceof RegExp) {\n var props = ['global', 'multiline', 'ignoreCase', 'source'];\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n if (r1[prop] !== r2[prop]) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n // Returns true if the query is valid.\n function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n if (!rawQuery) {\n return;\n }\n var state = getSearchState(cm);\n var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n if (!query) {\n return;\n }\n highlightSearchMatches(cm, query);\n if (regexEqual(query, state.getQuery())) {\n return query;\n }\n state.setQuery(query);\n return query;\n }\n function searchOverlay(query) {\n if (query.source.charAt(0) == '^') {\n var matchSol = true;\n }\n return {\n token: function(stream) {\n if (matchSol && !stream.sol()) {\n stream.skipToEnd();\n return;\n }\n var match = stream.match(query, false);\n if (match) {\n if (match[0].length == 0) {\n // Matched empty string, skip to next.\n stream.next();\n return 'searching';\n }\n if (!stream.sol()) {\n // Backtrack 1 to match \\b\n stream.backUp(1);\n if (!query.exec(stream.next() + match[0])) {\n stream.next();\n return null;\n }\n }\n stream.match(query);\n return 'searching';\n }\n while (!stream.eol()) {\n stream.next();\n if (stream.match(query, false)) break;\n }\n },\n query: query\n };\n }\n function highlightSearchMatches(cm, query) {\n var overlay = getSearchState(cm).getOverlay();\n if (!overlay || query != overlay.query) {\n if (overlay) {\n cm.removeOverlay(overlay);\n }\n overlay = searchOverlay(query);\n cm.addOverlay(overlay);\n getSearchState(cm).setOverlay(overlay);\n }\n }\n function findNext(cm, prev, query, repeat) {\n if (repeat === undefined) { repeat = 1; }\n return cm.operation(function() {\n var pos = cm.getCursor();\n var cursor = cm.getSearchCursor(query, pos);\n for (var i = 0; i < repeat; i++) {\n var found = cursor.find(prev);\n if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); }\n if (!found) {\n // SearchCursor may have returned null because it hit EOF, wrap\n // around and try again.\n cursor = cm.getSearchCursor(query,\n (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) );\n if (!cursor.find(prev)) {\n return;\n }\n }\n }\n return cursor.from();\n });\n }\n function clearSearchHighlight(cm) {\n cm.removeOverlay(getSearchState(cm).getOverlay());\n getSearchState(cm).setOverlay(null);\n }\n /**\n * Check if pos is in the specified range, INCLUSIVE.\n * Range can be specified with 1 or 2 arguments.\n * If the first range argument is an array, treat it as an array of line\n * numbers. Match pos against any of the lines.\n * If the first range argument is a number,\n * if there is only 1 range argument, check if pos has the same line\n * number\n * if there are 2 range arguments, then check if pos is in between the two\n * range arguments.\n */\n function isInRange(pos, start, end) {\n if (typeof pos != 'number') {\n // Assume it is a cursor position. Get the line number.\n pos = pos.line;\n }\n if (start instanceof Array) {\n return inArray(pos, start);\n } else {\n if (end) {\n return (pos >= start && pos <= end);\n } else {\n return pos == start;\n }\n }\n }\n function getUserVisibleLines(cm) {\n var scrollInfo = cm.getScrollInfo();\n var occludeToleranceTop = 6;\n var occludeToleranceBottom = 10;\n var from = cm.coordsChar({left:0, top: occludeToleranceTop + scrollInfo.top}, 'local');\n var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top;\n var to = cm.coordsChar({left:0, top: bottomY}, 'local');\n return {top: from.line, bottom: to.line};\n }\n\n // Ex command handling\n // Care must be taken when adding to the default Ex command map. For any\n // pair of commands that have a shared prefix, at least one of their\n // shortNames must not match the prefix of the other command.\n var defaultExCommandMap = [\n { name: 'map' },\n { name: 'nmap', shortName: 'nm' },\n { name: 'vmap', shortName: 'vm' },\n { name: 'unmap' },\n { name: 'write', shortName: 'w' },\n { name: 'undo', shortName: 'u' },\n { name: 'redo', shortName: 'red' },\n { name: 'set', shortName: 'set' },\n { name: 'sort', shortName: 'sor' },\n { name: 'substitute', shortName: 's' },\n { name: 'nohlsearch', shortName: 'noh' },\n { name: 'delmarks', shortName: 'delm' },\n { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }\n ];\n Vim.ExCommandDispatcher = function() {\n this.buildCommandMap_();\n };\n Vim.ExCommandDispatcher.prototype = {\n processCommand: function(cm, input) {\n var vim = cm.state.vim;\n var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n var previousCommand = commandHistoryRegister.toString();\n if (vim.visualMode) {\n exitVisualMode(cm);\n }\n var inputStream = new CodeMirror.StringStream(input);\n // update \": with the latest command whether valid or invalid\n commandHistoryRegister.setText(input);\n var params = {};\n params.input = input;\n try {\n this.parseInput_(cm, inputStream, params);\n } catch(e) {\n showConfirm(cm, e);\n throw e;\n }\n var commandName;\n if (!params.commandName) {\n // If only a line range is defined, move to the line.\n if (params.line !== undefined) {\n commandName = 'move';\n }\n } else {\n var command = this.matchCommand_(params.commandName);\n if (command) {\n commandName = command.name;\n if (command.excludeFromCommandHistory) {\n commandHistoryRegister.setText(previousCommand);\n }\n this.parseCommandArgs_(inputStream, params, command);\n if (command.type == 'exToKey') {\n // Handle Ex to Key mapping.\n for (var i = 0; i < command.toKeys.length; i++) {\n CodeMirror.Vim.handleKey(cm, command.toKeys[i]);\n }\n return;\n } else if (command.type == 'exToEx') {\n // Handle Ex to Ex mapping.\n this.processCommand(cm, command.toInput);\n return;\n }\n }\n }\n if (!commandName) {\n showConfirm(cm, 'Not an editor command \":' + input + '\"');\n return;\n }\n try {\n exCommands[commandName](cm, params);\n } catch(e) {\n showConfirm(cm, e);\n throw e;\n }\n },\n parseInput_: function(cm, inputStream, result) {\n inputStream.eatWhile(':');\n // Parse range.\n if (inputStream.eat('%')) {\n result.line = cm.firstLine();\n result.lineEnd = cm.lastLine();\n } else {\n result.line = this.parseLineSpec_(cm, inputStream);\n if (result.line !== undefined && inputStream.eat(',')) {\n result.lineEnd = this.parseLineSpec_(cm, inputStream);\n }\n }\n\n // Parse command name.\n var commandMatch = inputStream.match(/^(\\w+)/);\n if (commandMatch) {\n result.commandName = commandMatch[1];\n } else {\n result.commandName = inputStream.match(/.*/)[0];\n }\n\n return result;\n },\n parseLineSpec_: function(cm, inputStream) {\n var numberMatch = inputStream.match(/^(\\d+)/);\n if (numberMatch) {\n return parseInt(numberMatch[1], 10) - 1;\n }\n switch (inputStream.next()) {\n case '.':\n return cm.getCursor().line;\n case '$':\n return cm.lastLine();\n case '\\'':\n var mark = cm.state.vim.marks[inputStream.next()];\n if (mark && mark.find()) {\n return mark.find().line;\n }\n throw new Error('Mark not set');\n default:\n inputStream.backUp(1);\n return undefined;\n }\n },\n parseCommandArgs_: function(inputStream, params, command) {\n if (inputStream.eol()) {\n return;\n }\n params.argString = inputStream.match(/.*/)[0];\n // Parse command-line arguments\n var delim = command.argDelimiter || /\\s+/;\n var args = trim(params.argString).split(delim);\n if (args.length && args[0]) {\n params.args = args;\n }\n },\n matchCommand_: function(commandName) {\n // Return the command in the command map that matches the shortest\n // prefix of the passed in command name. The match is guaranteed to be\n // unambiguous if the defaultExCommandMap's shortNames are set up\n // correctly. (see @code{defaultExCommandMap}).\n for (var i = commandName.length; i > 0; i--) {\n var prefix = commandName.substring(0, i);\n if (this.commandMap_[prefix]) {\n var command = this.commandMap_[prefix];\n if (command.name.indexOf(commandName) === 0) {\n return command;\n }\n }\n }\n return null;\n },\n buildCommandMap_: function() {\n this.commandMap_ = {};\n for (var i = 0; i < defaultExCommandMap.length; i++) {\n var command = defaultExCommandMap[i];\n var key = command.shortName || command.name;\n this.commandMap_[key] = command;\n }\n },\n map: function(lhs, rhs, ctx) {\n if (lhs != ':' && lhs.charAt(0) == ':') {\n if (ctx) { throw Error('Mode not supported for ex mappings'); }\n var commandName = lhs.substring(1);\n if (rhs != ':' && rhs.charAt(0) == ':') {\n // Ex to Ex mapping\n this.commandMap_[commandName] = {\n name: commandName,\n type: 'exToEx',\n toInput: rhs.substring(1),\n user: true\n };\n } else {\n // Ex to key mapping\n this.commandMap_[commandName] = {\n name: commandName,\n type: 'exToKey',\n toKeys: parseKeyString(rhs),\n user: true\n };\n }\n } else {\n if (rhs != ':' && rhs.charAt(0) == ':') {\n // Key to Ex mapping.\n var mapping = {\n keys: parseKeyString(lhs),\n type: 'keyToEx',\n exArgs: { input: rhs.substring(1) },\n user: true};\n if (ctx) { mapping.context = ctx; }\n defaultKeymap.unshift(mapping);\n } else {\n // Key to key mapping\n var mapping = {\n keys: parseKeyString(lhs),\n type: 'keyToKey',\n toKeys: parseKeyString(rhs),\n user: true\n };\n if (ctx) { mapping.context = ctx; }\n defaultKeymap.unshift(mapping);\n }\n }\n },\n unmap: function(lhs, ctx) {\n var arrayEquals = function(a, b) {\n if (a === b) return true;\n if (a == null || b == null) return true;\n if (a.length != b.length) return false;\n for (var i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n };\n if (lhs != ':' && lhs.charAt(0) == ':') {\n // Ex to Ex or Ex to key mapping\n if (ctx) { throw Error('Mode not supported for ex mappings'); }\n var commandName = lhs.substring(1);\n if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n delete this.commandMap_[commandName];\n return;\n }\n } else {\n // Key to Ex or key to key mapping\n var keys = parseKeyString(lhs);\n for (var i = 0; i < defaultKeymap.length; i++) {\n if (arrayEquals(keys, defaultKeymap[i].keys)\n && defaultKeymap[i].context === ctx\n && defaultKeymap[i].user) {\n defaultKeymap.splice(i, 1);\n return;\n }\n }\n }\n throw Error('No such mapping.');\n }\n };\n\n // Converts a key string sequence of the form a<C-w>bd<Left> into Vim's\n // keymap representation.\n function parseKeyString(str) {\n var key, match;\n var keys = [];\n while (str) {\n match = (/<\\w+-.+?>|<\\w+>|./).exec(str);\n if (match === null)break;\n key = match[0];\n str = str.substring(match.index + key.length);\n keys.push(key);\n }\n return keys;\n }\n\n var exCommands = {\n map: function(cm, params, ctx) {\n var mapArgs = params.args;\n if (!mapArgs || mapArgs.length < 2) {\n if (cm) {\n showConfirm(cm, 'Invalid mapping: ' + params.input);\n }\n return;\n }\n exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);\n },\n nmap: function(cm, params) { this.map(cm, params, 'normal'); },\n vmap: function(cm, params) { this.map(cm, params, 'visual'); },\n unmap: function(cm, params, ctx) {\n var mapArgs = params.args;\n if (!mapArgs || mapArgs.length < 1) {\n if (cm) {\n showConfirm(cm, 'No such mapping: ' + params.input);\n }\n return;\n }\n exCommandDispatcher.unmap(mapArgs[0], ctx);\n },\n move: function(cm, params) {\n commandDispatcher.processCommand(cm, cm.state.vim, {\n type: 'motion',\n motion: 'moveToLineOrEdgeOfDocument',\n motionArgs: { forward: false, explicitRepeat: true,\n linewise: true },\n repeatOverride: params.line+1});\n },\n set: function(cm, params) {\n var setArgs = params.args;\n if (!setArgs || setArgs.length < 1) {\n if (cm) {\n showConfirm(cm, 'Invalid mapping: ' + params.input);\n }\n return;\n }\n var expr = setArgs[0].split('=');\n var optionName = expr[0];\n var value = expr[1];\n var forceGet = false;\n\n if (optionName.charAt(optionName.length - 1) == '?') {\n // If post-fixed with ?, then the set is actually a get.\n if (value) { throw Error('Trailing characters: ' + params.argString); }\n optionName = optionName.substring(0, optionName.length - 1);\n forceGet = true;\n }\n if (value === undefined && optionName.substring(0, 2) == 'no') {\n // To set boolean options to false, the option name is prefixed with\n // 'no'.\n optionName = optionName.substring(2);\n value = false;\n }\n var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n if (optionIsBoolean && value == undefined) {\n // Calling set with a boolean option sets it to true.\n value = true;\n }\n if (!optionIsBoolean && !value || forceGet) {\n var oldValue = getOption(optionName);\n // If no value is provided, then we assume this is a get.\n if (oldValue === true || oldValue === false) {\n showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n } else {\n showConfirm(cm, ' ' + optionName + '=' + oldValue);\n }\n } else {\n setOption(optionName, value);\n }\n },\n registers: function(cm,params) {\n var regArgs = params.args;\n var registers = vimGlobalState.registerController.registers;\n var regInfo = '----------Registers----------<br><br>';\n if (!regArgs) {\n for (var registerName in registers) {\n var text = registers[registerName].toString();\n if (text.length) {\n regInfo += '\"' + registerName + ' ' + text + '<br>';\n }\n }\n } else {\n var registerName;\n regArgs = regArgs.join('');\n for (var i = 0; i < regArgs.length; i++) {\n registerName = regArgs.charAt(i);\n if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n continue;\n }\n var register = registers[registerName] || new Register();\n regInfo += '\"' + registerName + ' ' + register.toString() + '<br>';\n }\n }\n showConfirm(cm, regInfo);\n },\n sort: function(cm, params) {\n var reverse, ignoreCase, unique, number;\n function parseArgs() {\n if (params.argString) {\n var args = new CodeMirror.StringStream(params.argString);\n if (args.eat('!')) { reverse = true; }\n if (args.eol()) { return; }\n if (!args.eatSpace()) { return 'Invalid arguments'; }\n var opts = args.match(/[a-z]+/);\n if (opts) {\n opts = opts[0];\n ignoreCase = opts.indexOf('i') != -1;\n unique = opts.indexOf('u') != -1;\n var decimal = opts.indexOf('d') != -1 && 1;\n var hex = opts.indexOf('x') != -1 && 1;\n var octal = opts.indexOf('o') != -1 && 1;\n if (decimal + hex + octal > 1) { return 'Invalid arguments'; }\n number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n }\n if (args.eatSpace() && args.match(/\\/.*\\//)) { 'patterns not supported'; }\n }\n }\n var err = parseArgs();\n if (err) {\n showConfirm(cm, err + ': ' + params.argString);\n return;\n }\n var lineStart = params.line || cm.firstLine();\n var lineEnd = params.lineEnd || params.line || cm.lastLine();\n if (lineStart == lineEnd) { return; }\n var curStart = Pos(lineStart, 0);\n var curEnd = Pos(lineEnd, lineLength(cm, lineEnd));\n var text = cm.getRange(curStart, curEnd).split('\\n');\n var numberRegex = (number == 'decimal') ? /(-?)([\\d]+)/ :\n (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n (number == 'octal') ? /([0-7]+)/ : null;\n var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;\n var numPart = [], textPart = [];\n if (number) {\n for (var i = 0; i < text.length; i++) {\n if (numberRegex.exec(text[i])) {\n numPart.push(text[i]);\n } else {\n textPart.push(text[i]);\n }\n }\n } else {\n textPart = text;\n }\n function compareFn(a, b) {\n if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); }\n var anum = number && numberRegex.exec(a);\n var bnum = number && numberRegex.exec(b);\n if (!anum) { return a < b ? -1 : 1; }\n anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix);\n bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);\n return anum - bnum;\n }\n numPart.sort(compareFn);\n textPart.sort(compareFn);\n text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n if (unique) { // Remove duplicate lines\n var textOld = text;\n var lastLine;\n text = [];\n for (var i = 0; i < textOld.length; i++) {\n if (textOld[i] != lastLine) {\n text.push(textOld[i]);\n }\n lastLine = textOld[i];\n }\n }\n cm.replaceRange(text.join('\\n'), curStart, curEnd);\n },\n substitute: function(cm, params) {\n if (!cm.getSearchCursor) {\n throw new Error('Search feature not available. Requires searchcursor.js or ' +\n 'any other getSearchCursor implementation.');\n }\n var argString = params.argString;\n var slashes = argString ? findUnescapedSlashes(argString) : [];\n var replacePart = '';\n if (slashes.length) {\n if (slashes[0] !== 0) {\n showConfirm(cm, 'Substitutions should be of the form ' +\n ':s/pattern/replace/');\n return;\n }\n var regexPart = argString.substring(slashes[0] + 1, slashes[1]);\n var flagsPart;\n var count;\n var confirm = false; // Whether to confirm each replace.\n if (slashes[1]) {\n replacePart = argString.substring(slashes[1] + 1, slashes[2]);\n if (getOption('pcre')) {\n replacePart = unescapeRegexReplace(replacePart);\n } else {\n replacePart = translateRegexReplace(replacePart);\n }\n vimGlobalState.lastSubstituteReplacePart = replacePart;\n }\n if (slashes[2]) {\n // After the 3rd slash, we can have flags followed by a space followed\n // by count.\n var trailing = argString.substring(slashes[2] + 1).split(' ');\n flagsPart = trailing[0];\n count = parseInt(trailing[1]);\n }\n if (flagsPart) {\n if (flagsPart.indexOf('c') != -1) {\n confirm = true;\n flagsPart.replace('c', '');\n }\n regexPart = regexPart + '/' + flagsPart;\n }\n }\n if (regexPart) {\n // If regex part is empty, then use the previous query. Otherwise use\n // the regex part as the new query.\n try {\n updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n true /** smartCase */);\n } catch (e) {\n showConfirm(cm, 'Invalid regex: ' + regexPart);\n return;\n }\n }\n replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n if (replacePart === undefined) {\n showConfirm(cm, 'No previous substitute regular expression');\n return;\n }\n var state = getSearchState(cm);\n var query = state.getQuery();\n var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n var lineEnd = params.lineEnd || lineStart;\n if (count) {\n lineStart = lineEnd;\n lineEnd = lineStart + count - 1;\n }\n var startPos = clipCursorToContent(cm, Pos(lineStart, 0));\n var cursor = cm.getSearchCursor(query, startPos);\n doReplace(cm, confirm, lineStart, lineEnd, cursor, query, replacePart);\n },\n redo: CodeMirror.commands.redo,\n undo: CodeMirror.commands.undo,\n write: function(cm) {\n if (CodeMirror.commands.save) {\n // If a save command is defined, call it.\n CodeMirror.commands.save(cm);\n } else {\n // Saves to text area if no save command is defined.\n cm.save();\n }\n },\n nohlsearch: function(cm) {\n clearSearchHighlight(cm);\n },\n delmarks: function(cm, params) {\n if (!params.argString || !trim(params.argString)) {\n showConfirm(cm, 'Argument required');\n return;\n }\n\n var state = cm.state.vim;\n var stream = new CodeMirror.StringStream(trim(params.argString));\n while (!stream.eol()) {\n stream.eatSpace();\n\n // Record the streams position at the beginning of the loop for use\n // in error messages.\n var count = stream.pos;\n\n if (!stream.match(/[a-zA-Z]/, false)) {\n showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n return;\n }\n\n var sym = stream.next();\n // Check if this symbol is part of a range\n if (stream.match('-', true)) {\n // This symbol is part of a range.\n\n // The range must terminate at an alphabetic character.\n if (!stream.match(/[a-zA-Z]/, false)) {\n showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n return;\n }\n\n var startMark = sym;\n var finishMark = stream.next();\n // The range must terminate at an alphabetic character which\n // shares the same case as the start of the range.\n if (isLowerCase(startMark) && isLowerCase(finishMark) ||\n isUpperCase(startMark) && isUpperCase(finishMark)) {\n var start = startMark.charCodeAt(0);\n var finish = finishMark.charCodeAt(0);\n if (start >= finish) {\n showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n return;\n }\n\n // Because marks are always ASCII values, and we have\n // determined that they are the same case, we can use\n // their char codes to iterate through the defined range.\n for (var j = 0; j <= finish - start; j++) {\n var mark = String.fromCharCode(start + j);\n delete state.marks[mark];\n }\n } else {\n showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n return;\n }\n } else {\n // This symbol is a valid mark, and is not part of a range.\n delete state.marks[sym];\n }\n }\n }\n };\n\n var exCommandDispatcher = new Vim.ExCommandDispatcher();\n\n /**\n * @param {CodeMirror} cm CodeMirror instance we are in.\n * @param {boolean} confirm Whether to confirm each replace.\n * @param {Cursor} lineStart Line to start replacing from.\n * @param {Cursor} lineEnd Line to stop replacing at.\n * @param {RegExp} query Query for performing matches with.\n * @param {string} replaceWith Text to replace matches with. May contain $1,\n * $2, etc for replacing captured groups using Javascript replace.\n */\n function doReplace(cm, confirm, lineStart, lineEnd, searchCursor, query,\n replaceWith) {\n // Set up all the functions.\n cm.state.vim.exMode = true;\n var done = false;\n var lastPos = searchCursor.from();\n function replaceAll() {\n cm.operation(function() {\n while (!done) {\n replace();\n next();\n }\n stop();\n });\n }\n function replace() {\n var text = cm.getRange(searchCursor.from(), searchCursor.to());\n var newText = text.replace(query, replaceWith);\n searchCursor.replace(newText);\n }\n function next() {\n var found = searchCursor.findNext();\n if (!found) {\n done = true;\n } else if (isInRange(searchCursor.from(), lineStart, lineEnd)) {\n cm.scrollIntoView(searchCursor.from(), 30);\n cm.setSelection(searchCursor.from(), searchCursor.to());\n lastPos = searchCursor.from();\n done = false;\n } else {\n done = true;\n }\n }\n function stop(close) {\n if (close) { close(); }\n cm.focus();\n if (lastPos) {\n cm.setCursor(lastPos);\n var vim = cm.state.vim;\n vim.exMode = false;\n vim.lastHPos = vim.lastHSPos = lastPos.ch;\n }\n }\n function onPromptKeyDown(e, _value, close) {\n // Swallow all keys.\n CodeMirror.e_stop(e);\n var keyName = CodeMirror.keyName(e);\n switch (keyName) {\n case 'Y':\n replace(); next(); break;\n case 'N':\n next(); break;\n case 'A':\n cm.operation(replaceAll); break;\n case 'L':\n replace();\n // fall through and exit.\n case 'Q':\n case 'Esc':\n case 'Ctrl-C':\n case 'Ctrl-[':\n stop(close);\n break;\n }\n if (done) { stop(close); }\n }\n\n // Actually do replace.\n next();\n if (done) {\n showConfirm(cm, 'No matches for ' + query.source);\n return;\n }\n if (!confirm) {\n replaceAll();\n return;\n }\n showPrompt(cm, {\n prefix: 'replace with <strong>' + replaceWith + '</strong> (y/n/a/q/l)',\n onKeyDown: onPromptKeyDown\n });\n }\n\n // Register Vim with CodeMirror\n function buildVimKeyMap() {\n /**\n * Handle the raw key event from CodeMirror. Translate the\n * Shift + key modifier to the resulting letter, while preserving other\n * modifers.\n */\n function cmKeyToVimKey(key, modifier) {\n var vimKey = key;\n if (isUpperCase(vimKey) && modifier == 'Ctrl') {\n vimKey = vimKey.toLowerCase();\n }\n if (modifier) {\n // Vim will parse modifier+key combination as a single key.\n vimKey = modifier.charAt(0) + '-' + vimKey;\n }\n var specialKey = ({Enter:'CR',Backspace:'BS',Delete:'Del'})[vimKey];\n vimKey = specialKey ? specialKey : vimKey;\n vimKey = vimKey.length > 1 ? '<'+ vimKey + '>' : vimKey;\n return vimKey;\n }\n\n // Closure to bind CodeMirror, key, modifier.\n function keyMapper(vimKey) {\n return function(cm) {\n CodeMirror.Vim.handleKey(cm, vimKey);\n };\n }\n\n var cmToVimKeymap = {\n 'nofallthrough': true,\n 'style': 'fat-cursor'\n };\n function bindKeys(keys, modifier) {\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!modifier && key.length == 1) {\n // Wrap all keys without modifiers with '' to identify them by their\n // key characters instead of key identifiers.\n key = \"'\" + key + \"'\";\n }\n var vimKey = cmKeyToVimKey(keys[i], modifier);\n var cmKey = modifier ? modifier + '-' + key : key;\n cmToVimKeymap[cmKey] = keyMapper(vimKey);\n }\n }\n bindKeys(upperCaseAlphabet);\n bindKeys(lowerCaseAlphabet);\n bindKeys(upperCaseAlphabet, 'Ctrl');\n bindKeys(specialSymbols);\n bindKeys(specialSymbols, 'Ctrl');\n bindKeys(numbers);\n bindKeys(numbers, 'Ctrl');\n bindKeys(specialKeys);\n bindKeys(specialKeys, 'Ctrl');\n return cmToVimKeymap;\n }\n CodeMirror.keyMap.vim = buildVimKeyMap();\n\n function exitInsertMode(cm) {\n var vim = cm.state.vim;\n var macroModeState = vimGlobalState.macroModeState;\n var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n var isPlaying = macroModeState.isPlaying;\n if (!isPlaying) {\n cm.off('change', onChange);\n CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n }\n if (!isPlaying && vim.insertModeRepeat > 1) {\n // Perform insert mode repeat for commands like 3,a and 3,o.\n repeatLastEdit(cm, vim, vim.insertModeRepeat - 1,\n true /** repeatForInsert */);\n vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n }\n delete vim.insertModeRepeat;\n vim.insertMode = false;\n cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);\n cm.setOption('keyMap', 'vim');\n cm.setOption('disableInput', true);\n cm.toggleOverwrite(false); // exit replace mode if we were in it.\n // update the \". register before exiting insert mode\n insertModeChangeRegister.setText(macroModeState.lastInsertModeChanges.changes.join(''));\n CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n if (macroModeState.isRecording) {\n logInsertModeChange(macroModeState);\n }\n }\n\n CodeMirror.keyMap['vim-insert'] = {\n // TODO: override navigation keys so that Esc will cancel automatic\n // indentation from o, O, i_<CR>\n 'Esc': exitInsertMode,\n 'Ctrl-[': exitInsertMode,\n 'Ctrl-C': exitInsertMode,\n 'Ctrl-N': 'autocomplete',\n 'Ctrl-P': 'autocomplete',\n 'Enter': function(cm) {\n var fn = CodeMirror.commands.newlineAndIndentContinueComment ||\n CodeMirror.commands.newlineAndIndent;\n fn(cm);\n },\n fallthrough: ['default']\n };\n\n CodeMirror.keyMap['vim-replace'] = {\n 'Backspace': 'goCharLeft',\n fallthrough: ['vim-insert']\n };\n\n function executeMacroRegister(cm, vim, macroModeState, registerName) {\n var register = vimGlobalState.registerController.getRegister(registerName);\n var keyBuffer = register.keyBuffer;\n var imc = 0;\n macroModeState.isPlaying = true;\n macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n for (var i = 0; i < keyBuffer.length; i++) {\n var text = keyBuffer[i];\n var match, key;\n while (text) {\n // Pull off one command key, which is either a single character\n // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n match = (/<\\w+-.+?>|<\\w+>|./).exec(text);\n key = match[0];\n text = text.substring(match.index + key.length);\n CodeMirror.Vim.handleKey(cm, key);\n if (vim.insertMode) {\n repeatInsertModeChanges(\n cm, register.insertModeChanges[imc++].changes, 1);\n exitInsertMode(cm);\n }\n }\n };\n macroModeState.isPlaying = false;\n }\n\n function logKey(macroModeState, key) {\n if (macroModeState.isPlaying) { return; }\n var registerName = macroModeState.latestRegister;\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register) {\n register.pushText(key);\n }\n }\n\n function logInsertModeChange(macroModeState) {\n if (macroModeState.isPlaying) { return; }\n var registerName = macroModeState.latestRegister;\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register) {\n register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n }\n }\n\n function logSearchQuery(macroModeState, query) {\n if (macroModeState.isPlaying) { return; }\n var registerName = macroModeState.latestRegister;\n var register = vimGlobalState.registerController.getRegister(registerName);\n if (register) {\n register.pushSearchQuery(query);\n }\n }\n\n /**\n * Listens for changes made in insert mode.\n * Should only be active in insert mode.\n */\n function onChange(_cm, changeObj) {\n var macroModeState = vimGlobalState.macroModeState;\n var lastChange = macroModeState.lastInsertModeChanges;\n if (!macroModeState.isPlaying) {\n while(changeObj) {\n lastChange.expectCursorActivityForChange = true;\n if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n || changeObj.origin === undefined /* only in testing */) {\n var text = changeObj.text.join('\\n');\n lastChange.changes.push(text);\n }\n // Change objects may be chained with next.\n changeObj = changeObj.next;\n }\n }\n }\n\n /**\n * Listens for any kind of cursor activity on CodeMirror.\n */\n function onCursorActivity(cm) {\n var vim = cm.state.vim;\n if (vim.insertMode) {\n // Tracking cursor activity in insert mode (for macro support).\n var macroModeState = vimGlobalState.macroModeState;\n if (macroModeState.isPlaying) { return; }\n var lastChange = macroModeState.lastInsertModeChanges;\n if (lastChange.expectCursorActivityForChange) {\n lastChange.expectCursorActivityForChange = false;\n } else {\n // Cursor moved outside the context of an edit. Reset the change.\n lastChange.changes = [];\n }\n } else if (cm.doc.history.lastSelOrigin == '*mouse') {\n // Reset lastHPos if mouse click was done in normal mode.\n vim.lastHPos = cm.doc.getCursor().ch;\n }\n }\n\n /** Wrapper for special keys pressed in insert mode */\n function InsertModeKey(keyName) {\n this.keyName = keyName;\n }\n\n /**\n * Handles raw key down events from the text area.\n * - Should only be active in insert mode.\n * - For recording deletes in insert mode.\n */\n function onKeyEventTargetKeyDown(e) {\n var macroModeState = vimGlobalState.macroModeState;\n var lastChange = macroModeState.lastInsertModeChanges;\n var keyName = CodeMirror.keyName(e);\n function onKeyFound() {\n lastChange.changes.push(new InsertModeKey(keyName));\n return true;\n }\n if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n CodeMirror.lookupKey(keyName, ['vim-insert'], onKeyFound);\n }\n }\n\n /**\n * Repeats the last edit, which includes exactly 1 command and at most 1\n * insert. Operator and motion commands are read from lastEditInputState,\n * while action commands are read from lastEditActionCommand.\n *\n * If repeatForInsert is true, then the function was called by\n * exitInsertMode to repeat the insert mode changes the user just made. The\n * corresponding enterInsertMode call was made with a count.\n */\n function repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n var macroModeState = vimGlobalState.macroModeState;\n macroModeState.isPlaying = true;\n var isAction = !!vim.lastEditActionCommand;\n var cachedInputState = vim.inputState;\n function repeatCommand() {\n if (isAction) {\n commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand);\n } else {\n commandDispatcher.evalInput(cm, vim);\n }\n }\n function repeatInsert(repeat) {\n if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n // For some reason, repeat cw in desktop VIM does not repeat\n // insert mode changes. Will conform to that behavior.\n repeat = !vim.lastEditActionCommand ? 1 : repeat;\n var changeObject = macroModeState.lastInsertModeChanges;\n // This isn't strictly necessary, but since lastInsertModeChanges is\n // supposed to be immutable during replay, this helps catch bugs.\n macroModeState.lastInsertModeChanges = {};\n repeatInsertModeChanges(cm, changeObject.changes, repeat);\n macroModeState.lastInsertModeChanges = changeObject;\n }\n }\n vim.inputState = vim.lastEditInputState;\n if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) {\n // o and O repeat have to be interlaced with insert repeats so that the\n // insertions appear on separate lines instead of the last line.\n for (var i = 0; i < repeat; i++) {\n repeatCommand();\n repeatInsert(1);\n }\n } else {\n if (!repeatForInsert) {\n // Hack to get the cursor to end up at the right place. If I is\n // repeated in insert mode repeat, cursor will be 1 insert\n // change set left of where it should be.\n repeatCommand();\n }\n repeatInsert(repeat);\n }\n vim.inputState = cachedInputState;\n if (vim.insertMode && !repeatForInsert) {\n // Don't exit insert mode twice. If repeatForInsert is set, then we\n // were called by an exitInsertMode call lower on the stack.\n exitInsertMode(cm);\n }\n macroModeState.isPlaying = false;\n };\n\n function repeatInsertModeChanges(cm, changes, repeat) {\n function keyHandler(binding) {\n if (typeof binding == 'string') {\n CodeMirror.commands[binding](cm);\n } else {\n binding(cm);\n }\n return true;\n }\n for (var i = 0; i < repeat; i++) {\n for (var j = 0; j < changes.length; j++) {\n var change = changes[j];\n if (change instanceof InsertModeKey) {\n CodeMirror.lookupKey(change.keyName, ['vim-insert'], keyHandler);\n } else {\n var cur = cm.getCursor();\n cm.replaceRange(change, cur, cur);\n }\n }\n }\n }\n\n resetVimGlobalState();\n return vimApi;\n };\n // Initialize Vim and make it available as an API.\n CodeMirror.Vim = Vim();\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/keymap/sublime.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/keymap/sublime.js",
"module-type": "library",
"text": "// A rough approximation of Sublime Text's keybindings\n// Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/edit/matchbrackets\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/edit/matchbrackets\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n var map = CodeMirror.keyMap.sublime = {fallthrough: \"default\"};\n var cmds = CodeMirror.commands;\n var Pos = CodeMirror.Pos;\n var ctrl = CodeMirror.keyMap[\"default\"] == CodeMirror.keyMap.pcDefault ? \"Ctrl-\" : \"Cmd-\";\n\n // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that.\n function findPosSubword(doc, start, dir) {\n if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1));\n var line = doc.getLine(start.line);\n if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0));\n var state = \"start\", type;\n for (var pos = start.ch, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) {\n var next = line.charAt(dir < 0 ? pos - 1 : pos);\n var cat = next != \"_\" && CodeMirror.isWordChar(next) ? \"w\" : \"o\";\n if (cat == \"w\" && next.toUpperCase() == next) cat = \"W\";\n if (state == \"start\") {\n if (cat != \"o\") { state = \"in\"; type = cat; }\n } else if (state == \"in\") {\n if (type != cat) {\n if (type == \"w\" && cat == \"W\" && dir < 0) pos--;\n if (type == \"W\" && cat == \"w\" && dir > 0) { type = \"w\"; continue; }\n break;\n }\n }\n }\n return Pos(start.line, pos);\n }\n\n function moveSubword(cm, dir) {\n cm.extendSelectionsBy(function(range) {\n if (cm.display.shift || cm.doc.extend || range.empty())\n return findPosSubword(cm.doc, range.head, dir);\n else\n return dir < 0 ? range.from() : range.to();\n });\n }\n\n cmds[map[\"Alt-Left\"] = \"goSubwordLeft\"] = function(cm) { moveSubword(cm, -1); };\n cmds[map[\"Alt-Right\"] = \"goSubwordRight\"] = function(cm) { moveSubword(cm, 1); };\n\n cmds[map[ctrl + \"Up\"] = \"scrollLineUp\"] = function(cm) {\n var info = cm.getScrollInfo();\n if (!cm.somethingSelected()) {\n var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, \"local\");\n if (cm.getCursor().line >= visibleBottomLine)\n cm.execCommand(\"goLineUp\");\n }\n cm.scrollTo(null, info.top - cm.defaultTextHeight());\n };\n cmds[map[ctrl + \"Down\"] = \"scrollLineDown\"] = function(cm) {\n var info = cm.getScrollInfo();\n if (!cm.somethingSelected()) {\n var visibleTopLine = cm.lineAtHeight(info.top, \"local\")+1;\n if (cm.getCursor().line <= visibleTopLine)\n cm.execCommand(\"goLineDown\");\n }\n cm.scrollTo(null, info.top + cm.defaultTextHeight());\n };\n\n cmds[map[\"Shift-\" + ctrl + \"L\"] = \"splitSelectionByLine\"] = function(cm) {\n var ranges = cm.listSelections(), lineRanges = [];\n for (var i = 0; i < ranges.length; i++) {\n var from = ranges[i].from(), to = ranges[i].to();\n for (var line = from.line; line <= to.line; ++line)\n if (!(to.line > from.line && line == to.line && to.ch == 0))\n lineRanges.push({anchor: line == from.line ? from : Pos(line, 0),\n head: line == to.line ? to : Pos(line)});\n }\n cm.setSelections(lineRanges, 0);\n };\n\n map[\"Shift-Tab\"] = \"indentLess\";\n\n cmds[map[\"Esc\"] = \"singleSelectionTop\"] = function(cm) {\n var range = cm.listSelections()[0];\n cm.setSelection(range.anchor, range.head, {scroll: false});\n };\n\n cmds[map[ctrl + \"L\"] = \"selectLine\"] = function(cm) {\n var ranges = cm.listSelections(), extended = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n extended.push({anchor: Pos(range.from().line, 0),\n head: Pos(range.to().line + 1, 0)});\n }\n cm.setSelections(extended);\n };\n\n map[\"Shift-\" + ctrl + \"K\"] = \"deleteLine\";\n\n function insertLine(cm, above) {\n cm.operation(function() {\n var len = cm.listSelections().length, newSelection = [], last = -1;\n for (var i = 0; i < len; i++) {\n var head = cm.listSelections()[i].head;\n if (head.line <= last) continue;\n var at = Pos(head.line + (above ? 0 : 1), 0);\n cm.replaceRange(\"\\n\", at, null, \"+insertLine\");\n cm.indentLine(at.line, null, true);\n newSelection.push({head: at, anchor: at});\n last = head.line + 1;\n }\n cm.setSelections(newSelection);\n });\n }\n\n cmds[map[ctrl + \"Enter\"] = \"insertLineAfter\"] = function(cm) { insertLine(cm, false); };\n\n cmds[map[\"Shift-\" + ctrl + \"Enter\"] = \"insertLineBefore\"] = function(cm) { insertLine(cm, true); };\n\n function wordAt(cm, pos) {\n var start = pos.ch, end = start, line = cm.getLine(pos.line);\n while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start;\n while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end;\n return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)};\n }\n\n cmds[map[ctrl + \"D\"] = \"selectNextOccurrence\"] = function(cm) {\n var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel;\n if (CodeMirror.cmpPos(from, to) == 0) {\n var word = wordAt(cm, from);\n if (!word.word) return;\n cm.setSelection(word.from, word.to);\n fullWord = true;\n } else {\n var text = cm.getRange(from, to);\n var query = fullWord ? new RegExp(\"\\\\b\" + text + \"\\\\b\") : text;\n var cur = cm.getSearchCursor(query, to);\n if (cur.findNext()) {\n cm.addSelection(cur.from(), cur.to());\n } else {\n cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0));\n if (cur.findNext())\n cm.addSelection(cur.from(), cur.to());\n }\n }\n if (fullWord)\n cm.state.sublimeFindFullWord = cm.doc.sel;\n };\n\n var mirror = \"(){}[]\";\n function selectBetweenBrackets(cm) {\n var pos = cm.getCursor(), opening = cm.scanForBracket(pos, -1);\n if (!opening) return;\n for (;;) {\n var closing = cm.scanForBracket(pos, 1);\n if (!closing) return;\n if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) {\n cm.setSelection(Pos(opening.pos.line, opening.pos.ch + 1), closing.pos, false);\n return true;\n }\n pos = Pos(closing.pos.line, closing.pos.ch + 1);\n }\n }\n\n cmds[map[\"Shift-\" + ctrl + \"Space\"] = \"selectScope\"] = function(cm) {\n selectBetweenBrackets(cm) || cm.execCommand(\"selectAll\");\n };\n cmds[map[\"Shift-\" + ctrl + \"M\"] = \"selectBetweenBrackets\"] = function(cm) {\n if (!selectBetweenBrackets(cm)) return CodeMirror.Pass;\n };\n\n cmds[map[ctrl + \"M\"] = \"goToBracket\"] = function(cm) {\n cm.extendSelectionsBy(function(range) {\n var next = cm.scanForBracket(range.head, 1);\n if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos;\n var prev = cm.scanForBracket(range.head, -1);\n return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head;\n });\n };\n\n cmds[map[\"Shift-\" + ctrl + \"Up\"] = \"swapLineUp\"] = function(cm) {\n var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i], from = range.from().line - 1, to = range.to().line;\n if (from > at) linesToMove.push(from, to);\n else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n at = to;\n }\n cm.operation(function() {\n for (var i = 0; i < linesToMove.length; i += 2) {\n var from = linesToMove[i], to = linesToMove[i + 1];\n var line = cm.getLine(from);\n cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n if (to > cm.lastLine()) {\n cm.replaceRange(\"\\n\" + line, Pos(cm.lastLine()), null, \"+swapLine\");\n var sels = cm.listSelections(), last = sels[sels.length - 1];\n var head = last.head.line == to ? Pos(to - 1) : last.head;\n var anchor = last.anchor.line == to ? Pos(to - 1) : last.anchor;\n cm.setSelections(sels.slice(0, sels.length - 1).concat([{head: head, anchor: anchor}]));\n } else {\n cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n }\n }\n cm.scrollIntoView();\n });\n };\n\n cmds[map[\"Shift-\" + ctrl + \"Down\"] = \"swapLineDown\"] = function(cm) {\n var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1;\n for (var i = ranges.length - 1; i >= 0; i--) {\n var range = ranges[i], from = range.to().line + 1, to = range.from().line;\n if (from < at) linesToMove.push(from, to);\n else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n at = to;\n }\n cm.operation(function() {\n for (var i = linesToMove.length - 2; i >= 0; i -= 2) {\n var from = linesToMove[i], to = linesToMove[i + 1];\n var line = cm.getLine(from);\n if (from == cm.lastLine())\n cm.replaceRange(\"\", Pos(from - 1), Pos(from), \"+swapLine\");\n else\n cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n }\n cm.scrollIntoView();\n });\n };\n\n map[ctrl + \"/\"] = \"toggleComment\";\n\n cmds[map[ctrl + \"J\"] = \"joinLines\"] = function(cm) {\n var ranges = cm.listSelections(), joined = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i], from = range.from();\n var start = from.line, end = range.to().line;\n while (i < ranges.length - 1 && ranges[i + 1].from().line == end)\n end = ranges[++i].to().line;\n joined.push({start: start, end: end, anchor: !range.empty() && from});\n }\n cm.operation(function() {\n var offset = 0, ranges = [];\n for (var i = 0; i < joined.length; i++) {\n var obj = joined[i];\n var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head;\n for (var line = obj.start; line <= obj.end; line++) {\n var actual = line - offset;\n if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);\n if (actual < cm.lastLine()) {\n cm.replaceRange(\" \", Pos(actual), Pos(actual + 1, /^\\s*/.exec(cm.getLine(actual + 1))[0].length));\n ++offset;\n }\n }\n ranges.push({anchor: anchor || head, head: head});\n }\n cm.setSelections(ranges, 0);\n });\n };\n\n cmds[map[\"Shift-\" + ctrl + \"D\"] = \"duplicateLine\"] = function(cm) {\n cm.operation(function() {\n var rangeCount = cm.listSelections().length;\n for (var i = 0; i < rangeCount; i++) {\n var range = cm.listSelections()[i];\n if (range.empty())\n cm.replaceRange(cm.getLine(range.head.line) + \"\\n\", Pos(range.head.line, 0));\n else\n cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());\n }\n cm.scrollIntoView();\n });\n };\n\n map[ctrl + \"T\"] = \"transposeChars\";\n\n function sortLines(cm, caseSensitive) {\n var ranges = cm.listSelections(), toSort = [], selected;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (range.empty()) continue;\n var from = range.from().line, to = range.to().line;\n while (i < ranges.length - 1 && ranges[i + 1].from().line == to)\n to = range[++i].to().line;\n toSort.push(from, to);\n }\n if (toSort.length) selected = true;\n else toSort.push(cm.firstLine(), cm.lastLine());\n\n cm.operation(function() {\n var ranges = [];\n for (var i = 0; i < toSort.length; i += 2) {\n var from = toSort[i], to = toSort[i + 1];\n var start = Pos(from, 0), end = Pos(to);\n var lines = cm.getRange(start, end, false);\n if (caseSensitive)\n lines.sort();\n else\n lines.sort(function(a, b) {\n var au = a.toUpperCase(), bu = b.toUpperCase();\n if (au != bu) { a = au; b = bu; }\n return a < b ? -1 : a == b ? 0 : 1;\n });\n cm.replaceRange(lines, start, end);\n if (selected) ranges.push({anchor: start, head: end});\n }\n if (selected) cm.setSelections(ranges, 0);\n });\n }\n\n cmds[map[\"F9\"] = \"sortLines\"] = function(cm) { sortLines(cm, true); };\n cmds[map[ctrl + \"F9\"] = \"sortLinesInsensitive\"] = function(cm) { sortLines(cm, false); };\n\n cmds[map[\"F2\"] = \"nextBookmark\"] = function(cm) {\n var marks = cm.state.sublimeBookmarks;\n if (marks) while (marks.length) {\n var current = marks.shift();\n var found = current.find();\n if (found) {\n marks.push(current);\n return cm.setSelection(found.from, found.to);\n }\n }\n };\n\n cmds[map[\"Shift-F2\"] = \"prevBookmark\"] = function(cm) {\n var marks = cm.state.sublimeBookmarks;\n if (marks) while (marks.length) {\n marks.unshift(marks.pop());\n var found = marks[marks.length - 1].find();\n if (!found)\n marks.pop();\n else\n return cm.setSelection(found.from, found.to);\n }\n };\n\n cmds[map[ctrl + \"F2\"] = \"toggleBookmark\"] = function(cm) {\n var ranges = cm.listSelections();\n var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []);\n for (var i = 0; i < ranges.length; i++) {\n var from = ranges[i].from(), to = ranges[i].to();\n var found = cm.findMarks(from, to);\n for (var j = 0; j < found.length; j++) {\n if (found[j].sublimeBookmark) {\n found[j].clear();\n for (var k = 0; k < marks.length; k++)\n if (marks[k] == found[j])\n marks.splice(k--, 1);\n break;\n }\n }\n if (j == found.length)\n marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false}));\n }\n };\n\n cmds[map[\"Shift-\" + ctrl + \"F2\"] = \"clearBookmarks\"] = function(cm) {\n var marks = cm.state.sublimeBookmarks;\n if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear();\n marks.length = 0;\n };\n\n cmds[map[\"Alt-F2\"] = \"selectBookmarks\"] = function(cm) {\n var marks = cm.state.sublimeBookmarks, ranges = [];\n if (marks) for (var i = 0; i < marks.length; i++) {\n var found = marks[i].find();\n if (!found)\n marks.splice(i--, 0);\n else\n ranges.push({anchor: found.from, head: found.to});\n }\n if (ranges.length)\n cm.setSelections(ranges, 0);\n };\n\n map[\"Alt-Q\"] = \"wrapLines\";\n\n var mapK = CodeMirror.keyMap[\"sublime-Ctrl-K\"] = {auto: \"sublime\", nofallthrough: true};\n\n map[ctrl + \"K\"] = function(cm) {cm.setOption(\"keyMap\", \"sublime-Ctrl-K\");};\n\n function modifyWordOrSelection(cm, mod) {\n cm.operation(function() {\n var ranges = cm.listSelections(), indices = [], replacements = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (range.empty()) { indices.push(i); replacements.push(\"\"); }\n else replacements.push(mod(cm.getRange(range.from(), range.to())));\n }\n cm.replaceSelections(replacements, \"around\", \"case\");\n for (var i = indices.length - 1, at; i >= 0; i--) {\n var range = ranges[indices[i]];\n if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;\n var word = wordAt(cm, range.head);\n at = word.from;\n cm.replaceRange(mod(word.word), word.from, word.to);\n }\n });\n }\n\n mapK[ctrl + \"Backspace\"] = \"delLineLeft\";\n\n cmds[mapK[ctrl + \"K\"] = \"delLineRight\"] = function(cm) {\n cm.operation(function() {\n var ranges = cm.listSelections();\n for (var i = ranges.length - 1; i >= 0; i--)\n cm.replaceRange(\"\", ranges[i].anchor, Pos(ranges[i].to().line), \"+delete\");\n cm.scrollIntoView();\n });\n };\n\n cmds[mapK[ctrl + \"U\"] = \"upcaseAtCursor\"] = function(cm) {\n modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); });\n };\n cmds[mapK[ctrl + \"L\"] = \"downcaseAtCursor\"] = function(cm) {\n modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); });\n };\n\n cmds[mapK[ctrl + \"Space\"] = \"setSublimeMark\"] = function(cm) {\n if (cm.state.sublimeMark) cm.state.sublimeMark.clear();\n cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n };\n cmds[mapK[ctrl + \"A\"] = \"selectToSublimeMark\"] = function(cm) {\n var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n if (found) cm.setSelection(cm.getCursor(), found);\n };\n cmds[mapK[ctrl + \"W\"] = \"deleteToSublimeMark\"] = function(cm) {\n var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n if (found) {\n var from = cm.getCursor(), to = found;\n if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }\n cm.state.sublimeKilled = cm.getRange(from, to);\n cm.replaceRange(\"\", from, to);\n }\n };\n cmds[mapK[ctrl + \"X\"] = \"swapWithSublimeMark\"] = function(cm) {\n var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n if (found) {\n cm.state.sublimeMark.clear();\n cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n cm.setCursor(found);\n }\n };\n cmds[mapK[ctrl + \"Y\"] = \"sublimeYank\"] = function(cm) {\n if (cm.state.sublimeKilled != null)\n cm.replaceSelection(cm.state.sublimeKilled, null, \"paste\");\n };\n\n mapK[ctrl + \"G\"] = \"clearBookmarks\";\n cmds[mapK[ctrl + \"C\"] = \"showInCenter\"] = function(cm) {\n var pos = cm.cursorCoords(null, \"local\");\n cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2);\n };\n\n cmds[map[\"Shift-Alt-Up\"] = \"selectLinesUpward\"] = function(cm) {\n cm.operation(function() {\n var ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (range.head.line > cm.firstLine())\n cm.addSelection(Pos(range.head.line - 1, range.head.ch));\n }\n });\n };\n cmds[map[\"Shift-Alt-Down\"] = \"selectLinesDownward\"] = function(cm) {\n cm.operation(function() {\n var ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (range.head.line < cm.lastLine())\n cm.addSelection(Pos(range.head.line + 1, range.head.ch));\n }\n });\n };\n\n function findAndGoTo(cm, forward) {\n var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n if (CodeMirror.cmpPos(from, to) == 0) {\n var word = wordAt(cm, from);\n if (!word.word) return;\n from = word.from;\n to = word.to;\n }\n\n var query = cm.getRange(from, to);\n var cur = cm.getSearchCursor(query, forward ? to : from);\n\n if (forward ? cur.findNext() : cur.findPrevious()) {\n cm.setSelection(cur.from(), cur.to());\n } else {\n cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0)\n : cm.clipPos(Pos(cm.lastLine())));\n if (forward ? cur.findNext() : cur.findPrevious())\n cm.setSelection(cur.from(), cur.to());\n else if (word)\n cm.setSelection(from, to);\n }\n };\n cmds[map[ctrl + \"F3\"] = \"findUnder\"] = function(cm) { findAndGoTo(cm, true); };\n cmds[map[\"Shift-\" + ctrl + \"F3\"] = \"findUnderPrevious\"] = function(cm) { findAndGoTo(cm,false); };\n\n map[\"Shift-\" + ctrl + \"[\"] = \"fold\";\n map[\"Shift-\" + ctrl + \"]\"] = \"unfold\";\n mapK[ctrl + \"0\"] = mapK[ctrl + \"j\"] = \"unfoldAll\";\n\n map[ctrl + \"I\"] = \"findIncremental\";\n map[\"Shift-\" + ctrl + \"I\"] = \"findIncrementalReverse\";\n map[ctrl + \"H\"] = \"replace\";\n map[\"F3\"] = \"findNext\";\n map[\"Shift-F3\"] = \"findPrev\";\n\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/keymap/emacs.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/keymap/emacs.js",
"module-type": "library",
"text": "(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n var Pos = CodeMirror.Pos;\n function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }\n\n // Kill 'ring'\n\n var killRing = [];\n function addToRing(str) {\n killRing.push(str);\n if (killRing.length > 50) killRing.shift();\n }\n function growRingTop(str) {\n if (!killRing.length) return addToRing(str);\n killRing[killRing.length - 1] += str;\n }\n function getFromRing(n) { return killRing[killRing.length - (n ? Math.min(n, 1) : 1)] || \"\"; }\n function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }\n\n var lastKill = null;\n\n function kill(cm, from, to, mayGrow, text) {\n if (text == null) text = cm.getRange(from, to);\n\n if (mayGrow && lastKill && lastKill.cm == cm && posEq(from, lastKill.pos) && cm.isClean(lastKill.gen))\n growRingTop(text);\n else\n addToRing(text);\n cm.replaceRange(\"\", from, to, \"+delete\");\n\n if (mayGrow) lastKill = {cm: cm, pos: from, gen: cm.changeGeneration()};\n else lastKill = null;\n }\n\n // Boundaries of various units\n\n function byChar(cm, pos, dir) {\n return cm.findPosH(pos, dir, \"char\", true);\n }\n\n function byWord(cm, pos, dir) {\n return cm.findPosH(pos, dir, \"word\", true);\n }\n\n function byLine(cm, pos, dir) {\n return cm.findPosV(pos, dir, \"line\", cm.doc.sel.goalColumn);\n }\n\n function byPage(cm, pos, dir) {\n return cm.findPosV(pos, dir, \"page\", cm.doc.sel.goalColumn);\n }\n\n function byParagraph(cm, pos, dir) {\n var no = pos.line, line = cm.getLine(no);\n var sawText = /\\S/.test(dir < 0 ? line.slice(0, pos.ch) : line.slice(pos.ch));\n var fst = cm.firstLine(), lst = cm.lastLine();\n for (;;) {\n no += dir;\n if (no < fst || no > lst)\n return cm.clipPos(Pos(no - dir, dir < 0 ? 0 : null));\n line = cm.getLine(no);\n var hasText = /\\S/.test(line);\n if (hasText) sawText = true;\n else if (sawText) return Pos(no, 0);\n }\n }\n\n function bySentence(cm, pos, dir) {\n var line = pos.line, ch = pos.ch;\n var text = cm.getLine(pos.line), sawWord = false;\n for (;;) {\n var next = text.charAt(ch + (dir < 0 ? -1 : 0));\n if (!next) { // End/beginning of line reached\n if (line == (dir < 0 ? cm.firstLine() : cm.lastLine())) return Pos(line, ch);\n text = cm.getLine(line + dir);\n if (!/\\S/.test(text)) return Pos(line, ch);\n line += dir;\n ch = dir < 0 ? text.length : 0;\n continue;\n }\n if (sawWord && /[!?.]/.test(next)) return Pos(line, ch + (dir > 0 ? 1 : 0));\n if (!sawWord) sawWord = /\\w/.test(next);\n ch += dir;\n }\n }\n\n function byExpr(cm, pos, dir) {\n var wrap;\n if (cm.findMatchingBracket && (wrap = cm.findMatchingBracket(pos, true))\n && wrap.match && (wrap.forward ? 1 : -1) == dir)\n return dir > 0 ? Pos(wrap.to.line, wrap.to.ch + 1) : wrap.to;\n\n for (var first = true;; first = false) {\n var token = cm.getTokenAt(pos);\n var after = Pos(pos.line, dir < 0 ? token.start : token.end);\n if (first && dir > 0 && token.end == pos.ch || !/\\w/.test(token.string)) {\n var newPos = cm.findPosH(after, dir, \"char\");\n if (posEq(after, newPos)) return pos;\n else pos = newPos;\n } else {\n return after;\n }\n }\n }\n\n // Prefixes (only crudely supported)\n\n function getPrefix(cm, precise) {\n var digits = cm.state.emacsPrefix;\n if (!digits) return precise ? null : 1;\n clearPrefix(cm);\n return digits == \"-\" ? -1 : Number(digits);\n }\n\n function repeated(cmd) {\n var f = typeof cmd == \"string\" ? function(cm) { cm.execCommand(cmd); } : cmd;\n return function(cm) {\n var prefix = getPrefix(cm);\n f(cm);\n for (var i = 1; i < prefix; ++i) f(cm);\n };\n }\n\n function findEnd(cm, by, dir) {\n var pos = cm.getCursor(), prefix = getPrefix(cm);\n if (prefix < 0) { dir = -dir; prefix = -prefix; }\n for (var i = 0; i < prefix; ++i) {\n var newPos = by(cm, pos, dir);\n if (posEq(newPos, pos)) break;\n pos = newPos;\n }\n return pos;\n }\n\n function move(by, dir) {\n var f = function(cm) {\n cm.extendSelection(findEnd(cm, by, dir));\n };\n f.motion = true;\n return f;\n }\n\n function killTo(cm, by, dir) {\n kill(cm, cm.getCursor(), findEnd(cm, by, dir), true);\n }\n\n function addPrefix(cm, digit) {\n if (cm.state.emacsPrefix) {\n if (digit != \"-\") cm.state.emacsPrefix += digit;\n return;\n }\n // Not active yet\n cm.state.emacsPrefix = digit;\n cm.on(\"keyHandled\", maybeClearPrefix);\n cm.on(\"inputRead\", maybeDuplicateInput);\n }\n\n var prefixPreservingKeys = {\"Alt-G\": true, \"Ctrl-X\": true, \"Ctrl-Q\": true, \"Ctrl-U\": true};\n\n function maybeClearPrefix(cm, arg) {\n if (!cm.state.emacsPrefixMap && !prefixPreservingKeys.hasOwnProperty(arg))\n clearPrefix(cm);\n }\n\n function clearPrefix(cm) {\n cm.state.emacsPrefix = null;\n cm.off(\"keyHandled\", maybeClearPrefix);\n cm.off(\"inputRead\", maybeDuplicateInput);\n }\n\n function maybeDuplicateInput(cm, event) {\n var dup = getPrefix(cm);\n if (dup > 1 && event.origin == \"+input\") {\n var one = event.text.join(\"\\n\"), txt = \"\";\n for (var i = 1; i < dup; ++i) txt += one;\n cm.replaceSelection(txt);\n }\n }\n\n function addPrefixMap(cm) {\n cm.state.emacsPrefixMap = true;\n cm.addKeyMap(prefixMap);\n cm.on(\"keyHandled\", maybeRemovePrefixMap);\n cm.on(\"inputRead\", maybeRemovePrefixMap);\n }\n\n function maybeRemovePrefixMap(cm, arg) {\n if (typeof arg == \"string\" && (/^\\d$/.test(arg) || arg == \"Ctrl-U\")) return;\n cm.removeKeyMap(prefixMap);\n cm.state.emacsPrefixMap = false;\n cm.off(\"keyHandled\", maybeRemovePrefixMap);\n cm.off(\"inputRead\", maybeRemovePrefixMap);\n }\n\n // Utilities\n\n function setMark(cm) {\n cm.setCursor(cm.getCursor());\n cm.setExtending(!cm.getExtending());\n cm.on(\"change\", function() { cm.setExtending(false); });\n }\n\n function clearMark(cm) {\n cm.setExtending(false);\n cm.setCursor(cm.getCursor());\n }\n\n function getInput(cm, msg, f) {\n if (cm.openDialog)\n cm.openDialog(msg + \": <input type=\\\"text\\\" style=\\\"width: 10em\\\"/>\", f, {bottom: true});\n else\n f(prompt(msg, \"\"));\n }\n\n function operateOnWord(cm, op) {\n var start = cm.getCursor(), end = cm.findPosH(start, 1, \"word\");\n cm.replaceRange(op(cm.getRange(start, end)), start, end);\n cm.setCursor(end);\n }\n\n function toEnclosingExpr(cm) {\n var pos = cm.getCursor(), line = pos.line, ch = pos.ch;\n var stack = [];\n while (line >= cm.firstLine()) {\n var text = cm.getLine(line);\n for (var i = ch == null ? text.length : ch; i > 0;) {\n var ch = text.charAt(--i);\n if (ch == \")\")\n stack.push(\"(\");\n else if (ch == \"]\")\n stack.push(\"[\");\n else if (ch == \"}\")\n stack.push(\"{\");\n else if (/[\\(\\{\\[]/.test(ch) && (!stack.length || stack.pop() != ch))\n return cm.extendSelection(Pos(line, i));\n }\n --line; ch = null;\n }\n }\n\n function quit(cm) {\n cm.execCommand(\"clearSearch\");\n clearMark(cm);\n }\n\n // Actual keymap\n\n var keyMap = CodeMirror.keyMap.emacs = {\n \"Ctrl-W\": function(cm) {kill(cm, cm.getCursor(\"start\"), cm.getCursor(\"end\"));},\n \"Ctrl-K\": repeated(function(cm) {\n var start = cm.getCursor(), end = cm.clipPos(Pos(start.line));\n var text = cm.getRange(start, end);\n if (!/\\S/.test(text)) {\n text += \"\\n\";\n end = Pos(start.line + 1, 0);\n }\n kill(cm, start, end, true, text);\n }),\n \"Alt-W\": function(cm) {\n addToRing(cm.getSelection());\n clearMark(cm);\n },\n \"Ctrl-Y\": function(cm) {\n var start = cm.getCursor();\n cm.replaceRange(getFromRing(getPrefix(cm)), start, start, \"paste\");\n cm.setSelection(start, cm.getCursor());\n },\n \"Alt-Y\": function(cm) {cm.replaceSelection(popFromRing(), \"around\", \"paste\");},\n\n \"Ctrl-Space\": setMark, \"Ctrl-Shift-2\": setMark,\n\n \"Ctrl-F\": move(byChar, 1), \"Ctrl-B\": move(byChar, -1),\n \"Right\": move(byChar, 1), \"Left\": move(byChar, -1),\n \"Ctrl-D\": function(cm) { killTo(cm, byChar, 1); },\n \"Delete\": function(cm) { killTo(cm, byChar, 1); },\n \"Ctrl-H\": function(cm) { killTo(cm, byChar, -1); },\n \"Backspace\": function(cm) { killTo(cm, byChar, -1); },\n\n \"Alt-F\": move(byWord, 1), \"Alt-B\": move(byWord, -1),\n \"Alt-D\": function(cm) { killTo(cm, byWord, 1); },\n \"Alt-Backspace\": function(cm) { killTo(cm, byWord, -1); },\n\n \"Ctrl-N\": move(byLine, 1), \"Ctrl-P\": move(byLine, -1),\n \"Down\": move(byLine, 1), \"Up\": move(byLine, -1),\n \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n \"End\": \"goLineEnd\", \"Home\": \"goLineStart\",\n\n \"Alt-V\": move(byPage, -1), \"Ctrl-V\": move(byPage, 1),\n \"PageUp\": move(byPage, -1), \"PageDown\": move(byPage, 1),\n\n \"Ctrl-Up\": move(byParagraph, -1), \"Ctrl-Down\": move(byParagraph, 1),\n\n \"Alt-A\": move(bySentence, -1), \"Alt-E\": move(bySentence, 1),\n \"Alt-K\": function(cm) { killTo(cm, bySentence, 1); },\n\n \"Ctrl-Alt-K\": function(cm) { killTo(cm, byExpr, 1); },\n \"Ctrl-Alt-Backspace\": function(cm) { killTo(cm, byExpr, -1); },\n \"Ctrl-Alt-F\": move(byExpr, 1), \"Ctrl-Alt-B\": move(byExpr, -1),\n\n \"Shift-Ctrl-Alt-2\": function(cm) {\n cm.setSelection(findEnd(cm, byExpr, 1), cm.getCursor());\n },\n \"Ctrl-Alt-T\": function(cm) {\n var leftStart = byExpr(cm, cm.getCursor(), -1), leftEnd = byExpr(cm, leftStart, 1);\n var rightEnd = byExpr(cm, leftEnd, 1), rightStart = byExpr(cm, rightEnd, -1);\n cm.replaceRange(cm.getRange(rightStart, rightEnd) + cm.getRange(leftEnd, rightStart) +\n cm.getRange(leftStart, leftEnd), leftStart, rightEnd);\n },\n \"Ctrl-Alt-U\": repeated(toEnclosingExpr),\n\n \"Alt-Space\": function(cm) {\n var pos = cm.getCursor(), from = pos.ch, to = pos.ch, text = cm.getLine(pos.line);\n while (from && /\\s/.test(text.charAt(from - 1))) --from;\n while (to < text.length && /\\s/.test(text.charAt(to))) ++to;\n cm.replaceRange(\" \", Pos(pos.line, from), Pos(pos.line, to));\n },\n \"Ctrl-O\": repeated(function(cm) { cm.replaceSelection(\"\\n\", \"start\"); }),\n \"Ctrl-T\": repeated(function(cm) {\n cm.execCommand(\"transposeChars\");\n }),\n\n \"Alt-C\": repeated(function(cm) {\n operateOnWord(cm, function(w) {\n var letter = w.search(/\\w/);\n if (letter == -1) return w;\n return w.slice(0, letter) + w.charAt(letter).toUpperCase() + w.slice(letter + 1).toLowerCase();\n });\n }),\n \"Alt-U\": repeated(function(cm) {\n operateOnWord(cm, function(w) { return w.toUpperCase(); });\n }),\n \"Alt-L\": repeated(function(cm) {\n operateOnWord(cm, function(w) { return w.toLowerCase(); });\n }),\n\n \"Alt-;\": \"toggleComment\",\n\n \"Ctrl-/\": repeated(\"undo\"), \"Shift-Ctrl--\": repeated(\"undo\"),\n \"Ctrl-Z\": repeated(\"undo\"), \"Cmd-Z\": repeated(\"undo\"),\n \"Shift-Alt-,\": \"goDocStart\", \"Shift-Alt-.\": \"goDocEnd\",\n \"Ctrl-S\": \"findNext\", \"Ctrl-R\": \"findPrev\", \"Ctrl-G\": quit, \"Shift-Alt-5\": \"replace\",\n \"Alt-/\": \"autocomplete\",\n \"Ctrl-J\": \"newlineAndIndent\", \"Enter\": false, \"Tab\": \"indentAuto\",\n\n \"Alt-G\": function(cm) {cm.setOption(\"keyMap\", \"emacs-Alt-G\");},\n \"Ctrl-X\": function(cm) {cm.setOption(\"keyMap\", \"emacs-Ctrl-X\");},\n \"Ctrl-Q\": function(cm) {cm.setOption(\"keyMap\", \"emacs-Ctrl-Q\");},\n \"Ctrl-U\": addPrefixMap\n };\n\n CodeMirror.keyMap[\"emacs-Ctrl-X\"] = {\n \"Tab\": function(cm) {\n cm.indentSelection(getPrefix(cm, true) || cm.getOption(\"indentUnit\"));\n },\n \"Ctrl-X\": function(cm) {\n cm.setSelection(cm.getCursor(\"head\"), cm.getCursor(\"anchor\"));\n },\n\n \"Ctrl-S\": \"save\", \"Ctrl-W\": \"save\", \"S\": \"saveAll\", \"F\": \"open\", \"U\": repeated(\"undo\"), \"K\": \"close\",\n \"Delete\": function(cm) { kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), true); },\n auto: \"emacs\", nofallthrough: true, disableInput: true\n };\n\n CodeMirror.keyMap[\"emacs-Alt-G\"] = {\n \"G\": function(cm) {\n var prefix = getPrefix(cm, true);\n if (prefix != null && prefix > 0) return cm.setCursor(prefix - 1);\n\n getInput(cm, \"Goto line\", function(str) {\n var num;\n if (str && !isNaN(num = Number(str)) && num == num|0 && num > 0)\n cm.setCursor(num - 1);\n });\n },\n auto: \"emacs\", nofallthrough: true, disableInput: true\n };\n\n CodeMirror.keyMap[\"emacs-Ctrl-Q\"] = {\n \"Tab\": repeated(\"insertTab\"),\n auto: \"emacs\", nofallthrough: true\n };\n\n var prefixMap = {\"Ctrl-G\": clearPrefix};\n function regPrefix(d) {\n prefixMap[d] = function(cm) { addPrefix(cm, d); };\n keyMap[\"Ctrl-\" + d] = function(cm) { addPrefix(cm, d); };\n prefixPreservingKeys[\"Ctrl-\" + d] = true;\n }\n for (var i = 0; i < 10; ++i) regPrefix(String(i));\n regPrefix(\"-\");\n});\n"
},
"$:/plugins/tiddlywiki/codemirror/readme": {
"title": "$:/plugins/tiddlywiki/codemirror/readme",
"text": "The CodeMirror plugin brings many features:\n\n* Code colouring for many languages (see [[the official documentation here|http://codemirror.net/mode/index.html]])\n* Auto closing brackets and tags\n* Folding brackets, comments, and tags\n* Auto-completion \n\n! Setting ~CodeMirror Content Types\n\nYou can determine which tiddler content types are edited by the ~CodeMirror widget by creating or modifying special tiddlers whose prefix is comprised of the string `$:/config/EditorTypeMappings/` concatenated with the content type. The text of that tiddler gives the editor type to be used (eg, ''text'', ''bitmap'', ''codemirror'').\n\nThe current editor type mappings are shown in [[$:/ControlPanel]] under the \"Advanced\" tab.\n\n! ~CodeMirror Configuration\n\nYou can configure the ~CodeMirror plugin by creating a tiddler called [[$:/config/CodeMirror]] containing a JSON configuration object. The configuration tiddler must have its type field set to `application/json` to take effect.\n\nSee http://codemirror.net/ for details of available configuration options.\n\nFor example:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\",\n \"$:/plugins/tiddlywiki/codemirror/keymap/vim.js\",\n \"$:/plugins/tiddlywiki/codemirror/keymap/emacs.js\"\n ],\n \"configuration\": {\n \"keyMap\": \"vim\",\n \"matchBrackets\":true,\n \"showCursorWhenSelecting\": true\n }\n}\n```\n\n!! Basic working configuration\n\n# Create a tiddler called `$:/config/CodeMirror`\n\n# The type of the tiddler has to be set to `application/json`\n\n# The text of the tiddler is the following: \n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\"\n ],\n \"configuration\": {\n \"matchBrackets\":true,\n \"showCursorWhenSelecting\": true\n }\n}\n\n```\n\n# You should see line numbers when editing a tiddler\n# When editing a tiddler, no matter what the type of the tiddler is set to, you should see matching brackets being highlighted whenever the cursor is next to one of them\n# If you edit a tiddler with the type `application/javascript` or `application/json` you should see the code being syntax highlighted\n\n!! Add HTML syntax highlighting\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[https://raw.githubusercontent.com/codemirror/CodeMirror/master/mode/xml/xml.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\"\n ],\n \"configuration\": {\n \"showCursorWhenSelecting\": true,\n \"matchBrackets\":true\n }\n}\n```\n# Edit a tiddler with the type `text/html` and write some html code. You should see your code being coloured\n\n!! Add a non-existing language mode\n\nHere's an example of adding a new language mode - in this case, the language C.\n\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/mode/clike/clike.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[https://raw.githubusercontent.com/codemirror/CodeMirror/master/mode/clike/clike.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/mode/clike/clike.js\"\n ],\n \"configuration\": {\n \"showCursorWhenSelecting\": true\n }\n}\n```\n\n# Add the correct ~EditorTypeMappings tiddler\n## Find the matching MIME type. If you go on the [[CodeMirror documentation for language modes|http://codemirror.net/mode/index.html]] you can see the [[documentation for the c-like mode|http://codemirror.net/mode/clike/index.html]]. In this documentation, at the end you will be told the MIME types defined. Here it's ''text/x-csrc''\n## Add the tiddler: `$:/config/EditorTypeMappings/text/x-csrc` and fill the text field with : ''codemirror''\n\nIf you edit a tiddler with the type `text/x-csrc` and write some code in C, you should see your text being coloured.\n\n!! Add matching tags\n\n# Add XML and HTML colouring\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/edit/matchtags.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/edit/matchtags.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchtags.js\",\n \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\"\n ],\n \"configuration\": {\n \"showCursorWhenSelecting\": true,\n \"matchTags\": {\"bothTags\": true},\n \"extraKeys\": {\"Ctrl-J\": \"toMatchingTag\"}\n }\n}\n```\n\nEdit a tiddler that has the type :`text/htm` and write this code:\n\n```\n<html>\n <div id=\"click here and press CTRL+J\">\n <ul>\n <li>\n </li>\n </ul>\n </div>\n</html>\n```\n\nIf you click on a tag and press CTRL+J, your cursor will select the matching tag. Supposedly, it should highlight the pair when clicking a tag. However, that part doesn't work.\n\n!! Adding closing tags\n\n# Add the xml mode (see \"Add XML and HTML colouring\")\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/edit/closetags.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/edit/closetag.js]]\n\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/closetags.js\"\n ],\n \"configuration\": {\n \"showCursorWhenSelecting\": true,\n \"autoCloseTags\":true\n }\n}\n```\n\nIf you edit a tiddler with the type`text/html` and write:\n\n```\n<html>\n```\n\nThen the closing tag ''</html>'' should automatically appear.\n\n!! Add closing brackets\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/edit/closebrackets.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/edit/closebrackets.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/edit/closebrackets.js\"\n ],\n\n \"configuration\": {\n\n \"showCursorWhenSelecting\": true,\n \"matchBrackets\":true,\n \"autoCloseBrackets\":true\n }\n}\n```\n\n# If you try to edit any tiddler and write `if(` you should see the bracket closing itself automatically (you will get \"if()\"). It works with (), [], and {}\n# If you try and edit a tiddler with the type `application/javascript`, it will auto-close `()`,`[]`,`{}`,`''` and `\"\"`\n\n!! Adding folding tags\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/foldcode.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/fold/foldcode.js]]\n# Repeat the above process for the following tiddlers, but replace the code with the one from the given link:\n## Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js`, the code can be found here [[https://raw.githubusercontent.com/codemirror/CodeMirror/master/addon/fold/xml-fold.js]]\n## Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/foldgutter.js`, the code can be found here [[http://codemirror.net/addon/fold/foldgutter.js]]\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/foldgutter.css`\n## Add the tag ''$:/tags/Stylesheet''\n## Set the text field of the tiddler with the css code from this link : [[http://codemirror.net/addon/fold/foldgutter.css]]\n\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n \"require\": [\n \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/fold/foldcode.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js\",\n \"$:/plugins/tiddlywiki/codemirror/addon/fold/foldgutter.js\"\n ],\n \"configuration\": {\n \"showCursorWhenSelecting\": true,\n \"matchTags\": {\"bothTags\": true},\n \"foldGutter\": true,\n \"gutters\": [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"]\n }\n}\n\n```\n\nNow if you type the below code in a tiddler with the type `text/html`:\n\n```\n<html>\n <div>\n <ul>\n\n </ul>\n </div>\n</html>\n```\n\nYou should see little arrows just next to the line numbers. Clicking on it will have the effect to fold the code (or unfold it).\n"
},
"$:/plugins/tiddlywiki/codemirror/styles": {
"title": "$:/plugins/tiddlywiki/codemirror/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* Make the editor resize to fit its content */\n\n.CodeMirror {\n\theight: auto;\n\tborder: 1px solid #ddd;\n\tline-height: 1.5;\n\tfont-family: \"Monaco\", monospace;\n}\n\n.CodeMirror-scroll {\n\toverflow-x: auto;\n\toverflow-y: hidden;\t\n}\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/highlight/highlight.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/highlight/highlight.js",
"module-type": "library",
"text": "!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&\").replace(/</gm,\"<\").replace(/>/gm,\">\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight/.test(e)})[0]}function o(e,n){var t={};for(var r in e)t[r]=e[r];if(n)for(var r in n)t[r]=n[r];return t}function i(e){var n=[];return function r(e,a){for(var o=e.firstChild;o;o=o.nextSibling)3==o.nodeType?a+=o.nodeValue.length:1==o.nodeType&&(n.push({event:\"start\",offset:a,node:o}),a=r(o,a),t(o).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:o}));return a}(e,0),n}function c(e,r,a){function o(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function i(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function c(e){l+=\"</\"+t(e)+\">\"}function u(e){(\"start\"==e.event?i:c)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=o();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=o();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(i)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function u(e){function n(e){return e&&e.source||e}function t(t,r){return RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var c={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");c[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?u(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){u(e,a.k[e])}),a.k=c}a.lR=t(a.l||/\\b[A-Za-z0-9_]+\\b/,!0),i&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&i.tE&&(a.tE+=(a.e?\"|\":\"\")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,o){function i(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function c(e,n){return r(e.eR,n)?e:e.eW?c(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=x.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":E.classPrefix,o='<span class=\"'+a,i=t?\"\":\"</span>\";return o+=e+'\">',o+n+i}function d(){if(!w.k)return n(y);var e=\"\",t=0;w.lR.lastIndex=0;for(var r=w.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(w,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=w.lR.lastIndex,r=w.lR.exec(y)}return e+n(y.substr(t))}function h(){if(w.sL&&!R[w.sL])return n(y);var e=w.sL?s(w.sL,y,!0,L[w.sL]):l(y);return w.r>0&&(B+=e.r),\"continuous\"==w.subLanguageMode&&(L[w.sL]=e.top),p(e.language,e.value,!1,!0)}function v(){return void 0!==w.sL?h():d()}function b(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(M+=r,y=\"\"):e.eB?(M+=n(t)+r,y=\"\"):(M+=r,y=t),w=Object.create(e,{parent:{value:w}})}function m(e,t){if(y+=e,void 0===t)return M+=v(),0;var r=i(t,w);if(r)return M+=v(),b(r,t),r.rB?0:t.length;var a=c(w,t);if(a){var o=w;o.rE||o.eE||(y+=t),M+=v();do w.cN&&(M+=\"</span>\"),B+=w.r,w=w.parent;while(w!=a.parent);return o.eE&&(M+=n(t)),y=\"\",a.starts&&b(a.starts,\"\"),o.rE?0:t.length}if(f(t,w))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(w.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var x=N(e);if(!x)throw new Error('Unknown language: \"'+e+'\"');u(x);for(var w=o||x,L={},M=\"\",k=w;k!=x;k=k.parent)k.cN&&(M=p(k.cN,\"\",!0)+M);var y=\"\",B=0;try{for(var C,j,I=0;;){if(w.t.lastIndex=I,C=w.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}m(t.substr(I));for(var k=w;k.parent;k=k.parent)k.cN&&(M+=\"</span>\");return{r:B,value:M,language:e,top:w}}catch(A){if(-1!=A.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw A}}function l(e,t){t=t||E.languages||Object.keys(R);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,E.tabReplace)})),E.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?x[n]:t,a=[e.trim()];return e.match(/(\\s|^)hljs(\\s|$)/)||a.push(\"hljs\"),r&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight/.test(n)){var t;E.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,o=n?s(n,r,!0):l(r),u=i(t);if(u.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=o.value,o.value=c(u,i(p),r)}o.value=f(o.value),e.innerHTML=o.value,e.className=g(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){E=o(E,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function v(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function b(n,t){var r=R[n]=t(e);r.aliases&&r.aliases.forEach(function(e){x[e]=n})}function m(){return Object.keys(R)}function N(e){return R[e]||R[x[e]]}var E={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},R={},x={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=v,e.registerLanguage=b,e.listLanguages=m,e.getLanguage=N,e.inherit=o,e.IR=\"[a-zA-Z][a-zA-Z0-9_]*\",e.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.CLCM={cN:\"comment\",b:\"//\",e:\"$\",c:[e.PWM]},e.CBCM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[e.PWM]},e.HCM={cN:\"comment\",b:\"#\",e:\"$\",c:[e.PWM]},e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});\n"
},
"$:/plugins/tiddlywiki/highlight/registerlanguages.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/highlight/registerlanguages.js",
"module-type": "library",
"text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\nhljs.registerLanguage(\"xml\",function(){var t=\"[A-Za-z0-9\\\\._:-]+\",e={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"},c={eW:!0,i:/</,r:0,c:[e,{cN:\"attribute\",b:t,r:0},{b:\"=\",r:0,c:[{cN:\"value\",c:[e],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xsl\",\"plist\"],cI:!0,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[c],starts:{e:\"</style>\",rE:!0,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[c],starts:{e:\"</script>\",rE:!0,sL:\"javascript\"}},e,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:/[^ \\/><\\n\\t]+/,r:0},c]}]}});hljs.registerLanguage(\"cpp\",function(t){var i={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginaryintmax_t uintmax_t int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_tint_least8_t uint_least8_t int_least16_t uint_least16_t int_least32_t uint_least32_tint_least64_t uint_least64_t int_fast8_t uint_fast8_t int_fast16_t uint_fast16_t int_fast32_tuint_fast32_t int_fast64_t uint_fast64_t intptr_t uintptr_t atomic_bool atomic_char atomic_scharatomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llongatomic_ullong atomic_wchar_t atomic_char16_t atomic_char32_t atomic_intmax_t atomic_uintmax_tatomic_intptr_t atomic_uintptr_t atomic_size_t atomic_ptrdiff_t atomic_int_least8_t atomic_int_least16_tatomic_int_least32_t atomic_int_least64_t atomic_uint_least8_t atomic_uint_least16_t atomic_uint_least32_tatomic_uint_least64_t atomic_int_fast8_t atomic_int_fast16_t atomic_int_fast32_t atomic_int_fast64_tatomic_uint_fast8_t atomic_uint_fast16_t atomic_uint_fast32_t atomic_uint_fast64_t\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\",\"h\",\"c++\",\"h++\"],k:i,i:\"</\",c:[t.CLCM,t.CBCM,t.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},t.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line pragma\",c:[{b:'include\\\\s*[<\"]',e:'[>\"]',k:\"include\",i:\"\\\\n\"},t.CLCM]},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:i,c:[\"self\"]},{b:t.IR+\"::\"},{bK:\"new throw return\",r:0},{cN:\"function\",b:\"(\"+t.IR+\"\\\\s+)+\"+t.IR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:i,c:[{b:t.IR+\"\\\\s*\\\\(\",rB:!0,c:[t.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:i,r:0,c:[t.CBCM]},t.CLCM,t.CBCM]}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)\\}/}]},s={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]},a={cN:\"string\",b:/'/,e:/'/};return{aliases:[\"sh\",\"zsh\"],l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",operator:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"shebang\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],r:0},e.HCM,e.NM,s,a,t]}});hljs.registerLanguage(\"java\",function(e){var a=e.UIR+\"(<\"+e.UIR+\">)?\",t=\"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private\",c=\"(\\\\b(0b[01_]+)|\\\\b0[xX][a-fA-F0-9_]+|(\\\\b[\\\\d_]+(\\\\.[\\\\d_]*)?|\\\\.[\\\\d_]+)([eE][-+]?\\\\d+)?)[lLfF]?\",r={cN:\"number\",b:c,r:0};return{aliases:[\"jsp\"],k:t,i:/<\\//,c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",r:0,c:[{cN:\"javadoctag\",b:\"(^|\\\\s)@[A-Za-z]+\"}]},e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return\",r:0},{cN:\"function\",b:\"(\"+a+\"\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,r:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:t,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},r,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"ini\",function(e){return{cI:!0,i:/\\S/,c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:!0,k:\"on off true false yes no\",c:[e.QSM,e.NM],r:0}]}]}});hljs.registerLanguage(\"objectivec\",function(e){var t={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"NSString NSData NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection NSURLSession NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadTask NSURLResponseUIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},o=/[a-zA-Z@][a-zA-Z0-9_]*/,a=\"@interface @class @protocol @implementation\";return{aliases:[\"m\",\"mm\",\"objc\",\"obj-c\"],k:t,l:o,i:\"</\",c:[e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{cN:\"title\",v:[{b:'\"',e:'\"'},{b:\"<\",e:\">\"}]}]},{cN:\"class\",b:\"(\"+a.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:a,l:o,c:[e.UTM]},{cN:\"variable\",b:\"\\\\.\"+e.UIR,r:0}]}});hljs.registerLanguage(\"php\",function(e){var c={cN:\"variable\",b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/},a={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:[\"php3\",\"php4\",\"php5\",\"php6\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.CLCM,e.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"},i]},{cN:\"comment\",b:\"__halt_compiler.+?;\",eW:!0,k:\"__halt_compiler\",l:e.UIR},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[e.BE]},i,c,{b:/->+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,a,n]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},a,n]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",reserved:\"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={cN:\"subst\",b:/#\\{/,e:/}/,k:c},r=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,t]},{b:/\"/,e:/\"/,c:[e.BE,t]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[t,e.HCM]},{b:\"//[gim]*\",r:0},{b:/\\/(?![ *])(\\\\\\/|.)*?\\/[gim]*(?=\\W|$)/}]},{cN:\"property\",b:\"@\"+n},{b:\"`\",e:\"`\",eB:!0,eE:!0,sL:\"javascript\"}];t.c=r;var i=e.inherit(e.TM,{b:n}),s=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",o={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(r)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:r.concat([{cN:\"comment\",b:\"###\",e:\"###\",c:[e.PWM]},e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+s,e:\"[-=]>\",rB:!0,c:[i,o]},{b:/[:\\(,=]\\s*/,r:0,c:[{cN:\"function\",b:s,e:\"[-=]>\",rB:!0,c:[o]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[i]},i]},{cN:\"attribute\",b:n+\":\",e:\":\",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage(\"sql\",function(e){var t={cN:\"comment\",b:\"--\",e:\"$\"};return{cI:!0,i:/[<>]/,c:[{cN:\"operator\",bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate savepoint release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup\",e:/;/,eW:!0,k:{keyword:\"abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length character_length charindex charset check checksum checksum_agg choose close coalesce coercibility collate collation collationproperty column columns columns_updated commit compress concat concat_ws concurrent connect connection connection_id consistent constraint constraints continue contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime data database databases datalength date_add date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec engine engines eomonth errors escape escaped event eventdata events except exception exec execute exists exp explain export_set extended external extract fast fetch field fields find_in_set first first_value floor flush for force foreign format found found_rows from from_base64 from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner innodb input insert install instr intersect into is is_free_lock is_ipv4 is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names national natural nchar next no no_write_to_binlog not now nullif nvarchar oct octet_length of old_password on only open optimize option optionally or ord order outer outfile output pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges procedure procedure_analyze processlist profile profiles public publishingservername purge quarter query quick quote quotename radians rand read references regexp relative relaylog release release_lock rename repair repeat replace replicate reset restore restrict return returns reverse revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll sec_to_time second section select serializable server session session_user set sha sha1 sha2 share show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sql_variant_property sqlstate sqrt square start starting status std stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short validate_password_strength value values var var_pop var_samp variables variance varp version view warnings week weekday weekofyear weight_string when whenever where with work write xml xor year yearweek zon\",literal:\"true false null\",built_in:\"array bigint binary bit blob boolean char character date dec decimal float int integer interval number numeric real serial smallint varchar varying int8 serial8 text\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage(\"http\",function(){return{i:\"\\\\S\",c:[{cN:\"status\",b:\"^HTTP/[0-9\\\\.]+\",e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{cN:\"request\",b:\"^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:\"\",eW:!0}}]}});hljs.registerLanguage(\"makefile\",function(e){var a={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]};return{aliases:[\"mk\",\"mak\"],c:[e.HCM,{b:/^\\w+\\s*\\W*=/,rB:!0,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:!0,starts:{e:/$/,r:0,c:[a]}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,r:0,c:[e.QSM,a]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$\\%\\@](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},{b:/[\\$\\%\\@][^\\s\\w{]/,r:0}]},o={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5},i=[e.BE,r,n],c=[n,e.HCM,o,{cN:\"comment\",b:\"^\\\\=\\\\w\",e:\"\\\\=cut\",eW:!0},s,{cN:\"string\",c:i,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[e.HCM,o,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0}];return r.c=c,s.c=c,{aliases:[\"pl\"],k:t,c:c}});hljs.registerLanguage(\"ruby\",function(e){var b=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",r=\"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",c={cN:\"yardoctag\",b:\"@[A-Za-z]+\"},a={cN:\"value\",b:\"#<\",e:\">\"},s={cN:\"comment\",v:[{b:\"#\",e:\"$\",c:[c]},{b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[c],r:10},{b:\"^__END__\",e:\"\\\\n$\"}]},n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:r},t={cN:\"string\",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:r},d=[t,a,s,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+e.IR+\"::)?\"+e.IR}]},s]},{cN:\"function\",bK:\"def\",e:\" |$|;\",r:0,c:[e.inherit(e.TM,{b:b}),i,s]},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"symbol\",b:\":\",c:[t,{b:b}],r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[a,s,{cN:\"regexp\",c:[e.BE,n],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],r:0}];n.c=d,i.c=d;var l=\"[>?]>\",u=\"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>\",N=\"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>\",o=[{b:/^\\s*=>/,cN:\"status\",starts:{e:\"$\",c:d}},{cN:\"prompt\",b:\"^(\"+l+\"|\"+u+\"|\"+N+\")\",starts:{e:\"$\",c:d}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:r,c:[s].concat(o).concat(d)}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"tag\",b:\"</?\",e:\">\"},{cN:\"keyword\",b:/\\w+/,r:0,k:{common:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});hljs.registerLanguage(\"css\",function(e){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\",a={cN:\"function\",b:c+\"\\\\(\",rB:!0,eE:!0,e:\"\\\\(\"};return{cI:!0,i:\"[=/|']\",c:[e.CBCM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:!0,eE:!0,r:0,c:[a,e.ASM,e.QSM,e.CSSNM]}]},{cN:\"tag\",b:c,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[e.CBCM,{cN:\"rule\",b:\"[^\\\\s]\",rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:!0,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:!0,eE:!0,c:[a,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{built_in:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"title\",b:e.UIR,starts:b}],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"cs\",function(e){var r=\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long null object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async protected public private internal ascending descending from get group into join let orderby partial select set value var where yield\",t=e.IR+\"(<\"+e.IR+\">)?\";return{aliases:[\"csharp\"],k:r,i:/::/,c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:!0,c:[{cN:\"xmlDocTag\",v:[{b:\"///\",r:0},{b:\"<!--|-->\"},{b:\"</?\",e:\">\"}]}]},e.CLCM,e.CBCM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},e.ASM,e.QSM,e.CNM,{bK:\"class namespace interface\",e:/[{;=]/,i:/[^\\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"new return throw await\",r:0},{cN:\"function\",b:\"(\"+t+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"markdown\",function(){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"header\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"`.+?`\"},{b:\"^( {4}|\t)\",e:\"$\",r:0}]},{cN:\"horizontal_rule\",b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],r:10},{b:\"^\\\\[.+\\\\]:\",rB:!0,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]:\",eB:!0,eE:!0,starts:{cN:\"link_url\",e:\"$\"}}]}]}});hljs.registerLanguage(\"diff\",function(){return{aliases:[\"patch\"],c:[{cN:\"chunk\",r:10,v:[{b:/^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"header\",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\\-\\-\\-/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+\\+\\+/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"javascript\",function(r){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document\"},c:[{cN:\"pi\",r:10,v:[{b:/^\\s*('|\")use strict('|\")/},{b:/^\\s*('|\")use asm('|\")/}]},r.ASM,r.QSM,r.CLCM,r.CBCM,r.CNM,{b:\"(\"+r.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[r.CLCM,r.CBCM,r.RM,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[r.inherit(r.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[r.CLCM,r.CBCM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+r.IR,r:0}]}});hljs.registerLanguage(\"python\",function(e){var r={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /},b={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},l={cN:\"number\",r:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},c={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",r,l,b]};return{aliases:[\"py\",\"gyp\"],k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[r,l,b,e.HCM,{v:[{cN:\"function\",bK:\"def\",r:10},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n]/,c:[e.UTM,c]},{cN:\"decorator\",b:/@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});\n\nexports.hljs = hljs;\n"
},
"$:/plugins/tiddlywiki/highlight/highlight.css": {
"type": "text/css",
"title": "$:/plugins/tiddlywiki/highlight/highlight.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": ".hljs{display:block;overflow-x:auto;padding:.5em;background:#f0f0f0;-webkit-text-size-adjust:none}.hljs,.hljs-subst,.hljs-tag .hljs-title,.nginx .hljs-title{color:#000}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-preprocessor,.hljs-pragma,.haml .hljs-symbol,.ruby .hljs-symbol,.ruby .hljs-symbol .hljs-string,.hljs-template_tag,.django .hljs-variable,.smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.bash .hljs-variable,.apache .hljs-tag,.apache .hljs-cbracket,.tex .hljs-command,.tex .hljs-special,.erlang_repl .hljs-function_or_atom,.asciidoc .hljs-header,.markdown .hljs-header,.coffeescript .hljs-attribute{color:#800}.smartquote,.hljs-comment,.hljs-annotation,.diff .hljs-header,.hljs-chunk,.asciidoc .hljs-blockquote,.markdown .hljs-blockquote{color:#888}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-hexcolor,.smalltalk .hljs-symbol,.smalltalk .hljs-char,.go .hljs-constant,.hljs-change,.lasso .hljs-variable,.makefile .hljs-variable,.asciidoc .hljs-bullet,.markdown .hljs-bullet,.asciidoc .hljs-link_url,.markdown .hljs-link_url{color:#080}.hljs-label,.hljs-javadoc,.ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.haml .hljs-bullet,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.apache .hljs-sqbracket,.nginx .hljs-built_in,.tex .hljs-formula,.erlang_repl .hljs-reserved,.hljs-prompt,.asciidoc .hljs-link_label,.markdown .hljs-link_label,.vhdl .hljs-attribute,.clojure .hljs-attribute,.asciidoc .hljs-attribute,.lasso .hljs-attribute,.coffeescript .hljs-property,.hljs-phony{color:#88f}.hljs-keyword,.hljs-id,.hljs-title,.hljs-built_in,.css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-dartdoc,.hljs-yardoctag,.smalltalk .hljs-class,.hljs-winutils,.bash .hljs-variable,.apache .hljs-tag,.hljs-type,.hljs-typename,.tex .hljs-command,.asciidoc .hljs-strong,.markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:bold}.asciidoc .hljs-emphasis,.markdown .hljs-emphasis{font-style:italic}.nginx .hljs-built_in{font-weight:normal}.coffeescript .javascript,.javascript .xml,.lasso .markup,.tex .hljs-formula,.xml .javascript,.xml .vbscript,.xml .css,.xml .hljs-cdata{opacity:.5}"
},
"$:/plugins/tiddlywiki/highlight/highlightblock.js": {
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n//register languages requires hljs for us\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/registerlanguages.js\").hljs;\nhljs.configure({tabReplace: \" \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0];\n\tif($tw.browser && this.document !== $tw.fakeDocument && this.language) {\n\t\tdomNode.className = this.language.toLowerCase();\n\t\thljs.highlightBlock(domNode);\n\t}\n\telse if(!$tw.browser && this.language && this.language.indexOf(\"/\") == -1 ){\n\t\ttry{\n\t\t\tdomNode.className = this.language.toLowerCase() + \" hljs\";\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(this.language, this.getAttribute(\"code\")).value);\n\t\t}\n\t\tcatch(err) {\n\t\t\t//can't easily tell if a language is registered or not in the packed version of hightlight.js\n\t\t\t//so we silently fail and the codeblock remains unchanged\n\t\t}\n\t}\t\n};\n\n})();\n",
"title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/highlight/license": {
"title": "$:/plugins/tiddlywiki/highlight/license",
"type": "text/plain",
"text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of highlight.js nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
"$:/plugins/tiddlywiki/highlight/styles": {
"title": "$:/plugins/tiddlywiki/highlight/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\n/* Tomorrow Night Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment {\n color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n color: #cc6666;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n color: #de935f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n color: #f0c674;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n color: #b5bd68;\n}\n\n/* Tomorrow Aqua */\n.hljs-title,\n.css .hljs-hexcolor {\n color: #8abeb7;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n color: #81a2be;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n color: #b294bb;\n}\n\n.hljs {\n display: block;\n overflow-x: auto;\n background: #1d1f21;\n color: #c5c8c6;\n padding: 0.5em;\n -webkit-text-size-adjust: none;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n opacity: 0.5;\n}"
}
}
}
$:/core/ui/ControlPanel/Saving
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-title {\n position: -webkit-sticky;\n position: -moz-sticky;\n position: -o-sticky;\n position: -ms-sticky;\n position: sticky;\n top: 0px;\n background: <<colour tiddler-background>>;\n z-index: 500;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"5px 5px 5px rgba(0, 0, 0, 0.1)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected svg {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal-displayed {\n\t-webkit-filter: blur(4px);\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\t<<background-linear-gradient \"left, rgb(216,216,216) 0%, rgb(236,236,236) 250px\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(224,224,224) 100%\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(248,248,248) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"2px 2px 4px rgba(0,0,0,0.2)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "Theme Tweaks",
"text": "You can tweak certain aspects of the ''Vanilla'' theme.\n\n! Settings\n\n* [[Font family|$:/themes/tiddlywiki/vanilla/settings/fontfamily]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/>\n\n! Sizes\n\n* [[Font size|$:/themes/tiddlywiki/vanilla/metrics/fontsize]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/>\n* [[Line height|$:/themes/tiddlywiki/vanilla/metrics/lineheight]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/>\n* [[Font size for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/>\n* [[Line height for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodylineheight]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/>\n* [[Story left position|$:/themes/tiddlywiki/vanilla/metrics/storyleft]] //(the distance between the left of the screen and the left margin of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/>\n* [[Story top position|$:/themes/tiddlywiki/vanilla/metrics/storytop]] //(the distance between the top of the screen and the top margin of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/>\n* [[Story right|$:/themes/tiddlywiki/vanilla/metrics/storyright]] //(the distance between the left side of the screen and the left margin of the sidebar area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/>\n* [[Story width|$:/themes/tiddlywiki/vanilla/metrics/storywidth]] //(the width of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/>\n* [[Tiddler width|$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth]] //(the width of individual tiddlers -- used for zoomin storyview)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/>\n* [[Sidebar breakpoint|$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint]] //(the minimum width for the sidebar to be displayed alongside the story river)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/>\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\t\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tword-wrap: break-word;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n white-space: pre-wrap;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: normal;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: absolute;\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-btn-big-green {\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 300;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour tag-foreground>>;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-search-results {\n\tpadding-top: 14px;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg,\n.tc-search svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: auto;\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 28px;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor, .tc-tiddler-frame textarea.tc-edit-texteditor {\n\twidth: 100%;\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 48%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 3px 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n.tc-tiddler-preview-edit {\n\twidth: 48%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n\twidth: calc(100% - 84px);\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down-language-chooser img {\n\twidth: 2em;\n\tvertical-align: baseline;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: relative;\n\t\twidth: 50%;\n\t\tmargin: 30px auto;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tmax-width: 500px;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 28px;\n\tpadding: 14px 14px 14px 14px;\n\tborder: 2px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 14px;\n\tright: 14px;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\t\n}\n\n.tc-static-alert {\n\tposition: relative;\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n\tposition: absolute;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: block;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground-colour: <<colour background>>;\n\tmargin: 1em 0 1em 0;\n\tpadding: 8px;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n\tdisplay: inline-block;\n\tvertical-align: middle;\t\n}\n\na.tc-plugin-info img, a.tc-plugin-info svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 1em 1em 1em 1em;\n\tmargin-top: -1em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder: 1px solid <<colour table-border>>;\n}\n\n.tc-chooser-item {\n\tborder: 8px;\n}\n\n.tc-chooser-item a.tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-foreground>>;\n\tbackground-color: <<colour tiddler-link-background>>;\n\tmargin: 4px;\n}\n\n.tc-chooser-item a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 4px;\n\tborder: 1px solid #000;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9.\n * Hide the `template` element in IE, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari 5, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8+, and Opera\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "\"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif"
}
}
}
socialcalc:version:1.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
# SocialCalc Spreadsheet Control Save
version:1.0
part:sheet
part:edit
part:audit
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.5
cell:A1:t:I:f:1
cell:B1:t:l
cell:C1:t: :f:1
cell:D1:t:p
cell:E1:t:l:f:1
cell:F1:t:e
cell:G1:t:u
cell:H1:t:t
cell:I1:t:
cell:J1:t:d
cell:K1:t:e
cell:L1:t:s
cell:M1:t:
cell:N1:t:v
cell:O1:t:o
cell:P1:t:i
cell:Q1:t:x
cell:R1:t:
cell:S1:t:d
cell:T1:t:e
cell:U1:t:
cell:V1:t:f
cell:W1:t:e
cell:X1:t:m
cell:Y1:t:m
cell:Z1:t:e
cell:AA1:t:s
cell:AB1:t:
cell:AC1:t:c
cell:AD1:t:o
cell:AE1:t:m
cell:AF1:t:m
cell:AG1:t:e
cell:AH1:t:
cell:AI1:t:s
cell:AJ1:t:i
cell:AK1:t:
cell:AL1:t:e
cell:AM1:t:l
cell:AN1:t:l
cell:AO1:t:e
cell:AP1:t:s
cell:AQ1:t:
cell:AR1:t:é
cell:AS1:t:t
cell:AT1:t:a
cell:AU1:t:i
cell:AV1:t:e
cell:AW1:t:n
cell:AX1:t:t
cell:AY1:t:
cell:AZ1:t:m
cell:BA1:t:o
cell:BB1:t:r
cell:BC1:t:t
cell:BD1:t:e
cell:BE1:t:s
cell:BF1:t:
cell:BG1:t:m
cell:BH1:t:ê
cell:BI1:t:m
cell:BJ1:t:e
cell:BK1:t:
cell:BL1:t:d
cell:BM1:t:a
cell:BN1:t:n
cell:BO1:t:s
cell:BP1:t:
cell:BQ1:t:l
cell:BR1:t:e
cell:BS1:t:
cell:BT1:t:s
cell:BU1:t:o
cell:BV1:t:u
cell:BW1:t:v
cell:BX1:t:e
cell:BY1:t:n
cell:BZ1:t:i
cell:CA1:t:r
cell:A2:t:c
cell:B2:t:'
cell:C2:t:e
cell:D2:t:s
cell:E2:t:t
cell:F2:t:
cell:G2:t:v
cell:H2:t:o
cell:I2:t:u
cell:J2:t:s
cell:K2:t:
cell:L2:t:a
cell:M2:t:u
cell:N2:t:s
cell:O2:t:s
cell:P2:t:i
cell:Q2:t:
cell:R2:t:q
cell:S2:t:u
cell:T2:t:'
cell:U2:t:i
cell:V2:t:l
cell:W2:t:
cell:X2:t:p
cell:Y2:t:l
cell:Z2:t:e
cell:AA2:t:u
cell:AB2:t:t
cell:AC2:t:
cell:AD2:t:m
cell:AE2:t:e
cell:AF2:t:r
cell:AG2:t:v
cell:AH2:t:e
cell:AI2:t:i
cell:AJ2:t:l
cell:AK2:t:l
cell:AL2:t:e
cell:AM2:t:u
cell:AN2:t:s
cell:AO2:t:e
cell:AP2:t:s
cell:AQ2:t:
cell:AR2:t:r
cell:AS2:t:e
cell:AT2:t:n
cell:AU2:t:c
cell:AV2:t:o
cell:AW2:t:n
cell:AX2:t:t
cell:AY2:t:r
cell:AZ2:t:e
cell:BA2:t:s
cell:BB2:t:
cell:BC2:t:d
cell:BD2:t:e
cell:BE2:t:
cell:BF2:t:m
cell:BG2:t:a
cell:BH2:t:
cell:BI2:t:v
cell:BJ2:t:i
cell:BK2:t:e
cell:BL2:t:
cell:BM2:t:ô
cell:BN2:t:
cell:BO2:t:g
cell:BP2:t:o
cell:BQ2:t:u
cell:BR2:t:t
cell:BS2:t:t
cell:BT2:t:e
cell:BU2:t:l
cell:BV2:t:e
cell:BW2:t:t
cell:BX2:t:t
cell:BY2:t:e
cell:BZ2:t:s
cell:CA2:t:
cell:CB2:t:
cell:A3:t:e
cell:B3:t:t
cell:C3:t:
cell:D3:t:c
cell:E3:t:e
cell:F3:t:s
cell:G3:t:
cell:H3:t:n
cell:I3:t:u
cell:J3:t:a
cell:K3:t:g
cell:L3:t:e
cell:M3:t:s
cell:N3:t:
cell:O3:t:c
cell:P3:t:a
cell:Q3:t:b
cell:R3:t:r
cell:S3:t:é
cell:T3:t:s
cell:U3:t:
cell:V3:t:s
cell:W3:t:e
cell:X3:t:
cell:Y3:t:p
cell:Z3:t:r
cell:AA3:t:e
cell:AB3:t:n
cell:AC3:t:n
cell:AD3:t:e
cell:AE3:t:n
cell:AF3:t:t
cell:AG3:t:
cell:AH3:t:à
cell:AI3:t:
cell:AJ3:t:h
cell:AK3:t:e
cell:AL3:t:n
cell:AM3:t:n
cell:AN3:t:i
cell:AO3:t:r
cell:AP3:t:
cell:AQ3:t:t
cell:AR3:t:o
cell:AS3:t:u
cell:AT3:t:t
cell:AU3:t:
cell:AV3:t:u
cell:AW3:t:n
cell:AX3:t:
cell:AY3:t:u
cell:AZ3:t:n
cell:BA3:t:i
cell:BB3:t:v
cell:BC3:t:e
cell:BD3:t:r
cell:BE3:t:s
cell:BF3:t:
cell:BG3:t:d
cell:BH3:t:e
cell:BI3:t:
cell:BJ3:t:v
cell:BK3:t:i
cell:BL3:t:l
cell:BM3:t:l
cell:BN3:t:e
cell:BO3:t:s
cell:BP3:t:
cell:BQ3:t:a
cell:BR3:t:u
cell:BS3:t:r
cell:BT3:t:i
cell:BU3:t:c
cell:BV3:t:u
cell:BW3:t:l
cell:BX3:t:a
cell:BY3:t:i
cell:BZ3:t:r
cell:CA3:t:e
cell:CB3:t:s
cell:A4:t:é
cell:B4:t:c
cell:C4:t:o
cell:D4:t:u
cell:E4:t:t
cell:F4:t:e
cell:G4:t:
cell:H4:t:s
cell:I4:t:'
cell:J4:t:i
cell:K4:t:l
cell:L4:t:
cell:M4:t:p
cell:N4:t:l
cell:O4:t:e
cell:P4:t:u
cell:Q4:t:t
cell:R4:t:
cell:S4:t:t
cell:T4:t:a
cell:U4:t:n
cell:V4:t:d
cell:W4:t:i
cell:X4:t:s
cell:Y4:t:
cell:Z4:t:q
cell:AA4:t:u
cell:AB4:t:e
cell:AC4:t:
cell:AD4:t:l
cell:AE4:t:e
cell:AF4:t:
cell:AG4:t:r
cell:AH4:t:e
cell:AI4:t:g
cell:AJ4:t:r
cell:AK4:t:e
cell:AL4:t:t
cell:AM4:t:
cell:AN4:t:e
cell:AO4:t:t
cell:AP4:t:
cell:AQ4:t:l
cell:AR4:t:e
cell:AS4:t:
cell:AT4:t:d
cell:AU4:t:é
cell:AV4:t:d
cell:AW4:t:a
cell:AX4:t:i
cell:AY4:t:n
cell:AZ4:t:
cell:BA4:t:p
cell:BB4:t:l
cell:BC4:t:e
cell:BD4:t:u
cell:BE4:t:r
cell:BF4:t:e
cell:BG4:t:n
cell:BH4:t:t
cell:BI4:t:
cell:BJ4:t:u
cell:BK4:t:n
cell:BL4:t:e
cell:BM4:t:
cell:BN4:t:a
cell:BO4:t:n
cell:BP4:t:c
cell:BQ4:t:i
cell:BR4:t:e
cell:BS4:t:n
cell:BT4:t:n
cell:BU4:t:e
cell:BV4:t:
cell:BW4:t:m
cell:BX4:t:u
cell:BY4:t:s
cell:BZ4:t:i
cell:CA4:t:q
cell:CB4:t:u
cell:CC4:t:e
cell:A5:t:é
cell:B5:t:c
cell:C5:t:o
cell:D5:t:u
cell:E5:t:t
cell:F5:t:e
cell:G5:t:
cell:H5:t:t
cell:I5:t:o
cell:J5:t:m
cell:K5:t:b
cell:L5:t:e
cell:M5:t:r
cell:N5:t:
cell:O5:t:l
cell:P5:t:e
cell:Q5:t:s
cell:R5:t:
cell:S5:t:l
cell:T5:t:i
cell:U5:t:e
cell:V5:t:n
cell:W5:t:s
cell:X5:t:
cell:Y5:t:q
cell:Z5:t:u
cell:AA5:t:i
cell:AB5:t:
cell:AC5:t:t
cell:AD5:t:e
cell:AE5:t:
cell:AF5:t:r
cell:AG5:t:e
cell:AH5:t:t
cell:AI5:t:i
cell:AJ5:t:e
cell:AK5:t:n
cell:AL5:t:n
cell:AM5:t:e
cell:AN5:t:n
cell:AO5:t:t
cell:AP5:t:
cell:AQ5:t:e
cell:AR5:t:n
cell:AS5:t:
cell:AT5:t:h
cell:AU5:t:a
cell:AV5:t:u
cell:AW5:t:t
cell:AX5:t:
cell:AY5:t:e
cell:AZ5:t:t
cell:BA5:t:
cell:BB5:t:e
cell:BC5:t:n
cell:BD5:t:
cell:BE5:t:b
cell:BF5:t:a
cell:BG5:t:s
cell:E8:vtf:t:I:a1:f:1
cell:F8:f:1
cell:G8:f:1
cell:H8:f:1
cell:I8:f:1
cell:J8:f:1
cell:K8:f:1
cell:L8:f:1
cell:M8:f:1
cell:N8:f:1
cell:O8:f:1
cell:P8:f:1
cell:Q8:vtf:t:c:a2:f:1
cell:R8:f:1
cell:S8:f:1
cell:T8:f:1
cell:U8:f:1
cell:V8:vtf:t:e:a3:f:1
cell:W8:f:1
cell:X8:f:1
cell:Y8:f:1
cell:Z8:f:1
cell:AA8:vtf:t:é:a4:f:1
cell:AB8:f:1
cell:AC8:f:1
cell:AD8:f:1
cell:AE8:f:1
cell:AF8:vtf:t:é:a5:f:1
cell:AG8:f:1
cell:AH8:f:1
cell:AI8:f:1
cell:AJ8:f:1
cell:AK8:f:1
cell:AL8:f:1
cell:AM8:f:1
cell:AN8:f:1
cell:AO8:f:1
cell:AP8:f:1
cell:AQ8:f:1
cell:AR8:f:1
cell:AS8:f:1
cell:AT8:f:1
cell:AU8:f:1
cell:AV8:f:1
cell:AW8:f:1
cell:AX8:f:1
cell:AY8:f:1
cell:AZ8:f:1
cell:BA8:f:1
cell:BB8:f:1
cell:BC8:f:1
cell:BD8:f:1
cell:BE8:f:1
cell:BF8:f:1
cell:BG8:f:1
cell:BH8:f:1
cell:BI8:f:1
cell:BJ8:f:1
cell:BK8:f:1
cell:BL8:f:1
cell:BM8:f:1
cell:BN8:f:1
cell:BO8:f:1
cell:BP8:f:1
cell:BQ8:f:1
cell:BR8:f:1
cell:BS8:f:1
cell:BT8:f:1
cell:BU8:f:1
cell:BV8:f:1
cell:BW8:f:1
cell:BX8:f:1
cell:BY8:f:1
cell:BZ8:f:1
cell:CA8:f:1
cell:CB8:f:1
cell:CC8:f:1
cell:E9:f:1
cell:F9:vtf:t:l:b1:f:1
cell:G9:f:1
cell:H9:f:1
cell:I9:f:1
cell:J9:f:1
cell:K9:f:1
cell:L9:f:1
cell:M9:f:1
cell:N9:f:1
cell:O9:f:1
cell:P9:f:1
cell:Q9:vtf:t:':b2:f:1
cell:R9:f:1
cell:S9:f:1
cell:T9:f:1
cell:U9:f:1
cell:V9:f:1
cell:W9:vtf:t:t:b3:f:1
cell:X9:f:1
cell:Y9:f:1
cell:Z9:f:1
cell:AA9:f:1
cell:AB9:vtf:t:c:b4:f:1
cell:AC9:f:1
cell:AD9:f:1
cell:AE9:f:1
cell:AF9:vtf:t:c:b5:f:1
cell:AG9:f:1
cell:AH9:f:1
cell:AI9:f:1
cell:AJ9:f:1
cell:AK9:f:1
cell:AL9:f:1
cell:AM9:f:1
cell:AN9:f:1
cell:AO9:f:1
cell:AP9:f:1
cell:AQ9:f:1
cell:AR9:f:1
cell:AS9:f:1
cell:AT9:f:1
cell:AU9:f:1
cell:AV9:f:1
cell:AW9:f:1
cell:AX9:f:1
cell:AY9:f:1
cell:AZ9:f:1
cell:BA9:f:1
cell:BB9:f:1
cell:BC9:f:1
cell:BD9:f:1
cell:BE9:f:1
cell:BF9:f:1
cell:BG9:f:1
cell:BH9:f:1
cell:BI9:f:1
cell:BJ9:f:1
cell:BK9:f:1
cell:BL9:f:1
cell:BM9:f:1
cell:BN9:f:1
cell:BO9:f:1
cell:BP9:f:1
cell:BQ9:f:1
cell:BR9:f:1
cell:BS9:f:1
cell:BT9:f:1
cell:BU9:f:1
cell:BV9:f:1
cell:BW9:f:1
cell:BX9:f:1
cell:BY9:f:1
cell:BZ9:f:1
cell:CA9:f:1
cell:CB9:f:1
cell:CC9:f:1
cell:E10:f:1
cell:F10:f:1
cell:G10:vtf:t: :c1:f:1
cell:H10:f:1
cell:I10:f:1
cell:J10:f:1
cell:K10:f:1
cell:L10:f:1
cell:M10:f:1
cell:N10:f:1
cell:O10:f:1
cell:P10:f:1
cell:Q10:f:1
cell:R10:vtf:t:e:c2:f:1
cell:S10:f:1
cell:T10:f:1
cell:U10:f:1
cell:V10:f:1
cell:W10:f:1
cell:X10:vtf:t: :c3:f:1
cell:Y10:f:1
cell:Z10:f:1
cell:AA10:f:1
cell:AB10:vtf:t:o:c4:f:1
cell:AC10:f:1
cell:AD10:f:1
cell:AE10:f:1
cell:AF10:f:1
cell:AG10:vtf:t:o:c5:f:1
cell:AH10:f:1
cell:AI10:f:1
cell:AJ10:f:1
cell:AK10:f:1
cell:AL10:f:1
cell:AM10:f:1
cell:AN10:f:1
cell:AO10:f:1
cell:AP10:f:1
cell:AQ10:f:1
cell:AR10:f:1
cell:AS10:f:1
cell:AT10:f:1
cell:AU10:f:1
cell:AV10:f:1
cell:AW10:f:1
cell:AX10:f:1
cell:AY10:f:1
cell:AZ10:f:1
cell:BA10:f:1
cell:BB10:f:1
cell:BC10:f:1
cell:BD10:f:1
cell:BE10:f:1
cell:BF10:f:1
cell:BG10:f:1
cell:BH10:f:1
cell:BI10:f:1
cell:BJ10:f:1
cell:BK10:f:1
cell:BL10:f:1
cell:BM10:f:1
cell:BN10:f:1
cell:BO10:f:1
cell:BP10:f:1
cell:BQ10:f:1
cell:BR10:f:1
cell:BS10:f:1
cell:BT10:f:1
cell:BU10:f:1
cell:BV10:f:1
cell:BW10:f:1
cell:BX10:f:1
cell:BY10:f:1
cell:BZ10:f:1
cell:CA10:f:1
cell:CB10:f:1
cell:CC10:f:1
cell:E11:f:1
cell:F11:f:1
cell:G11:vtf:t:p:d1:f:1
cell:H11:f:1
cell:I11:f:1
cell:J11:f:1
cell:K11:f:1
cell:L11:f:1
cell:M11:f:1
cell:N11:f:1
cell:O11:f:1
cell:P11:f:1
cell:Q11:f:1
cell:R11:vtf:t:s:d2:f:1
cell:S11:f:1
cell:T11:f:1
cell:U11:f:1
cell:V11:f:1
cell:W11:f:1
cell:X11:vtf:t:c:d3:f:1
cell:Y11:f:1
cell:Z11:f:1
cell:AA11:f:1
cell:AB11:f:1
cell:AC11:vtf:t:u:d4:f:1
cell:AD11:f:1
cell:AE11:f:1
cell:AF11:f:1
cell:AG11:f:1
cell:AH11:vtf:t:u:d5:f:1
cell:AI11:f:1
cell:AJ11:f:1
cell:AK11:f:1
cell:AL11:f:1
cell:AM11:f:1
cell:AN11:f:1
cell:AO11:f:1
cell:AP11:f:1
cell:AQ11:f:1
cell:AR11:f:1
cell:AS11:f:1
cell:AT11:f:1
cell:AU11:f:1
cell:AV11:f:1
cell:AW11:f:1
cell:AX11:f:1
cell:AY11:f:1
cell:AZ11:f:1
cell:BA11:f:1
cell:BB11:f:1
cell:BC11:f:1
cell:BD11:f:1
cell:BE11:f:1
cell:BF11:f:1
cell:BG11:f:1
cell:BH11:f:1
cell:BI11:f:1
cell:BJ11:f:1
cell:BK11:f:1
cell:BL11:f:1
cell:BM11:f:1
cell:BN11:f:1
cell:BO11:f:1
cell:BP11:f:1
cell:BQ11:f:1
cell:BR11:f:1
cell:BS11:f:1
cell:BT11:f:1
cell:BU11:f:1
cell:BV11:f:1
cell:BW11:f:1
cell:BX11:f:1
cell:BY11:f:1
cell:BZ11:f:1
cell:CA11:f:1
cell:CB11:f:1
cell:CC11:f:1
cell:E12:f:1
cell:F12:f:1
cell:G12:f:1
cell:H12:vtf:t:l:e1:f:1
cell:I12:f:1
cell:J12:f:1
cell:K12:f:1
cell:L12:f:1
cell:M12:f:1
cell:N12:f:1
cell:O12:f:1
cell:P12:f:1
cell:Q12:f:1
cell:R12:f:1
cell:S12:vtf:t:t:e2:f:1
cell:T12:f:1
cell:U12:f:1
cell:V12:f:1
cell:W12:f:1
cell:X12:f:1
cell:Y12:vtf:t:e:e3:f:1
cell:Z12:f:1
cell:AA12:f:1
cell:AB12:f:1
cell:AC12:vtf:t:t:e4:f:1
cell:AD12:f:1
cell:AE12:f:1
cell:AF12:f:1
cell:AG12:f:1
cell:AH12:f:1
cell:AI12:vtf:t:t:e5:f:1
cell:AJ12:f:1
cell:AK12:f:1
cell:AL12:f:1
cell:AM12:f:1
cell:AN12:f:1
cell:AO12:f:1
cell:AP12:f:1
cell:AQ12:f:1
cell:AR12:f:1
cell:AS12:f:1
cell:AT12:f:1
cell:AU12:f:1
cell:AV12:f:1
cell:AW12:f:1
cell:AX12:f:1
cell:AY12:f:1
cell:AZ12:f:1
cell:BA12:f:1
cell:BB12:f:1
cell:BC12:f:1
cell:BD12:f:1
cell:BE12:f:1
cell:BF12:f:1
cell:BG12:f:1
cell:BH12:f:1
cell:BI12:f:1
cell:BJ12:f:1
cell:BK12:f:1
cell:BL12:f:1
cell:BM12:f:1
cell:BN12:f:1
cell:BO12:f:1
cell:BP12:f:1
cell:BQ12:f:1
cell:BR12:f:1
cell:BS12:f:1
cell:BT12:f:1
cell:BU12:f:1
cell:BV12:f:1
cell:BW12:f:1
cell:BX12:f:1
cell:BY12:f:1
cell:BZ12:f:1
cell:CA12:f:1
cell:CB12:f:1
cell:CC12:f:1
cell:E13:f:1
cell:F13:f:1
cell:G13:f:1
cell:H13:f:1
cell:I13:vtf:t:e:f1:f:1
cell:J13:f:1
cell:K13:f:1
cell:L13:f:1
cell:M13:f:1
cell:N13:f:1
cell:O13:f:1
cell:P13:f:1
cell:Q13:f:1
cell:R13:f:1
cell:S13:vtf:t: :f2:f:1
cell:T13:f:1
cell:U13:f:1
cell:V13:f:1
cell:W13:f:1
cell:X13:f:1
cell:Y13:vtf:t:s:f3:f:1
cell:Z13:f:1
cell:AA13:f:1
cell:AB13:f:1
cell:AC13:f:1
cell:AD13:vtf:t:e:f4:f:1
cell:AE13:f:1
cell:AF13:f:1
cell:AG13:f:1
cell:AH13:f:1
cell:AI13:vtf:t:e:f5:f:1
cell:AJ13:f:1
cell:AK13:f:1
cell:AL13:f:1
cell:AM13:f:1
cell:AN13:f:1
cell:AO13:f:1
cell:AP13:f:1
cell:AQ13:f:1
cell:AR13:f:1
cell:AS13:f:1
cell:AT13:f:1
cell:AU13:f:1
cell:AV13:f:1
cell:AW13:f:1
cell:AX13:f:1
cell:AY13:f:1
cell:AZ13:f:1
cell:BA13:f:1
cell:BB13:f:1
cell:BC13:f:1
cell:BD13:f:1
cell:BE13:f:1
cell:BF13:f:1
cell:BG13:f:1
cell:BH13:f:1
cell:BI13:f:1
cell:BJ13:f:1
cell:BK13:f:1
cell:BL13:f:1
cell:BM13:f:1
cell:BN13:f:1
cell:BO13:f:1
cell:BP13:f:1
cell:BQ13:f:1
cell:BR13:f:1
cell:BS13:f:1
cell:BT13:f:1
cell:BU13:f:1
cell:BV13:f:1
cell:BW13:f:1
cell:BX13:f:1
cell:BY13:f:1
cell:BZ13:f:1
cell:CA13:f:1
cell:CB13:f:1
cell:CC13:f:1
cell:E14:f:1
cell:F14:f:1
cell:G14:f:1
cell:H14:f:1
cell:I14:vtf:t:u:g1:f:1
cell:J14:f:1
cell:K14:f:1
cell:L14:f:1
cell:M14:f:1
cell:N14:f:1
cell:O14:f:1
cell:P14:f:1
cell:Q14:f:1
cell:R14:f:1
cell:S14:f:1
cell:T14:vtf:t:v:g2:f:1
cell:U14:f:1
cell:V14:f:1
cell:W14:f:1
cell:X14:f:1
cell:Y14:f:1
cell:Z14:vtf:t: :g3:f:1
cell:AA14:f:1
cell:AB14:f:1
cell:AC14:f:1
cell:AD14:f:1
cell:AE14:vtf:t: :g4:f:1
cell:AF14:f:1
cell:AG14:f:1
cell:AH14:f:1
cell:AI14:f:1
cell:AJ14:vtf:t: :g5:f:1
cell:AK14:f:1
cell:AL14:f:1
cell:AM14:f:1
cell:AN14:f:1
cell:AO14:f:1
cell:AP14:f:1
cell:AQ14:f:1
cell:AR14:f:1
cell:AS14:f:1
cell:AT14:f:1
cell:AU14:f:1
cell:AV14:f:1
cell:AW14:f:1
cell:AX14:f:1
cell:AY14:f:1
cell:AZ14:f:1
cell:BA14:f:1
cell:BB14:f:1
cell:BC14:f:1
cell:BD14:f:1
cell:BE14:f:1
cell:BF14:f:1
cell:BG14:f:1
cell:BH14:f:1
cell:BI14:f:1
cell:BJ14:f:1
cell:BK14:f:1
cell:BL14:f:1
cell:BM14:f:1
cell:BN14:f:1
cell:BO14:f:1
cell:BP14:f:1
cell:BQ14:f:1
cell:BR14:f:1
cell:BS14:f:1
cell:BT14:f:1
cell:BU14:f:1
cell:BV14:f:1
cell:BW14:f:1
cell:BX14:f:1
cell:BY14:f:1
cell:BZ14:f:1
cell:CA14:f:1
cell:CB14:f:1
cell:CC14:f:1
cell:E15:f:1
cell:F15:f:1
cell:G15:f:1
cell:H15:f:1
cell:I15:f:1
cell:J15:vtf:t:t:h1:f:1
cell:K15:f:1
cell:L15:f:1
cell:M15:f:1
cell:N15:f:1
cell:O15:f:1
cell:P15:f:1
cell:Q15:f:1
cell:R15:f:1
cell:S15:f:1
cell:T15:vtf:t:o:h2:f:1
cell:U15:f:1
cell:V15:f:1
cell:W15:f:1
cell:X15:f:1
cell:Y15:f:1
cell:Z15:vtf:t:n:h3:f:1
cell:AA15:f:1
cell:AB15:f:1
cell:AC15:f:1
cell:AD15:f:1
cell:AE15:vtf:t:s:h4:f:1
cell:AF15:f:1
cell:AG15:f:1
cell:AH15:f:1
cell:AI15:f:1
cell:AJ15:f:1
cell:AK15:vtf:t:t:h5:f:1
cell:AL15:f:1
cell:AM15:f:1
cell:AN15:f:1
cell:AO15:f:1
cell:AP15:f:1
cell:AQ15:f:1
cell:AR15:f:1
cell:AS15:f:1
cell:AT15:f:1
cell:AU15:f:1
cell:AV15:f:1
cell:AW15:f:1
cell:AX15:f:1
cell:AY15:f:1
cell:AZ15:f:1
cell:BA15:f:1
cell:BB15:f:1
cell:BC15:f:1
cell:BD15:f:1
cell:BE15:f:1
cell:BF15:f:1
cell:BG15:f:1
cell:BH15:f:1
cell:BI15:f:1
cell:BJ15:f:1
cell:BK15:f:1
cell:BL15:f:1
cell:BM15:f:1
cell:BN15:f:1
cell:BO15:f:1
cell:BP15:f:1
cell:BQ15:f:1
cell:BR15:f:1
cell:BS15:f:1
cell:BT15:f:1
cell:BU15:f:1
cell:BV15:f:1
cell:BW15:f:1
cell:BX15:f:1
cell:BY15:f:1
cell:BZ15:f:1
cell:CA15:f:1
cell:CB15:f:1
cell:CC15:f:1
cell:E16:f:1
cell:F16:f:1
cell:G16:f:1
cell:H16:f:1
cell:I16:f:1
cell:J16:vtf:t: :i1:f:1
cell:K16:f:1
cell:L16:f:1
cell:M16:f:1
cell:N16:f:1
cell:O16:f:1
cell:P16:f:1
cell:Q16:f:1
cell:R16:f:1
cell:S16:f:1
cell:T16:f:1
cell:U16:vtf:t:u:i2:f:1
cell:V16:f:1
cell:W16:f:1
cell:X16:f:1
cell:Y16:f:1
cell:Z16:vtf:t:u:i3:f:1
cell:AA16:f:1
cell:AB16:f:1
cell:AC16:f:1
cell:AD16:f:1
cell:AE16:f:1
cell:AF16:vtf:t:':i4:f:1
cell:AG16:f:1
cell:AH16:f:1
cell:AI16:f:1
cell:AJ16:f:1
cell:AK16:f:1
cell:AL16:vtf:t:o:i5:f:1
cell:AM16:f:1
cell:AN16:f:1
cell:AO16:f:1
cell:AP16:f:1
cell:AQ16:f:1
cell:AR16:f:1
cell:AS16:f:1
cell:AT16:f:1
cell:AU16:f:1
cell:AV16:f:1
cell:AW16:f:1
cell:AX16:f:1
cell:AY16:f:1
cell:AZ16:f:1
cell:BA16:f:1
cell:BB16:f:1
cell:BC16:f:1
cell:BD16:f:1
cell:BE16:f:1
cell:BF16:f:1
cell:BG16:f:1
cell:BH16:f:1
cell:BI16:f:1
cell:BJ16:f:1
cell:BK16:f:1
cell:BL16:f:1
cell:BM16:f:1
cell:BN16:f:1
cell:BO16:f:1
cell:BP16:f:1
cell:BQ16:f:1
cell:BR16:f:1
cell:BS16:f:1
cell:BT16:f:1
cell:BU16:f:1
cell:BV16:f:1
cell:BW16:f:1
cell:BX16:f:1
cell:BY16:f:1
cell:BZ16:f:1
cell:CA16:f:1
cell:CB16:f:1
cell:CC16:f:1
cell:E17:f:1
cell:F17:f:1
cell:G17:f:1
cell:H17:f:1
cell:I17:f:1
cell:J17:vtf:t:d:j1:f:1
cell:K17:f:1
cell:L17:f:1
cell:M17:f:1
cell:N17:f:1
cell:O17:f:1
cell:P17:f:1
cell:Q17:f:1
cell:R17:f:1
cell:S17:f:1
cell:T17:f:1
cell:U17:vtf:t:s:j2:f:1
cell:V17:f:1
cell:W17:f:1
cell:X17:f:1
cell:Y17:f:1
cell:Z17:f:1
cell:AA17:vtf:t:a:j3:f:1
cell:AB17:f:1
cell:AC17:f:1
cell:AD17:f:1
cell:AE17:f:1
cell:AF17:vtf:t:i:j4:f:1
cell:AG17:f:1
cell:AH17:f:1
cell:AI17:f:1
cell:AJ17:f:1
cell:AK17:f:1
cell:AL17:f:1
cell:AM17:vtf:t:m:j5:f:1
cell:AN17:f:1
cell:AO17:f:1
cell:AP17:f:1
cell:AQ17:f:1
cell:AR17:f:1
cell:AS17:f:1
cell:AT17:f:1
cell:AU17:f:1
cell:AV17:f:1
cell:AW17:f:1
cell:AX17:f:1
cell:AY17:f:1
cell:AZ17:f:1
cell:BA17:f:1
cell:BB17:f:1
cell:BC17:f:1
cell:BD17:f:1
cell:BE17:f:1
cell:BF17:f:1
cell:BG17:f:1
cell:BH17:f:1
cell:BI17:f:1
cell:BJ17:f:1
cell:BK17:f:1
cell:BL17:f:1
cell:BM17:f:1
cell:BN17:f:1
cell:BO17:f:1
cell:BP17:f:1
cell:BQ17:f:1
cell:BR17:f:1
cell:BS17:f:1
cell:BT17:f:1
cell:BU17:f:1
cell:BV17:f:1
cell:BW17:f:1
cell:BX17:f:1
cell:BY17:f:1
cell:BZ17:f:1
cell:CA17:f:1
cell:CB17:f:1
cell:CC17:f:1
cell:E18:f:1
cell:F18:f:1
cell:G18:f:1
cell:H18:f:1
cell:I18:f:1
cell:J18:vtf:t:e:k1:f:1
cell:K18:f:1
cell:L18:f:1
cell:M18:f:1
cell:N18:f:1
cell:O18:f:1
cell:P18:f:1
cell:Q18:f:1
cell:R18:f:1
cell:S18:f:1
cell:T18:f:1
cell:U18:f:1
cell:V18:vtf:t: :k2:f:1
cell:W18:f:1
cell:X18:f:1
cell:Y18:f:1
cell:Z18:f:1
cell:AA18:f:1
cell:AB18:vtf:t:g:k3:f:1
cell:AC18:f:1
cell:AD18:f:1
cell:AE18:f:1
cell:AF18:f:1
cell:AG18:vtf:t:l:k4:f:1
cell:AH18:f:1
cell:AI18:f:1
cell:AJ18:f:1
cell:AK18:f:1
cell:AL18:f:1
cell:AM18:f:1
cell:AN18:vtf:t:b:k5:f:1
cell:AO18:f:1
cell:AP18:f:1
cell:AQ18:f:1
cell:AR18:f:1
cell:AS18:f:1
cell:AT18:f:1
cell:AU18:f:1
cell:AV18:f:1
cell:AW18:f:1
cell:AX18:f:1
cell:AY18:f:1
cell:AZ18:f:1
cell:BA18:f:1
cell:BB18:f:1
cell:BC18:f:1
cell:BD18:f:1
cell:BE18:f:1
cell:BF18:f:1
cell:BG18:f:1
cell:BH18:f:1
cell:BI18:f:1
cell:BJ18:f:1
cell:BK18:f:1
cell:BL18:f:1
cell:BM18:f:1
cell:BN18:f:1
cell:BO18:f:1
cell:BP18:f:1
cell:BQ18:f:1
cell:BR18:f:1
cell:BS18:f:1
cell:BT18:f:1
cell:BU18:f:1
cell:BV18:f:1
cell:BW18:f:1
cell:BX18:f:1
cell:BY18:f:1
cell:BZ18:f:1
cell:CA18:f:1
cell:CB18:f:1
cell:CC18:f:1
cell:E19:f:1
cell:F19:f:1
cell:G19:f:1
cell:H19:f:1
cell:I19:f:1
cell:J19:f:1
cell:K19:vtf:t:s:l1:f:1
cell:L19:f:1
cell:M19:f:1
cell:N19:f:1
cell:O19:f:1
cell:P19:f:1
cell:Q19:f:1
cell:R19:f:1
cell:S19:f:1
cell:T19:f:1
cell:U19:f:1
cell:V19:vtf:t:a:l2:f:1
cell:W19:f:1
cell:X19:f:1
cell:Y19:f:1
cell:Z19:f:1
cell:AA19:f:1
cell:AB19:f:1
cell:AC19:vtf:t:e:l3:f:1
cell:AD19:f:1
cell:AE19:f:1
cell:AF19:f:1
cell:AG19:vtf:t: :l4:f:1
cell:AH19:f:1
cell:AI19:f:1
cell:AJ19:f:1
cell:AK19:f:1
cell:AL19:f:1
cell:AM19:f:1
cell:AN19:vtf:t:e:l5:f:1
cell:AO19:f:1
cell:AP19:f:1
cell:AQ19:f:1
cell:AR19:f:1
cell:AS19:f:1
cell:AT19:f:1
cell:AU19:f:1
cell:AV19:f:1
cell:AW19:f:1
cell:AX19:f:1
cell:AY19:f:1
cell:AZ19:f:1
cell:BA19:f:1
cell:BB19:f:1
cell:BC19:f:1
cell:BD19:f:1
cell:BE19:f:1
cell:BF19:f:1
cell:BG19:f:1
cell:BH19:f:1
cell:BI19:f:1
cell:BJ19:f:1
cell:BK19:f:1
cell:BL19:f:1
cell:BM19:f:1
cell:BN19:f:1
cell:BO19:f:1
cell:BP19:f:1
cell:BQ19:f:1
cell:BR19:f:1
cell:BS19:f:1
cell:BT19:f:1
cell:BU19:f:1
cell:BV19:f:1
cell:BW19:f:1
cell:BX19:f:1
cell:BY19:f:1
cell:BZ19:f:1
cell:CA19:f:1
cell:CB19:f:1
cell:CC19:f:1
cell:E20:f:1
cell:F20:f:1
cell:G20:f:1
cell:H20:f:1
cell:I20:f:1
cell:J20:f:1
cell:K20:vtf:t: :m1:f:1
cell:L20:f:1
cell:M20:f:1
cell:N20:f:1
cell:O20:f:1
cell:P20:f:1
cell:Q20:f:1
cell:R20:f:1
cell:S20:f:1
cell:T20:f:1
cell:U20:f:1
cell:V20:vtf:t:u:m2:f:1
cell:W20:f:1
cell:X20:f:1
cell:Y20:f:1
cell:Z20:f:1
cell:AA20:f:1
cell:AB20:f:1
cell:AC20:vtf:t:s:m3:f:1
cell:AD20:f:1
cell:AE20:f:1
cell:AF20:f:1
cell:AG20:f:1
cell:AH20:vtf:t:p:m4:f:1
cell:AI20:f:1
cell:AJ20:f:1
cell:AK20:f:1
cell:AL20:f:1
cell:AM20:f:1
cell:AN20:f:1
cell:AO20:vtf:t:r:m5:f:1
cell:AP20:f:1
cell:AQ20:f:1
cell:AR20:f:1
cell:AS20:f:1
cell:AT20:f:1
cell:AU20:f:1
cell:AV20:f:1
cell:AW20:f:1
cell:AX20:f:1
cell:AY20:f:1
cell:AZ20:f:1
cell:BA20:f:1
cell:BB20:f:1
cell:BC20:f:1
cell:BD20:f:1
cell:BE20:f:1
cell:BF20:f:1
cell:BG20:f:1
cell:BH20:f:1
cell:BI20:f:1
cell:BJ20:f:1
cell:BK20:f:1
cell:BL20:f:1
cell:BM20:f:1
cell:BN20:f:1
cell:BO20:f:1
cell:BP20:f:1
cell:BQ20:f:1
cell:BR20:f:1
cell:BS20:f:1
cell:BT20:f:1
cell:BU20:f:1
cell:BV20:f:1
cell:BW20:f:1
cell:BX20:f:1
cell:BY20:f:1
cell:BZ20:f:1
cell:CA20:f:1
cell:CB20:f:1
cell:CC20:f:1
cell:E21:f:1
cell:F21:f:1
cell:G21:f:1
cell:H21:f:1
cell:I21:f:1
cell:J21:f:1
cell:K21:f:1
cell:L21:vtf:t:v:n1:f:1
cell:M21:f:1
cell:N21:f:1
cell:O21:f:1
cell:P21:f:1
cell:Q21:f:1
cell:R21:f:1
cell:S21:f:1
cell:T21:f:1
cell:U21:f:1
cell:V21:f:1
cell:W21:vtf:t:s:n2:f:1
cell:X21:f:1
cell:Y21:f:1
cell:Z21:f:1
cell:AA21:f:1
cell:AB21:f:1
cell:AC21:f:1
cell:AD21:vtf:t: :n3:f:1
cell:AE21:f:1
cell:AF21:f:1
cell:AG21:f:1
cell:AH21:f:1
cell:AI21:vtf:t:l:n4:f:1
cell:AJ21:f:1
cell:AK21:f:1
cell:AL21:f:1
cell:AM21:f:1
cell:AN21:f:1
cell:AO21:f:1
cell:AP21:vtf:t: :n5:f:1
cell:AQ21:f:1
cell:AR21:f:1
cell:AS21:f:1
cell:AT21:f:1
cell:AU21:f:1
cell:AV21:f:1
cell:AW21:f:1
cell:AX21:f:1
cell:AY21:f:1
cell:AZ21:f:1
cell:BA21:f:1
cell:BB21:f:1
cell:BC21:f:1
cell:BD21:f:1
cell:BE21:f:1
cell:BF21:f:1
cell:BG21:f:1
cell:BH21:f:1
cell:BI21:f:1
cell:BJ21:f:1
cell:BK21:f:1
cell:BL21:f:1
cell:BM21:f:1
cell:BN21:f:1
cell:BO21:f:1
cell:BP21:f:1
cell:BQ21:f:1
cell:BR21:f:1
cell:BS21:f:1
cell:BT21:f:1
cell:BU21:f:1
cell:BV21:f:1
cell:BW21:f:1
cell:BX21:f:1
cell:BY21:f:1
cell:BZ21:f:1
cell:CA21:f:1
cell:CB21:f:1
cell:CC21:f:1
cell:E22:f:1
cell:F22:f:1
cell:G22:f:1
cell:H22:f:1
cell:I22:f:1
cell:J22:f:1
cell:K22:f:1
cell:L22:vtf:t:o:o1:f:1
cell:M22:f:1
cell:N22:f:1
cell:O22:f:1
cell:P22:f:1
cell:Q22:f:1
cell:R22:f:1
cell:S22:f:1
cell:T22:f:1
cell:U22:f:1
cell:V22:f:1
cell:W22:vtf:t:s:o2:f:1
cell:X22:f:1
cell:Y22:f:1
cell:Z22:f:1
cell:AA22:f:1
cell:AB22:f:1
cell:AC22:f:1
cell:AD22:f:1
cell:AE22:vtf:t:c:o3:f:1
cell:AF22:f:1
cell:AG22:f:1
cell:AH22:f:1
cell:AI22:f:1
cell:AJ22:vtf:t:e:o4:f:1
cell:AK22:f:1
cell:AL22:f:1
cell:AM22:f:1
cell:AN22:f:1
cell:AO22:f:1
cell:AP22:f:1
cell:AQ22:vtf:t:l:o5:f:1
cell:AR22:f:1
cell:AS22:f:1
cell:AT22:f:1
cell:AU22:f:1
cell:AV22:f:1
cell:AW22:f:1
cell:AX22:f:1
cell:AY22:f:1
cell:AZ22:f:1
cell:BA22:f:1
cell:BB22:f:1
cell:BC22:f:1
cell:BD22:f:1
cell:BE22:f:1
cell:BF22:f:1
cell:BG22:f:1
cell:BH22:f:1
cell:BI22:f:1
cell:BJ22:f:1
cell:BK22:f:1
cell:BL22:f:1
cell:BM22:f:1
cell:BN22:f:1
cell:BO22:f:1
cell:BP22:f:1
cell:BQ22:f:1
cell:BR22:f:1
cell:BS22:f:1
cell:BT22:f:1
cell:BU22:f:1
cell:BV22:f:1
cell:BW22:f:1
cell:BX22:f:1
cell:BY22:f:1
cell:BZ22:f:1
cell:CA22:f:1
cell:CB22:f:1
cell:CC22:f:1
cell:E23:f:1
cell:F23:f:1
cell:G23:f:1
cell:H23:f:1
cell:I23:f:1
cell:J23:f:1
cell:K23:f:1
cell:L23:f:1
cell:M23:vtf:t:i:p1:f:1
cell:N23:f:1
cell:O23:f:1
cell:P23:f:1
cell:Q23:f:1
cell:R23:f:1
cell:S23:f:1
cell:T23:f:1
cell:U23:f:1
cell:V23:f:1
cell:W23:f:1
cell:X23:vtf:t:i:p2:f:1
cell:Y23:f:1
cell:Z23:f:1
cell:AA23:f:1
cell:AB23:f:1
cell:AC23:f:1
cell:AD23:f:1
cell:AE23:vtf:t:a:p3:f:1
cell:AF23:f:1
cell:AG23:f:1
cell:AH23:f:1
cell:AI23:f:1
cell:AJ23:vtf:t:u:p4:f:1
cell:AK23:f:1
cell:AL23:f:1
cell:AM23:f:1
cell:AN23:f:1
cell:AO23:f:1
cell:AP23:f:1
cell:AQ23:vtf:t:e:p5:f:1
cell:AR23:f:1
cell:AS23:f:1
cell:AT23:f:1
cell:AU23:f:1
cell:AV23:f:1
cell:AW23:f:1
cell:AX23:f:1
cell:AY23:f:1
cell:AZ23:f:1
cell:BA23:f:1
cell:BB23:f:1
cell:BC23:f:1
cell:BD23:f:1
cell:BE23:f:1
cell:BF23:f:1
cell:BG23:f:1
cell:BH23:f:1
cell:BI23:f:1
cell:BJ23:f:1
cell:BK23:f:1
cell:BL23:f:1
cell:BM23:f:1
cell:BN23:f:1
cell:BO23:f:1
cell:BP23:f:1
cell:BQ23:f:1
cell:BR23:f:1
cell:BS23:f:1
cell:BT23:f:1
cell:BU23:f:1
cell:BV23:f:1
cell:BW23:f:1
cell:BX23:f:1
cell:BY23:f:1
cell:BZ23:f:1
cell:CA23:f:1
cell:CB23:f:1
cell:CC23:f:1
cell:E24:f:1
cell:F24:f:1
cell:G24:f:1
cell:H24:f:1
cell:I24:f:1
cell:J24:f:1
cell:K24:f:1
cell:L24:f:1
cell:M24:f:1
cell:N24:vtf:t:x:q1:f:1
cell:O24:f:1
cell:P24:f:1
cell:Q24:f:1
cell:R24:f:1
cell:S24:f:1
cell:T24:f:1
cell:U24:f:1
cell:V24:f:1
cell:W24:f:1
cell:X24:vtf:t: :q2:f:1
cell:Y24:f:1
cell:Z24:f:1
cell:AA24:f:1
cell:AB24:f:1
cell:AC24:f:1
cell:AD24:f:1
cell:AE24:f:1
cell:AF24:vtf:t:b:q3:f:1
cell:AG24:f:1
cell:AH24:f:1
cell:AI24:f:1
cell:AJ24:f:1
cell:AK24:vtf:t:t:q4:f:1
cell:AL24:f:1
cell:AM24:f:1
cell:AN24:f:1
cell:AO24:f:1
cell:AP24:f:1
cell:AQ24:f:1
cell:AR24:vtf:t:s:q5:f:1
cell:AS24:f:1
cell:AT24:f:1
cell:AU24:f:1
cell:AV24:f:1
cell:AW24:f:1
cell:AX24:f:1
cell:AY24:f:1
cell:AZ24:f:1
cell:BA24:f:1
cell:BB24:f:1
cell:BC24:f:1
cell:BD24:f:1
cell:BE24:f:1
cell:BF24:f:1
cell:BG24:f:1
cell:BH24:f:1
cell:BI24:f:1
cell:BJ24:f:1
cell:BK24:f:1
cell:BL24:f:1
cell:BM24:f:1
cell:BN24:f:1
cell:BO24:f:1
cell:BP24:f:1
cell:BQ24:f:1
cell:BR24:f:1
cell:BS24:f:1
cell:BT24:f:1
cell:BU24:f:1
cell:BV24:f:1
cell:BW24:f:1
cell:BX24:f:1
cell:BY24:f:1
cell:BZ24:f:1
cell:CA24:f:1
cell:CB24:f:1
cell:CC24:f:1
cell:E25:f:1
cell:F25:f:1
cell:G25:f:1
cell:H25:f:1
cell:I25:f:1
cell:J25:f:1
cell:K25:f:1
cell:L25:f:1
cell:M25:f:1
cell:N25:vtf:t: :r1:f:1
cell:O25:f:1
cell:P25:f:1
cell:Q25:f:1
cell:R25:f:1
cell:S25:f:1
cell:T25:f:1
cell:U25:f:1
cell:V25:f:1
cell:W25:f:1
cell:X25:f:1
cell:Y25:vtf:t:q:r2:f:1
cell:Z25:f:1
cell:AA25:f:1
cell:AB25:f:1
cell:AC25:f:1
cell:AD25:f:1
cell:AE25:f:1
cell:AF25:f:1
cell:AG25:vtf:t:r:r3:f:1
cell:AH25:f:1
cell:AI25:f:1
cell:AJ25:f:1
cell:AK25:f:1
cell:AL25:vtf:t: :r4:f:1
cell:AM25:f:1
cell:AN25:f:1
cell:AO25:f:1
cell:AP25:f:1
cell:AQ25:f:1
cell:AR25:f:1
cell:AS25:vtf:t: :r5:f:1
cell:AT25:f:1
cell:AU25:f:1
cell:AV25:f:1
cell:AW25:f:1
cell:AX25:f:1
cell:AY25:f:1
cell:AZ25:f:1
cell:BA25:f:1
cell:BB25:f:1
cell:BC25:f:1
cell:BD25:f:1
cell:BE25:f:1
cell:BF25:f:1
cell:BG25:f:1
cell:BH25:f:1
cell:BI25:f:1
cell:BJ25:f:1
cell:BK25:f:1
cell:BL25:f:1
cell:BM25:f:1
cell:BN25:f:1
cell:BO25:f:1
cell:BP25:f:1
cell:BQ25:f:1
cell:BR25:f:1
cell:BS25:f:1
cell:BT25:f:1
cell:BU25:f:1
cell:BV25:f:1
cell:BW25:f:1
cell:BX25:f:1
cell:BY25:f:1
cell:BZ25:f:1
cell:CA25:f:1
cell:CB25:f:1
cell:CC25:f:1
cell:E26:f:1
cell:F26:f:1
cell:G26:f:1
cell:H26:f:1
cell:I26:f:1
cell:J26:f:1
cell:K26:f:1
cell:L26:f:1
cell:M26:f:1
cell:N26:f:1
cell:O26:vtf:t:d:s1:f:1
cell:P26:f:1
cell:Q26:f:1
cell:R26:f:1
cell:S26:f:1
cell:T26:f:1
cell:U26:f:1
cell:V26:f:1
cell:W26:f:1
cell:X26:f:1
cell:Y26:vtf:t:u:s2:f:1
cell:Z26:f:1
cell:AA26:f:1
cell:AB26:f:1
cell:AC26:f:1
cell:AD26:f:1
cell:AE26:f:1
cell:AF26:f:1
cell:AG26:vtf:t:é:s3:f:1
cell:AH26:f:1
cell:AI26:f:1
cell:AJ26:f:1
cell:AK26:f:1
cell:AL26:vtf:t:t:s4:f:1
cell:AM26:f:1
cell:AN26:f:1
cell:AO26:f:1
cell:AP26:f:1
cell:AQ26:f:1
cell:AR26:f:1
cell:AS26:f:1
cell:AT26:vtf:t:l:s5:f:1
cell:AU26:f:1
cell:AV26:f:1
cell:AW26:f:1
cell:AX26:f:1
cell:AY26:f:1
cell:AZ26:f:1
cell:BA26:f:1
cell:BB26:f:1
cell:BC26:f:1
cell:BD26:f:1
cell:BE26:f:1
cell:BF26:f:1
cell:BG26:f:1
cell:BH26:f:1
cell:BI26:f:1
cell:BJ26:f:1
cell:BK26:f:1
cell:BL26:f:1
cell:BM26:f:1
cell:BN26:f:1
cell:BO26:f:1
cell:BP26:f:1
cell:BQ26:f:1
cell:BR26:f:1
cell:BS26:f:1
cell:BT26:f:1
cell:BU26:f:1
cell:BV26:f:1
cell:BW26:f:1
cell:BX26:f:1
cell:BY26:f:1
cell:BZ26:f:1
cell:CA26:f:1
cell:CB26:f:1
cell:CC26:f:1
cell:E27:f:1
cell:F27:f:1
cell:G27:f:1
cell:H27:f:1
cell:I27:f:1
cell:J27:f:1
cell:K27:f:1
cell:L27:f:1
cell:M27:f:1
cell:N27:f:1
cell:O27:f:1
cell:P27:vtf:t:e:t1:f:1
cell:Q27:f:1
cell:R27:f:1
cell:S27:f:1
cell:T27:f:1
cell:U27:f:1
cell:V27:f:1
cell:W27:f:1
cell:X27:f:1
cell:Y27:f:1
cell:Z27:vtf:t:':t2:f:1
cell:AA27:f:1
cell:AB27:f:1
cell:AC27:f:1
cell:AD27:f:1
cell:AE27:f:1
cell:AF27:f:1
cell:AG27:f:1
cell:AH27:vtf:t:s:t3:f:1
cell:AI27:f:1
cell:AJ27:f:1
cell:AK27:f:1
cell:AL27:f:1
cell:AM27:vtf:t:a:t4:f:1
cell:AN27:f:1
cell:AO27:f:1
cell:AP27:f:1
cell:AQ27:f:1
cell:AR27:f:1
cell:AS27:f:1
cell:AT27:vtf:t:i:t5:f:1
cell:AU27:f:1
cell:AV27:f:1
cell:AW27:f:1
cell:AX27:f:1
cell:AY27:f:1
cell:AZ27:f:1
cell:BA27:f:1
cell:BB27:f:1
cell:BC27:f:1
cell:BD27:f:1
cell:BE27:f:1
cell:BF27:f:1
cell:BG27:f:1
cell:BH27:f:1
cell:BI27:f:1
cell:BJ27:f:1
cell:BK27:f:1
cell:BL27:f:1
cell:BM27:f:1
cell:BN27:f:1
cell:BO27:f:1
cell:BP27:f:1
cell:BQ27:f:1
cell:BR27:f:1
cell:BS27:f:1
cell:BT27:f:1
cell:BU27:f:1
cell:BV27:f:1
cell:BW27:f:1
cell:BX27:f:1
cell:BY27:f:1
cell:BZ27:f:1
cell:CA27:f:1
cell:CB27:f:1
cell:CC27:f:1
cell:E28:f:1
cell:F28:f:1
cell:G28:f:1
cell:H28:f:1
cell:I28:f:1
cell:J28:f:1
cell:K28:f:1
cell:L28:f:1
cell:M28:f:1
cell:N28:f:1
cell:O28:f:1
cell:P28:vtf:t: :u1:f:1
cell:Q28:vtf:t: :u1:f:1
cell:R28:f:1
cell:S28:f:1
cell:T28:f:1
cell:U28:f:1
cell:V28:f:1
cell:W28:f:1
cell:X28:f:1
cell:Y28:f:1
cell:Z28:vtf:t:i:u2:f:1
cell:AA28:f:1
cell:AB28:f:1
cell:AC28:f:1
cell:AD28:f:1
cell:AE28:f:1
cell:AF28:f:1
cell:AG28:f:1
cell:AH28:vtf:t: :u3:f:1
cell:AI28:f:1
cell:AJ28:f:1
cell:AK28:f:1
cell:AL28:f:1
cell:AM28:f:1
cell:AN28:vtf:t:n:u4:f:1
cell:AO28:f:1
cell:AP28:f:1
cell:AQ28:f:1
cell:AR28:f:1
cell:AS28:f:1
cell:AT28:f:1
cell:AU28:vtf:t:e:u5:f:1
cell:AV28:f:1
cell:AW28:f:1
cell:AX28:f:1
cell:AY28:f:1
cell:AZ28:f:1
cell:BA28:f:1
cell:BB28:f:1
cell:BC28:f:1
cell:BD28:f:1
cell:BE28:f:1
cell:BF28:f:1
cell:BG28:f:1
cell:BH28:f:1
cell:BI28:f:1
cell:BJ28:f:1
cell:BK28:f:1
cell:BL28:f:1
cell:BM28:f:1
cell:BN28:f:1
cell:BO28:f:1
cell:BP28:f:1
cell:BQ28:f:1
cell:BR28:f:1
cell:BS28:f:1
cell:BT28:f:1
cell:BU28:f:1
cell:BV28:f:1
cell:BW28:f:1
cell:BX28:f:1
cell:BY28:f:1
cell:BZ28:f:1
cell:CA28:f:1
cell:CB28:f:1
cell:CC28:f:1
cell:E29:f:1
cell:F29:f:1
cell:G29:f:1
cell:H29:f:1
cell:I29:f:1
cell:J29:f:1
cell:K29:f:1
cell:L29:f:1
cell:M29:f:1
cell:N29:f:1
cell:O29:f:1
cell:P29:f:1
cell:Q29:vtf:t:f:v1:f:1
cell:R29:f:1
cell:S29:f:1
cell:T29:f:1
cell:U29:f:1
cell:V29:f:1
cell:W29:f:1
cell:X29:f:1
cell:Y29:f:1
cell:Z29:f:1
cell:AA29:vtf:t:l:v2:f:1
cell:AB29:f:1
cell:AC29:f:1
cell:AD29:f:1
cell:AE29:f:1
cell:AF29:f:1
cell:AG29:f:1
cell:AH29:vtf:t:s:v3:f:1
cell:AI29:f:1
cell:AJ29:f:1
cell:AK29:f:1
cell:AL29:f:1
cell:AM29:f:1
cell:AN29:f:1
cell:AO29:vtf:t:d:v4:f:1
cell:AP29:f:1
cell:AQ29:f:1
cell:AR29:f:1
cell:AS29:f:1
cell:AT29:f:1
cell:AU29:f:1
cell:AV29:vtf:t:n:v5:f:1
cell:AW29:f:1
cell:AX29:f:1
cell:AY29:f:1
cell:AZ29:f:1
cell:BA29:f:1
cell:BB29:f:1
cell:BC29:f:1
cell:BD29:f:1
cell:BE29:f:1
cell:BF29:f:1
cell:BG29:f:1
cell:BH29:f:1
cell:BI29:f:1
cell:BJ29:f:1
cell:BK29:f:1
cell:BL29:f:1
cell:BM29:f:1
cell:BN29:f:1
cell:BO29:f:1
cell:BP29:f:1
cell:BQ29:f:1
cell:BR29:f:1
cell:BS29:f:1
cell:BT29:f:1
cell:BU29:f:1
cell:BV29:f:1
cell:BW29:f:1
cell:BX29:f:1
cell:BY29:f:1
cell:BZ29:f:1
cell:CA29:f:1
cell:CB29:f:1
cell:CC29:f:1
cell:E30:f:1
cell:F30:f:1
cell:G30:f:1
cell:H30:f:1
cell:I30:f:1
cell:J30:f:1
cell:K30:f:1
cell:L30:f:1
cell:M30:f:1
cell:N30:f:1
cell:O30:f:1
cell:P30:f:1
cell:Q30:f:1
cell:R30:vtf:t:e:w1:f:1
cell:S30:f:1
cell:T30:f:1
cell:U30:f:1
cell:V30:f:1
cell:W30:f:1
cell:X30:f:1
cell:Y30:f:1
cell:Z30:f:1
cell:AA30:vtf:t: :w2:f:1
cell:AB30:f:1
cell:AC30:f:1
cell:AD30:f:1
cell:AE30:f:1
cell:AF30:f:1
cell:AG30:f:1
cell:AH30:f:1
cell:AI30:vtf:t:e:w3:f:1
cell:AJ30:f:1
cell:AK30:f:1
cell:AL30:f:1
cell:AM30:f:1
cell:AN30:f:1
cell:AO30:f:1
cell:AP30:vtf:t:i:w4:f:1
cell:AQ30:f:1
cell:AR30:f:1
cell:AS30:f:1
cell:AT30:f:1
cell:AU30:f:1
cell:AV30:f:1
cell:AW30:vtf:t:s:w5:f:1
cell:AX30:f:1
cell:AY30:f:1
cell:AZ30:f:1
cell:BA30:f:1
cell:BB30:f:1
cell:BC30:f:1
cell:BD30:f:1
cell:BE30:f:1
cell:BF30:f:1
cell:BG30:f:1
cell:BH30:f:1
cell:BI30:f:1
cell:BJ30:f:1
cell:BK30:f:1
cell:BL30:f:1
cell:BM30:f:1
cell:BN30:f:1
cell:BO30:f:1
cell:BP30:f:1
cell:BQ30:f:1
cell:BR30:f:1
cell:BS30:f:1
cell:BT30:f:1
cell:BU30:f:1
cell:BV30:f:1
cell:BW30:f:1
cell:BX30:f:1
cell:BY30:f:1
cell:BZ30:f:1
cell:CA30:f:1
cell:CB30:f:1
cell:CC30:f:1
cell:E31:f:1
cell:F31:f:1
cell:G31:f:1
cell:H31:f:1
cell:I31:f:1
cell:J31:f:1
cell:K31:f:1
cell:L31:f:1
cell:M31:f:1
cell:N31:f:1
cell:O31:f:1
cell:P31:f:1
cell:Q31:f:1
cell:R31:vtf:t:m:x1:f:1
cell:S31:f:1
cell:T31:f:1
cell:U31:f:1
cell:V31:f:1
cell:W31:f:1
cell:X31:f:1
cell:Y31:f:1
cell:Z31:f:1
cell:AA31:f:1
cell:AB31:vtf:t:p:x2:f:1
cell:AC31:f:1
cell:AD31:f:1
cell:AE31:f:1
cell:AF31:f:1
cell:AG31:f:1
cell:AH31:f:1
cell:AI31:vtf:t: :x3:f:1
cell:AJ31:f:1
cell:AK31:f:1
cell:AL31:f:1
cell:AM31:f:1
cell:AN31:f:1
cell:AO31:f:1
cell:AP31:f:1
cell:AQ31:vtf:t:s:x4:f:1
cell:AR31:f:1
cell:AS31:f:1
cell:AT31:f:1
cell:AU31:f:1
cell:AV31:f:1
cell:AW31:f:1
cell:AX31:vtf:t: :x5:f:1
cell:AY31:f:1
cell:AZ31:f:1
cell:BA31:f:1
cell:BB31:f:1
cell:BC31:f:1
cell:BD31:f:1
cell:BE31:f:1
cell:BF31:f:1
cell:BG31:f:1
cell:BH31:f:1
cell:BI31:f:1
cell:BJ31:f:1
cell:BK31:f:1
cell:BL31:f:1
cell:BM31:f:1
cell:BN31:f:1
cell:BO31:f:1
cell:BP31:f:1
cell:BQ31:f:1
cell:BR31:f:1
cell:BS31:f:1
cell:BT31:f:1
cell:BU31:f:1
cell:BV31:f:1
cell:BW31:f:1
cell:BX31:f:1
cell:BY31:f:1
cell:BZ31:f:1
cell:CA31:f:1
cell:CB31:f:1
cell:CC31:f:1
cell:E32:f:1
cell:F32:f:1
cell:G32:f:1
cell:H32:f:1
cell:I32:f:1
cell:J32:f:1
cell:K32:f:1
cell:L32:f:1
cell:M32:f:1
cell:N32:f:1
cell:O32:f:1
cell:P32:f:1
cell:Q32:f:1
cell:R32:f:1
cell:S32:vtf:t:m:y1:f:1
cell:T32:f:1
cell:U32:f:1
cell:V32:f:1
cell:W32:f:1
cell:X32:f:1
cell:Y32:f:1
cell:Z32:f:1
cell:AA32:f:1
cell:AB32:vtf:t:l:y2:f:1
cell:AC32:f:1
cell:AD32:f:1
cell:AE32:f:1
cell:AF32:f:1
cell:AG32:f:1
cell:AH32:f:1
cell:AI32:f:1
cell:AJ32:vtf:t:p:y3:f:1
cell:AK32:f:1
cell:AL32:f:1
cell:AM32:f:1
cell:AN32:f:1
cell:AO32:f:1
cell:AP32:f:1
cell:AQ32:f:1
cell:AR32:vtf:t: :y4:f:1
cell:AS32:f:1
cell:AT32:f:1
cell:AU32:f:1
cell:AV32:f:1
cell:AW32:f:1
cell:AX32:vtf:t:q:y5:f:1
cell:AY32:f:1
cell:AZ32:f:1
cell:BA32:f:1
cell:BB32:f:1
cell:BC32:f:1
cell:BD32:f:1
cell:BE32:f:1
cell:BF32:f:1
cell:BG32:f:1
cell:BH32:f:1
cell:BI32:f:1
cell:BJ32:f:1
cell:BK32:f:1
cell:BL32:f:1
cell:BM32:f:1
cell:BN32:f:1
cell:BO32:f:1
cell:BP32:f:1
cell:BQ32:f:1
cell:BR32:f:1
cell:BS32:f:1
cell:BT32:f:1
cell:BU32:f:1
cell:BV32:f:1
cell:BW32:f:1
cell:BX32:f:1
cell:BY32:f:1
cell:BZ32:f:1
cell:CA32:f:1
cell:CB32:f:1
cell:CC32:f:1
cell:E33:f:1
cell:F33:f:1
cell:G33:f:1
cell:H33:f:1
cell:I33:f:1
cell:J33:f:1
cell:K33:f:1
cell:L33:f:1
cell:M33:f:1
cell:N33:f:1
cell:O33:f:1
cell:P33:f:1
cell:Q33:f:1
cell:R33:f:1
cell:S33:vtf:t:e:z1:f:1
cell:T33:f:1
cell:U33:f:1
cell:V33:f:1
cell:W33:f:1
cell:X33:f:1
cell:Y33:f:1
cell:Z33:f:1
cell:AA33:f:1
cell:AB33:f:1
cell:AC33:vtf:t:e:z2:f:1
cell:AD33:f:1
cell:AE33:f:1
cell:AF33:f:1
cell:AG33:f:1
cell:AH33:f:1
cell:AI33:f:1
cell:AJ33:f:1
cell:AK33:vtf:t:r:z3:f:1
cell:AL33:f:1
cell:AM33:f:1
cell:AN33:f:1
cell:AO33:f:1
cell:AP33:f:1
cell:AQ33:f:1
cell:AR33:vtf:t:q:z4:f:1
cell:AS33:f:1
cell:AT33:f:1
cell:AU33:f:1
cell:AV33:f:1
cell:AW33:f:1
cell:AX33:f:1
cell:AY33:vtf:t:u:z5:f:1
cell:AZ33:f:1
cell:BA33:f:1
cell:BB33:f:1
cell:BC33:f:1
cell:BD33:f:1
cell:BE33:f:1
cell:BF33:f:1
cell:BG33:f:1
cell:BH33:f:1
cell:BI33:f:1
cell:BJ33:f:1
cell:BK33:f:1
cell:BL33:f:1
cell:BM33:f:1
cell:BN33:f:1
cell:BO33:f:1
cell:BP33:f:1
cell:BQ33:f:1
cell:BR33:f:1
cell:BS33:f:1
cell:BT33:f:1
cell:BU33:f:1
cell:BV33:f:1
cell:BW33:f:1
cell:BX33:f:1
cell:BY33:f:1
cell:BZ33:f:1
cell:CA33:f:1
cell:CB33:f:1
cell:CC33:f:1
cell:E34:f:1
cell:F34:f:1
cell:G34:f:1
cell:H34:f:1
cell:I34:f:1
cell:J34:f:1
cell:K34:f:1
cell:L34:f:1
cell:M34:f:1
cell:N34:f:1
cell:O34:f:1
cell:P34:f:1
cell:Q34:f:1
cell:R34:f:1
cell:S34:f:1
cell:T34:vtf:t:s:aa1:f:1
cell:U34:f:1
cell:V34:f:1
cell:W34:f:1
cell:X34:f:1
cell:Y34:f:1
cell:Z34:f:1
cell:AA34:f:1
cell:AB34:f:1
cell:AC34:vtf:t:u:aa2:f:1
cell:AD34:f:1
cell:AE34:f:1
cell:AF34:f:1
cell:AG34:f:1
cell:AH34:f:1
cell:AI34:f:1
cell:AJ34:f:1
cell:AK34:vtf:t:e:aa3:f:1
cell:AL34:f:1
cell:AM34:f:1
cell:AN34:f:1
cell:AO34:f:1
cell:AP34:f:1
cell:AQ34:f:1
cell:AR34:f:1
cell:AS34:vtf:t:u:aa4:f:1
cell:AT34:f:1
cell:AU34:f:1
cell:AV34:f:1
cell:AW34:f:1
cell:AX34:f:1
cell:AY34:f:1
cell:AZ34:vtf:t:i:aa5:f:1
cell:BA34:f:1
cell:BB34:f:1
cell:BC34:f:1
cell:BD34:f:1
cell:BE34:f:1
cell:BF34:f:1
cell:BG34:f:1
cell:BH34:f:1
cell:BI34:f:1
cell:BJ34:f:1
cell:BK34:f:1
cell:BL34:f:1
cell:BM34:f:1
cell:BN34:f:1
cell:BO34:f:1
cell:BP34:f:1
cell:BQ34:f:1
cell:BR34:f:1
cell:BS34:f:1
cell:BT34:f:1
cell:BU34:f:1
cell:BV34:f:1
cell:BW34:f:1
cell:BX34:f:1
cell:BY34:f:1
cell:BZ34:f:1
cell:CA34:f:1
cell:CB34:f:1
cell:CC34:f:1
cell:E35:f:1
cell:F35:f:1
cell:G35:f:1
cell:H35:f:1
cell:I35:f:1
cell:J35:f:1
cell:K35:f:1
cell:L35:f:1
cell:M35:f:1
cell:N35:f:1
cell:O35:f:1
cell:P35:f:1
cell:Q35:f:1
cell:R35:f:1
cell:S35:f:1
cell:T35:f:1
cell:U35:vtf:t: :ab1:f:1
cell:V35:f:1
cell:W35:f:1
cell:X35:f:1
cell:Y35:f:1
cell:Z35:f:1
cell:AA35:f:1
cell:AB35:f:1
cell:AC35:f:1
cell:AD35:vtf:t:t:ab2:f:1
cell:AE35:f:1
cell:AF35:f:1
cell:AG35:f:1
cell:AH35:f:1
cell:AI35:f:1
cell:AJ35:f:1
cell:AK35:f:1
cell:AL35:vtf:t:n:ab3:f:1
cell:AM35:f:1
cell:AN35:f:1
cell:AO35:f:1
cell:AP35:f:1
cell:AQ35:f:1
cell:AR35:f:1
cell:AS35:f:1
cell:AT35:vtf:t:e:ab4:f:1
cell:AU35:f:1
cell:AV35:f:1
cell:AW35:f:1
cell:AX35:f:1
cell:AY35:f:1
cell:AZ35:f:1
cell:BA35:vtf:t: :ab5:f:1
cell:BB35:f:1
cell:BC35:f:1
cell:BD35:f:1
cell:BE35:f:1
cell:BF35:f:1
cell:BG35:f:1
cell:BH35:f:1
cell:BI35:f:1
cell:BJ35:f:1
cell:BK35:f:1
cell:BL35:f:1
cell:BM35:f:1
cell:BN35:f:1
cell:BO35:f:1
cell:BP35:f:1
cell:BQ35:f:1
cell:BR35:f:1
cell:BS35:f:1
cell:BT35:f:1
cell:BU35:f:1
cell:BV35:f:1
cell:BW35:f:1
cell:BX35:f:1
cell:BY35:f:1
cell:BZ35:f:1
cell:CA35:f:1
cell:CB35:f:1
cell:CC35:f:1
cell:E36:f:1
cell:F36:f:1
cell:G36:f:1
cell:H36:f:1
cell:I36:f:1
cell:J36:f:1
cell:K36:f:1
cell:L36:f:1
cell:M36:f:1
cell:N36:f:1
cell:O36:f:1
cell:P36:f:1
cell:Q36:f:1
cell:R36:f:1
cell:S36:f:1
cell:T36:f:1
cell:U36:vtf:t:c:ac1:f:1
cell:V36:f:1
cell:W36:f:1
cell:X36:f:1
cell:Y36:f:1
cell:Z36:f:1
cell:AA36:f:1
cell:AB36:f:1
cell:AC36:f:1
cell:AD36:f:1
cell:AE36:vtf:t: :ac2:f:1
cell:AF36:f:1
cell:AG36:f:1
cell:AH36:f:1
cell:AI36:f:1
cell:AJ36:f:1
cell:AK36:f:1
cell:AL36:vtf:t:n:ac3:f:1
cell:AM36:f:1
cell:AN36:f:1
cell:AO36:f:1
cell:AP36:f:1
cell:AQ36:f:1
cell:AR36:f:1
cell:AS36:f:1
cell:AT36:vtf:t: :ac4:f:1
cell:AU36:f:1
cell:AV36:f:1
cell:AW36:f:1
cell:AX36:f:1
cell:AY36:f:1
cell:AZ36:f:1
cell:BA36:f:1
cell:BB36:vtf:t:t:ac5:f:1
cell:BC36:f:1
cell:BD36:f:1
cell:BE36:f:1
cell:BF36:f:1
cell:BG36:f:1
cell:BH36:f:1
cell:BI36:f:1
cell:BJ36:f:1
cell:BK36:f:1
cell:BL36:f:1
cell:BM36:f:1
cell:BN36:f:1
cell:BO36:f:1
cell:BP36:f:1
cell:BQ36:f:1
cell:BR36:f:1
cell:BS36:f:1
cell:BT36:f:1
cell:BU36:f:1
cell:BV36:f:1
cell:BW36:f:1
cell:BX36:f:1
cell:BY36:f:1
cell:BZ36:f:1
cell:CA36:f:1
cell:CB36:f:1
cell:CC36:f:1
cell:E37:f:1
cell:F37:f:1
cell:G37:f:1
cell:H37:f:1
cell:I37:f:1
cell:J37:f:1
cell:K37:f:1
cell:L37:f:1
cell:M37:f:1
cell:N37:f:1
cell:O37:f:1
cell:P37:f:1
cell:Q37:f:1
cell:R37:f:1
cell:S37:f:1
cell:T37:f:1
cell:U37:f:1
cell:V37:vtf:t:o:ad1:f:1
cell:W37:f:1
cell:X37:f:1
cell:Y37:f:1
cell:Z37:f:1
cell:AA37:f:1
cell:AB37:f:1
cell:AC37:f:1
cell:AD37:f:1
cell:AE37:vtf:t:m:ad2:f:1
cell:AF37:f:1
cell:AG37:f:1
cell:AH37:f:1
cell:AI37:f:1
cell:AJ37:f:1
cell:AK37:f:1
cell:AL37:f:1
cell:AM37:vtf:t:e:ad3:f:1
cell:AN37:f:1
cell:AO37:f:1
cell:AP37:f:1
cell:AQ37:f:1
cell:AR37:f:1
cell:AS37:f:1
cell:AT37:f:1
cell:AU37:vtf:t:l:ad4:f:1
cell:AV37:f:1
cell:AW37:f:1
cell:AX37:f:1
cell:AY37:f:1
cell:AZ37:f:1
cell:BA37:f:1
cell:BB37:vtf:t:e:ad5:f:1
cell:BC37:f:1
cell:BD37:f:1
cell:BE37:f:1
cell:BF37:f:1
cell:BG37:f:1
cell:BH37:f:1
cell:BI37:f:1
cell:BJ37:f:1
cell:BK37:f:1
cell:BL37:f:1
cell:BM37:f:1
cell:BN37:f:1
cell:BO37:f:1
cell:BP37:f:1
cell:BQ37:f:1
cell:BR37:f:1
cell:BS37:f:1
cell:BT37:f:1
cell:BU37:f:1
cell:BV37:f:1
cell:BW37:f:1
cell:BX37:f:1
cell:BY37:f:1
cell:BZ37:f:1
cell:CA37:f:1
cell:CB37:f:1
cell:CC37:f:1
cell:E38:f:1
cell:F38:f:1
cell:G38:f:1
cell:H38:f:1
cell:I38:f:1
cell:J38:f:1
cell:K38:f:1
cell:L38:f:1
cell:M38:f:1
cell:N38:f:1
cell:O38:f:1
cell:P38:f:1
cell:Q38:f:1
cell:R38:f:1
cell:S38:f:1
cell:T38:f:1
cell:U38:f:1
cell:V38:vtf:t:m:ae1:f:1
cell:W38:f:1
cell:X38:f:1
cell:Y38:f:1
cell:Z38:f:1
cell:AA38:f:1
cell:AB38:f:1
cell:AC38:f:1
cell:AD38:f:1
cell:AE38:f:1
cell:AF38:vtf:t:e:ae2:f:1
cell:AG38:f:1
cell:AH38:f:1
cell:AI38:f:1
cell:AJ38:f:1
cell:AK38:f:1
cell:AL38:f:1
cell:AM38:f:1
cell:AN38:vtf:t:n:ae3:f:1
cell:AO38:f:1
cell:AP38:f:1
cell:AQ38:f:1
cell:AR38:f:1
cell:AS38:f:1
cell:AT38:f:1
cell:AU38:f:1
cell:AV38:vtf:t:e:ae4:f:1
cell:AW38:f:1
cell:AX38:f:1
cell:AY38:f:1
cell:AZ38:f:1
cell:BA38:f:1
cell:BB38:f:1
cell:BC38:vtf:t: :ae5:f:1
cell:BD38:f:1
cell:BE38:f:1
cell:BF38:f:1
cell:BG38:f:1
cell:BH38:f:1
cell:BI38:f:1
cell:BJ38:f:1
cell:BK38:f:1
cell:BL38:f:1
cell:BM38:f:1
cell:BN38:f:1
cell:BO38:f:1
cell:BP38:f:1
cell:BQ38:f:1
cell:BR38:f:1
cell:BS38:f:1
cell:BT38:f:1
cell:BU38:f:1
cell:BV38:f:1
cell:BW38:f:1
cell:BX38:f:1
cell:BY38:f:1
cell:BZ38:f:1
cell:CA38:f:1
cell:CB38:f:1
cell:CC38:f:1
cell:E39:f:1
cell:F39:f:1
cell:G39:f:1
cell:H39:f:1
cell:I39:f:1
cell:J39:f:1
cell:K39:f:1
cell:L39:f:1
cell:M39:f:1
cell:N39:f:1
cell:O39:f:1
cell:P39:f:1
cell:Q39:f:1
cell:R39:f:1
cell:S39:f:1
cell:T39:f:1
cell:U39:f:1
cell:V39:f:1
cell:W39:vtf:t:m:af1:f:1
cell:X39:f:1
cell:Y39:f:1
cell:Z39:f:1
cell:AA39:f:1
cell:AB39:f:1
cell:AC39:f:1
cell:AD39:f:1
cell:AE39:f:1
cell:AF39:vtf:t:r:af2:f:1
cell:AG39:f:1
cell:AH39:f:1
cell:AI39:f:1
cell:AJ39:f:1
cell:AK39:f:1
cell:AL39:f:1
cell:AM39:f:1
cell:AN39:vtf:t:t:af3:f:1
cell:AO39:f:1
cell:AP39:f:1
cell:AQ39:f:1
cell:AR39:f:1
cell:AS39:f:1
cell:AT39:f:1
cell:AU39:f:1
cell:AV39:vtf:t: :af4:f:1
cell:AW39:f:1
cell:AX39:f:1
cell:AY39:f:1
cell:AZ39:f:1
cell:BA39:f:1
cell:BB39:f:1
cell:BC39:f:1
cell:BD39:vtf:t:r:af5:f:1
cell:BE39:f:1
cell:BF39:f:1
cell:BG39:f:1
cell:BH39:f:1
cell:BI39:f:1
cell:BJ39:f:1
cell:BK39:f:1
cell:BL39:f:1
cell:BM39:f:1
cell:BN39:f:1
cell:BO39:f:1
cell:BP39:f:1
cell:BQ39:f:1
cell:BR39:f:1
cell:BS39:f:1
cell:BT39:f:1
cell:BU39:f:1
cell:BV39:f:1
cell:BW39:f:1
cell:BX39:f:1
cell:BY39:f:1
cell:BZ39:f:1
cell:CA39:f:1
cell:CB39:f:1
cell:CC39:f:1
cell:E40:f:1
cell:F40:f:1
cell:G40:f:1
cell:H40:f:1
cell:I40:f:1
cell:J40:f:1
cell:K40:f:1
cell:L40:f:1
cell:M40:f:1
cell:N40:f:1
cell:O40:f:1
cell:P40:f:1
cell:Q40:f:1
cell:R40:f:1
cell:S40:f:1
cell:T40:f:1
cell:U40:f:1
cell:V40:f:1
cell:W40:vtf:t:e:ag1:f:1
cell:X40:f:1
cell:Y40:f:1
cell:Z40:f:1
cell:AA40:f:1
cell:AB40:f:1
cell:AC40:f:1
cell:AD40:f:1
cell:AE40:f:1
cell:AF40:f:1
cell:AG40:vtf:t:v:ag2:f:1
cell:AH40:f:1
cell:AI40:f:1
cell:AJ40:f:1
cell:AK40:f:1
cell:AL40:f:1
cell:AM40:f:1
cell:AN40:f:1
cell:AO40:vtf:t: :ag3:f:1
cell:AP40:f:1
cell:AQ40:f:1
cell:AR40:f:1
cell:AS40:f:1
cell:AT40:f:1
cell:AU40:f:1
cell:AV40:f:1
cell:AW40:vtf:t:r:ag4:f:1
cell:AX40:f:1
cell:AY40:f:1
cell:AZ40:f:1
cell:BA40:f:1
cell:BB40:f:1
cell:BC40:f:1
cell:BD40:vtf:t:e:ag5:f:1
cell:BE40:f:1
cell:BF40:f:1
cell:BG40:f:1
cell:BH40:f:1
cell:BI40:f:1
cell:BJ40:f:1
cell:BK40:f:1
cell:BL40:f:1
cell:BM40:f:1
cell:BN40:f:1
cell:BO40:f:1
cell:BP40:f:1
cell:BQ40:f:1
cell:BR40:f:1
cell:BS40:f:1
cell:BT40:f:1
cell:BU40:f:1
cell:BV40:f:1
cell:BW40:f:1
cell:BX40:f:1
cell:BY40:f:1
cell:BZ40:f:1
cell:CA40:f:1
cell:CB40:f:1
cell:CC40:f:1
cell:E41:f:1
cell:F41:f:1
cell:G41:f:1
cell:H41:f:1
cell:I41:f:1
cell:J41:f:1
cell:K41:f:1
cell:L41:f:1
cell:M41:f:1
cell:N41:f:1
cell:O41:f:1
cell:P41:f:1
cell:Q41:f:1
cell:R41:f:1
cell:S41:f:1
cell:T41:f:1
cell:U41:f:1
cell:V41:f:1
cell:W41:f:1
cell:X41:vtf:t: :ah1:f:1
cell:Y41:f:1
cell:Z41:f:1
cell:AA41:f:1
cell:AB41:f:1
cell:AC41:f:1
cell:AD41:f:1
cell:AE41:f:1
cell:AF41:f:1
cell:AG41:f:1
cell:AH41:vtf:t:e:ah2:f:1
cell:AI41:f:1
cell:AJ41:f:1
cell:AK41:f:1
cell:AL41:f:1
cell:AM41:f:1
cell:AN41:f:1
cell:AO41:vtf:t:à:ah3:f:1
cell:AP41:f:1
cell:AQ41:f:1
cell:AR41:f:1
cell:AS41:f:1
cell:AT41:f:1
cell:AU41:f:1
cell:AV41:f:1
cell:AW41:vtf:t:e:ah4:f:1
cell:AX41:f:1
cell:AY41:f:1
cell:AZ41:f:1
cell:BA41:f:1
cell:BB41:f:1
cell:BC41:f:1
cell:BD41:f:1
cell:BE41:vtf:t:t:ah5:f:1
cell:BF41:f:1
cell:BG41:f:1
cell:BH41:f:1
cell:BI41:f:1
cell:BJ41:f:1
cell:BK41:f:1
cell:BL41:f:1
cell:BM41:f:1
cell:BN41:f:1
cell:BO41:f:1
cell:BP41:f:1
cell:BQ41:f:1
cell:BR41:f:1
cell:BS41:f:1
cell:BT41:f:1
cell:BU41:f:1
cell:BV41:f:1
cell:BW41:f:1
cell:BX41:f:1
cell:BY41:f:1
cell:BZ41:f:1
cell:CA41:f:1
cell:CB41:f:1
cell:CC41:f:1
cell:E42:f:1
cell:F42:f:1
cell:G42:f:1
cell:H42:f:1
cell:I42:f:1
cell:J42:f:1
cell:K42:f:1
cell:L42:f:1
cell:M42:f:1
cell:N42:f:1
cell:O42:f:1
cell:P42:f:1
cell:Q42:f:1
cell:R42:f:1
cell:S42:f:1
cell:T42:f:1
cell:U42:f:1
cell:V42:f:1
cell:W42:f:1
cell:X42:f:1
cell:Y42:vtf:t:s:ai1:f:1
cell:Z42:f:1
cell:AA42:f:1
cell:AB42:f:1
cell:AC42:f:1
cell:AD42:f:1
cell:AE42:f:1
cell:AF42:f:1
cell:AG42:f:1
cell:AH42:vtf:t:i:ai2:f:1
cell:AI42:f:1
cell:AJ42:f:1
cell:AK42:f:1
cell:AL42:f:1
cell:AM42:f:1
cell:AN42:f:1
cell:AO42:f:1
cell:AP42:vtf:t: :ai3:f:1
cell:AQ42:f:1
cell:AR42:f:1
cell:AS42:f:1
cell:AT42:f:1
cell:AU42:f:1
cell:AV42:f:1
cell:AW42:f:1
cell:AX42:vtf:t:g:ai4:f:1
cell:AY42:f:1
cell:AZ42:f:1
cell:BA42:f:1
cell:BB42:f:1
cell:BC42:f:1
cell:BD42:f:1
cell:BE42:f:1
cell:BF42:vtf:t:i:ai5:f:1
cell:BG42:f:1
cell:BH42:f:1
cell:BI42:f:1
cell:BJ42:f:1
cell:BK42:f:1
cell:BL42:f:1
cell:BM42:f:1
cell:BN42:f:1
cell:BO42:f:1
cell:BP42:f:1
cell:BQ42:f:1
cell:BR42:f:1
cell:BS42:f:1
cell:BT42:f:1
cell:BU42:f:1
cell:BV42:f:1
cell:BW42:f:1
cell:BX42:f:1
cell:BY42:f:1
cell:BZ42:f:1
cell:CA42:f:1
cell:CB42:f:1
cell:CC42:f:1
cell:E43:f:1
cell:F43:f:1
cell:G43:f:1
cell:H43:f:1
cell:I43:f:1
cell:J43:f:1
cell:K43:f:1
cell:L43:f:1
cell:M43:f:1
cell:N43:f:1
cell:O43:f:1
cell:P43:f:1
cell:Q43:f:1
cell:R43:f:1
cell:S43:f:1
cell:T43:f:1
cell:U43:f:1
cell:V43:f:1
cell:W43:f:1
cell:X43:f:1
cell:Y43:f:1
cell:Z43:vtf:t:i:aj1:f:1
cell:AA43:f:1
cell:AB43:f:1
cell:AC43:f:1
cell:AD43:f:1
cell:AE43:f:1
cell:AF43:f:1
cell:AG43:f:1
cell:AH43:f:1
cell:AI43:vtf:t:l:aj2:f:1
cell:AJ43:f:1
cell:AK43:f:1
cell:AL43:f:1
cell:AM43:f:1
cell:AN43:f:1
cell:AO43:f:1
cell:AP43:f:1
cell:AQ43:vtf:t:h:aj3:f:1
cell:AR43:f:1
cell:AS43:f:1
cell:AT43:f:1
cell:AU43:f:1
cell:AV43:f:1
cell:AW43:f:1
cell:AX43:vtf:t:r:aj4:f:1
cell:AY43:f:1
cell:AZ43:f:1
cell:BA43:f:1
cell:BB43:f:1
cell:BC43:f:1
cell:BD43:f:1
cell:BE43:f:1
cell:BF43:vtf:t:e:aj5:f:1
cell:BG43:f:1
cell:BH43:f:1
cell:BI43:f:1
cell:BJ43:f:1
cell:BK43:f:1
cell:BL43:f:1
cell:BM43:f:1
cell:BN43:f:1
cell:BO43:f:1
cell:BP43:f:1
cell:BQ43:f:1
cell:BR43:f:1
cell:BS43:f:1
cell:BT43:f:1
cell:BU43:f:1
cell:BV43:f:1
cell:BW43:f:1
cell:BX43:f:1
cell:BY43:f:1
cell:BZ43:f:1
cell:CA43:f:1
cell:CB43:f:1
cell:CC43:f:1
cell:E44:f:1
cell:F44:f:1
cell:G44:f:1
cell:H44:f:1
cell:I44:f:1
cell:J44:f:1
cell:K44:f:1
cell:L44:f:1
cell:M44:f:1
cell:N44:f:1
cell:O44:f:1
cell:P44:f:1
cell:Q44:f:1
cell:R44:f:1
cell:S44:f:1
cell:T44:f:1
cell:U44:f:1
cell:V44:f:1
cell:W44:f:1
cell:X44:f:1
cell:Y44:f:1
cell:Z44:vtf:t: :ak1:f:1
cell:AA44:f:1
cell:AB44:f:1
cell:AC44:f:1
cell:AD44:f:1
cell:AE44:f:1
cell:AF44:f:1
cell:AG44:f:1
cell:AH44:f:1
cell:AI44:f:1
cell:AJ44:vtf:t:l:ak2:f:1
cell:AK44:f:1
cell:AL44:f:1
cell:AM44:f:1
cell:AN44:f:1
cell:AO44:f:1
cell:AP44:f:1
cell:AQ44:f:1
cell:AR44:vtf:t:e:ak3:f:1
cell:AS44:f:1
cell:AT44:f:1
cell:AU44:f:1
cell:AV44:f:1
cell:AW44:f:1
cell:AX44:f:1
cell:AY44:vtf:t:e:ak4:f:1
cell:AZ44:f:1
cell:BA44:f:1
cell:BB44:f:1
cell:BC44:f:1
cell:BD44:f:1
cell:BE44:f:1
cell:BF44:f:1
cell:BG44:vtf:t:n:ak5:f:1
cell:BH44:f:1
cell:BI44:f:1
cell:BJ44:f:1
cell:BK44:f:1
cell:BL44:f:1
cell:BM44:f:1
cell:BN44:f:1
cell:BO44:f:1
cell:BP44:f:1
cell:BQ44:f:1
cell:BR44:f:1
cell:BS44:f:1
cell:BT44:f:1
cell:BU44:f:1
cell:BV44:f:1
cell:BW44:f:1
cell:BX44:f:1
cell:BY44:f:1
cell:BZ44:f:1
cell:CA44:f:1
cell:CB44:f:1
cell:CC44:f:1
cell:E45:f:1
cell:F45:f:1
cell:G45:f:1
cell:H45:f:1
cell:I45:f:1
cell:J45:f:1
cell:K45:f:1
cell:L45:f:1
cell:M45:f:1
cell:N45:f:1
cell:O45:f:1
cell:P45:f:1
cell:Q45:f:1
cell:R45:f:1
cell:S45:f:1
cell:T45:f:1
cell:U45:f:1
cell:V45:f:1
cell:W45:f:1
cell:X45:f:1
cell:Y45:f:1
cell:Z45:vtf:t:e:al1:f:1
cell:AA45:f:1
cell:AB45:f:1
cell:AC45:f:1
cell:AD45:f:1
cell:AE45:f:1
cell:AF45:f:1
cell:AG45:f:1
cell:AH45:f:1
cell:AI45:f:1
cell:AJ45:f:1
cell:AK45:vtf:t:e:al2:f:1
cell:AL45:f:1
cell:AM45:f:1
cell:AN45:f:1
cell:AO45:f:1
cell:AP45:f:1
cell:AQ45:f:1
cell:AR45:f:1
cell:AS45:vtf:t:n:al3:f:1
cell:AT45:f:1
cell:AU45:f:1
cell:AV45:f:1
cell:AW45:f:1
cell:AX45:f:1
cell:AY45:vtf:t:t:al4:f:1
cell:AZ45:f:1
cell:BA45:f:1
cell:BB45:f:1
cell:BC45:f:1
cell:BD45:f:1
cell:BE45:f:1
cell:BF45:f:1
cell:BG45:vtf:t:n:al5:f:1
cell:BH45:f:1
cell:BI45:f:1
cell:BJ45:f:1
cell:BK45:f:1
cell:BL45:f:1
cell:BM45:f:1
cell:BN45:f:1
cell:BO45:f:1
cell:BP45:f:1
cell:BQ45:f:1
cell:BR45:f:1
cell:BS45:f:1
cell:BT45:f:1
cell:BU45:f:1
cell:BV45:f:1
cell:BW45:f:1
cell:BX45:f:1
cell:BY45:f:1
cell:BZ45:f:1
cell:CA45:f:1
cell:CB45:f:1
cell:CC45:f:1
cell:E46:f:1
cell:F46:f:1
cell:G46:f:1
cell:H46:f:1
cell:I46:f:1
cell:J46:f:1
cell:K46:f:1
cell:L46:f:1
cell:M46:f:1
cell:N46:f:1
cell:O46:f:1
cell:P46:f:1
cell:Q46:f:1
cell:R46:f:1
cell:S46:f:1
cell:T46:f:1
cell:U46:f:1
cell:V46:f:1
cell:W46:f:1
cell:X46:f:1
cell:Y46:f:1
cell:Z46:f:1
cell:AA46:vtf:t:l:am1:f:1
cell:AB46:f:1
cell:AC46:f:1
cell:AD46:f:1
cell:AE46:f:1
cell:AF46:f:1
cell:AG46:f:1
cell:AH46:f:1
cell:AI46:f:1
cell:AJ46:f:1
cell:AK46:vtf:t:u:am2:f:1
cell:AL46:f:1
cell:AM46:f:1
cell:AN46:f:1
cell:AO46:f:1
cell:AP46:f:1
cell:AQ46:f:1
cell:AR46:f:1
cell:AS46:vtf:t:n:am3:f:1
cell:AT46:f:1
cell:AU46:f:1
cell:AV46:f:1
cell:AW46:f:1
cell:AX46:f:1
cell:AY46:f:1
cell:AZ46:vtf:t: :am4:f:1
cell:BA46:f:1
cell:BB46:f:1
cell:BC46:f:1
cell:BD46:f:1
cell:BE46:f:1
cell:BF46:f:1
cell:BG46:f:1
cell:BH46:vtf:t:e:am5:f:1
cell:BI46:f:1
cell:BJ46:f:1
cell:BK46:f:1
cell:BL46:f:1
cell:BM46:f:1
cell:BN46:f:1
cell:BO46:f:1
cell:BP46:f:1
cell:BQ46:f:1
cell:BR46:f:1
cell:BS46:f:1
cell:BT46:f:1
cell:BU46:f:1
cell:BV46:f:1
cell:BW46:f:1
cell:BX46:f:1
cell:BY46:f:1
cell:BZ46:f:1
cell:CA46:f:1
cell:CB46:f:1
cell:CC46:f:1
cell:E47:f:1
cell:F47:f:1
cell:G47:f:1
cell:H47:f:1
cell:I47:f:1
cell:J47:f:1
cell:K47:f:1
cell:L47:f:1
cell:M47:f:1
cell:N47:f:1
cell:O47:f:1
cell:P47:f:1
cell:Q47:f:1
cell:R47:f:1
cell:S47:f:1
cell:T47:f:1
cell:U47:f:1
cell:V47:f:1
cell:W47:f:1
cell:X47:f:1
cell:Y47:f:1
cell:Z47:f:1
cell:AA47:vtf:t:l:an1:f:1
cell:AB47:f:1
cell:AC47:f:1
cell:AD47:f:1
cell:AE47:f:1
cell:AF47:f:1
cell:AG47:f:1
cell:AH47:f:1
cell:AI47:f:1
cell:AJ47:f:1
cell:AK47:f:1
cell:AL47:vtf:t:s:an2:f:1
cell:AM47:f:1
cell:AN47:f:1
cell:AO47:f:1
cell:AP47:f:1
cell:AQ47:f:1
cell:AR47:f:1
cell:AS47:f:1
cell:AT47:vtf:t:i:an3:f:1
cell:AU47:f:1
cell:AV47:f:1
cell:AW47:f:1
cell:AX47:f:1
cell:AY47:f:1
cell:AZ47:vtf:t:e:an4:f:1
cell:BA47:f:1
cell:BB47:f:1
cell:BC47:f:1
cell:BD47:f:1
cell:BE47:f:1
cell:BF47:f:1
cell:BG47:f:1
cell:BH47:vtf:t:n:an5:f:1
cell:BI47:f:1
cell:BJ47:f:1
cell:BK47:f:1
cell:BL47:f:1
cell:BM47:f:1
cell:BN47:f:1
cell:BO47:f:1
cell:BP47:f:1
cell:BQ47:f:1
cell:BR47:f:1
cell:BS47:f:1
cell:BT47:f:1
cell:BU47:f:1
cell:BV47:f:1
cell:BW47:f:1
cell:BX47:f:1
cell:BY47:f:1
cell:BZ47:f:1
cell:CA47:f:1
cell:CB47:f:1
cell:CC47:f:1
cell:E48:f:1
cell:F48:f:1
cell:G48:f:1
cell:H48:f:1
cell:I48:f:1
cell:J48:f:1
cell:K48:f:1
cell:L48:f:1
cell:M48:f:1
cell:N48:f:1
cell:O48:f:1
cell:P48:f:1
cell:Q48:f:1
cell:R48:f:1
cell:S48:f:1
cell:T48:f:1
cell:U48:f:1
cell:V48:f:1
cell:W48:f:1
cell:X48:f:1
cell:Y48:f:1
cell:Z48:f:1
cell:AA48:f:1
cell:AB48:vtf:t:e:ao1:f:1
cell:AC48:f:1
cell:AD48:f:1
cell:AE48:f:1
cell:AF48:f:1
cell:AG48:f:1
cell:AH48:f:1
cell:AI48:f:1
cell:AJ48:f:1
cell:AK48:f:1
cell:AL48:vtf:t:e:ao2:f:1
cell:AM48:f:1
cell:AN48:f:1
cell:AO48:f:1
cell:AP48:f:1
cell:AQ48:f:1
cell:AR48:f:1
cell:AS48:f:1
cell:AT48:f:1
cell:AU48:vtf:t:r:ao3:f:1
cell:AV48:f:1
cell:AW48:f:1
cell:AX48:f:1
cell:AY48:f:1
cell:AZ48:f:1
cell:BA48:vtf:t:t:ao4:f:1
cell:BB48:f:1
cell:BC48:f:1
cell:BD48:f:1
cell:BE48:f:1
cell:BF48:f:1
cell:BG48:f:1
cell:BH48:f:1
cell:BI48:vtf:t:t:ao5:f:1
cell:BJ48:f:1
cell:BK48:f:1
cell:BL48:f:1
cell:BM48:f:1
cell:BN48:f:1
cell:BO48:f:1
cell:BP48:f:1
cell:BQ48:f:1
cell:BR48:f:1
cell:BS48:f:1
cell:BT48:f:1
cell:BU48:f:1
cell:BV48:f:1
cell:BW48:f:1
cell:BX48:f:1
cell:BY48:f:1
cell:BZ48:f:1
cell:CA48:f:1
cell:CB48:f:1
cell:CC48:f:1
cell:E49:f:1
cell:F49:f:1
cell:G49:f:1
cell:H49:f:1
cell:I49:f:1
cell:J49:f:1
cell:K49:f:1
cell:L49:f:1
cell:M49:f:1
cell:N49:f:1
cell:O49:f:1
cell:P49:f:1
cell:Q49:f:1
cell:R49:f:1
cell:S49:f:1
cell:T49:f:1
cell:U49:f:1
cell:V49:f:1
cell:W49:f:1
cell:X49:f:1
cell:Y49:f:1
cell:Z49:f:1
cell:AA49:f:1
cell:AB49:vtf:t:s:ap1:f:1
cell:AC49:f:1
cell:AD49:f:1
cell:AE49:f:1
cell:AF49:f:1
cell:AG49:f:1
cell:AH49:f:1
cell:AI49:f:1
cell:AJ49:f:1
cell:AK49:f:1
cell:AL49:f:1
cell:AM49:vtf:t:s:ap2:f:1
cell:AN49:f:1
cell:AO49:f:1
cell:AP49:f:1
cell:AQ49:f:1
cell:AR49:f:1
cell:AS49:f:1
cell:AT49:f:1
cell:AU49:f:1
cell:AV49:vtf:t: :ap3:f:1
cell:AW49:f:1
cell:AX49:f:1
cell:AY49:f:1
cell:AZ49:f:1
cell:BA49:f:1
cell:BB49:vtf:t: :ap4:f:1
cell:BC49:f:1
cell:BD49:f:1
cell:BE49:f:1
cell:BF49:f:1
cell:BG49:f:1
cell:BH49:f:1
cell:BI49:vtf:t: :ap5:f:1
cell:BJ49:f:1
cell:BK49:f:1
cell:BL49:f:1
cell:BM49:f:1
cell:BN49:f:1
cell:BO49:f:1
cell:BP49:f:1
cell:BQ49:f:1
cell:BR49:f:1
cell:BS49:f:1
cell:BT49:f:1
cell:BU49:f:1
cell:BV49:f:1
cell:BW49:f:1
cell:BX49:f:1
cell:BY49:f:1
cell:BZ49:f:1
cell:CA49:f:1
cell:CB49:f:1
cell:CC49:f:1
cell:E50:f:1
cell:F50:f:1
cell:G50:f:1
cell:H50:f:1
cell:I50:f:1
cell:J50:f:1
cell:K50:f:1
cell:L50:f:1
cell:M50:f:1
cell:N50:f:1
cell:O50:f:1
cell:P50:f:1
cell:Q50:f:1
cell:R50:f:1
cell:S50:f:1
cell:T50:f:1
cell:U50:f:1
cell:V50:f:1
cell:W50:f:1
cell:X50:f:1
cell:Y50:f:1
cell:Z50:f:1
cell:AA50:f:1
cell:AB50:f:1
cell:AC50:vtf:t: :aq1:f:1
cell:AD50:f:1
cell:AE50:f:1
cell:AF50:f:1
cell:AG50:f:1
cell:AH50:f:1
cell:AI50:f:1
cell:AJ50:f:1
cell:AK50:f:1
cell:AL50:f:1
cell:AM50:vtf:t: :aq2:f:1
cell:AN50:f:1
cell:AO50:f:1
cell:AP50:f:1
cell:AQ50:f:1
cell:AR50:f:1
cell:AS50:f:1
cell:AT50:f:1
cell:AU50:f:1
cell:AV50:vtf:t:t:aq3:f:1
cell:AW50:f:1
cell:AX50:f:1
cell:AY50:f:1
cell:AZ50:f:1
cell:BA50:f:1
cell:BB50:f:1
cell:BC50:vtf:t:l:aq4:f:1
cell:BD50:f:1
cell:BE50:f:1
cell:BF50:f:1
cell:BG50:f:1
cell:BH50:f:1
cell:BI50:vtf:t:e:aq5:f:1
cell:BJ50:f:1
cell:BK50:f:1
cell:BL50:f:1
cell:BM50:f:1
cell:BN50:f:1
cell:BO50:f:1
cell:BP50:f:1
cell:BQ50:f:1
cell:BR50:f:1
cell:BS50:f:1
cell:BT50:f:1
cell:BU50:f:1
cell:BV50:f:1
cell:BW50:f:1
cell:BX50:f:1
cell:BY50:f:1
cell:BZ50:f:1
cell:CA50:f:1
cell:CB50:f:1
cell:CC50:f:1
cell:E51:f:1
cell:F51:f:1
cell:G51:f:1
cell:H51:f:1
cell:I51:f:1
cell:J51:f:1
cell:K51:f:1
cell:L51:f:1
cell:M51:f:1
cell:N51:f:1
cell:O51:f:1
cell:P51:f:1
cell:Q51:f:1
cell:R51:f:1
cell:S51:f:1
cell:T51:f:1
cell:U51:f:1
cell:V51:f:1
cell:W51:f:1
cell:X51:f:1
cell:Y51:f:1
cell:Z51:f:1
cell:AA51:f:1
cell:AB51:f:1
cell:AC51:f:1
cell:AD51:vtf:t:é:ar1:f:1
cell:AE51:f:1
cell:AF51:f:1
cell:AG51:f:1
cell:AH51:f:1
cell:AI51:f:1
cell:AJ51:f:1
cell:AK51:f:1
cell:AL51:f:1
cell:AM51:f:1
cell:AN51:vtf:t:r:ar2:f:1
cell:AO51:f:1
cell:AP51:f:1
cell:AQ51:f:1
cell:AR51:f:1
cell:AS51:f:1
cell:AT51:f:1
cell:AU51:f:1
cell:AV51:f:1
cell:AW51:vtf:t:o:ar3:f:1
cell:AX51:f:1
cell:AY51:f:1
cell:AZ51:f:1
cell:BA51:f:1
cell:BB51:f:1
cell:BC51:f:1
cell:BD51:vtf:t:e:ar4:f:1
cell:BE51:f:1
cell:BF51:f:1
cell:BG51:f:1
cell:BH51:f:1
cell:BI51:f:1
cell:BJ51:vtf:t:n:ar5:f:1
cell:BK51:f:1
cell:BL51:f:1
cell:BM51:f:1
cell:BN51:f:1
cell:BO51:f:1
cell:BP51:f:1
cell:BQ51:f:1
cell:BR51:f:1
cell:BS51:f:1
cell:BT51:f:1
cell:BU51:f:1
cell:BV51:f:1
cell:BW51:f:1
cell:BX51:f:1
cell:BY51:f:1
cell:BZ51:f:1
cell:CA51:f:1
cell:CB51:f:1
cell:CC51:f:1
cell:E52:f:1
cell:F52:f:1
cell:G52:f:1
cell:H52:f:1
cell:I52:f:1
cell:J52:f:1
cell:K52:f:1
cell:L52:f:1
cell:M52:f:1
cell:N52:f:1
cell:O52:f:1
cell:P52:f:1
cell:Q52:f:1
cell:R52:f:1
cell:S52:f:1
cell:T52:f:1
cell:U52:f:1
cell:V52:f:1
cell:W52:f:1
cell:X52:f:1
cell:Y52:f:1
cell:Z52:f:1
cell:AA52:f:1
cell:AB52:f:1
cell:AC52:f:1
cell:AD52:f:1
cell:AE52:vtf:t:t:as1:f:1
cell:AF52:f:1
cell:AG52:f:1
cell:AH52:f:1
cell:AI52:f:1
cell:AJ52:f:1
cell:AK52:f:1
cell:AL52:f:1
cell:AM52:f:1
cell:AN52:vtf:t:e:as2:f:1
cell:AO52:f:1
cell:AP52:f:1
cell:AQ52:f:1
cell:AR52:f:1
cell:AS52:f:1
cell:AT52:f:1
cell:AU52:f:1
cell:AV52:f:1
cell:AW52:vtf:t:u:as3:f:1
cell:AX52:f:1
cell:AY52:f:1
cell:AZ52:f:1
cell:BA52:f:1
cell:BB52:f:1
cell:BC52:f:1
cell:BD52:f:1
cell:BE52:vtf:t: :as4:f:1
cell:BF52:f:1
cell:BG52:f:1
cell:BH52:f:1
cell:BI52:f:1
cell:BJ52:vtf:t: :as5:f:1
cell:BK52:f:1
cell:BL52:f:1
cell:BM52:f:1
cell:BN52:f:1
cell:BO52:f:1
cell:BP52:f:1
cell:BQ52:f:1
cell:BR52:f:1
cell:BS52:f:1
cell:BT52:f:1
cell:BU52:f:1
cell:BV52:f:1
cell:BW52:f:1
cell:BX52:f:1
cell:BY52:f:1
cell:BZ52:f:1
cell:CA52:f:1
cell:CB52:f:1
cell:CC52:f:1
cell:E53:f:1
cell:F53:f:1
cell:G53:f:1
cell:H53:f:1
cell:I53:f:1
cell:J53:f:1
cell:K53:f:1
cell:L53:f:1
cell:M53:f:1
cell:N53:f:1
cell:O53:f:1
cell:P53:f:1
cell:Q53:f:1
cell:R53:f:1
cell:S53:f:1
cell:T53:f:1
cell:U53:f:1
cell:V53:f:1
cell:W53:f:1
cell:X53:f:1
cell:Y53:f:1
cell:Z53:f:1
cell:AA53:f:1
cell:AB53:f:1
cell:AC53:f:1
cell:AD53:f:1
cell:AE53:f:1
cell:AF53:vtf:t:a:at1:f:1
cell:AG53:f:1
cell:AH53:f:1
cell:AI53:f:1
cell:AJ53:f:1
cell:AK53:f:1
cell:AL53:f:1
cell:AM53:f:1
cell:AN53:f:1
cell:AO53:vtf:t:n:at2:f:1
cell:AP53:f:1
cell:AQ53:f:1
cell:AR53:f:1
cell:AS53:f:1
cell:AT53:f:1
cell:AU53:f:1
cell:AV53:f:1
cell:AW53:f:1
cell:AX53:vtf:t:t:at3:f:1
cell:AY53:f:1
cell:AZ53:f:1
cell:BA53:f:1
cell:BB53:f:1
cell:BC53:f:1
cell:BD53:f:1
cell:BE53:f:1
cell:BF53:vtf:t:d:at4:f:1
cell:BG53:f:1
cell:BH53:f:1
cell:BI53:f:1
cell:BJ53:f:1
cell:BK53:vtf:t:h:at5:f:1
cell:BL53:f:1
cell:BM53:f:1
cell:BN53:f:1
cell:BO53:f:1
cell:BP53:f:1
cell:BQ53:f:1
cell:BR53:f:1
cell:BS53:f:1
cell:BT53:f:1
cell:BU53:f:1
cell:BV53:f:1
cell:BW53:f:1
cell:BX53:f:1
cell:BY53:f:1
cell:BZ53:f:1
cell:CA53:f:1
cell:CB53:f:1
cell:CC53:f:1
cell:E54:f:1
cell:F54:f:1
cell:G54:f:1
cell:H54:f:1
cell:I54:f:1
cell:J54:f:1
cell:K54:f:1
cell:L54:f:1
cell:M54:f:1
cell:N54:f:1
cell:O54:f:1
cell:P54:f:1
cell:Q54:f:1
cell:R54:f:1
cell:S54:f:1
cell:T54:f:1
cell:U54:f:1
cell:V54:f:1
cell:W54:f:1
cell:X54:f:1
cell:Y54:f:1
cell:Z54:f:1
cell:AA54:f:1
cell:AB54:f:1
cell:AC54:f:1
cell:AD54:f:1
cell:AE54:f:1
cell:AF54:vtf:t:i:au1:f:1
cell:AG54:f:1
cell:AH54:f:1
cell:AI54:f:1
cell:AJ54:f:1
cell:AK54:f:1
cell:AL54:f:1
cell:AM54:f:1
cell:AN54:f:1
cell:AO54:f:1
cell:AP54:vtf:t:c:au2:f:1
cell:AQ54:f:1
cell:AR54:f:1
cell:AS54:f:1
cell:AT54:f:1
cell:AU54:f:1
cell:AV54:f:1
cell:AW54:f:1
cell:AX54:vtf:t: :au3:f:1
cell:AY54:f:1
cell:AZ54:f:1
cell:BA54:f:1
cell:BB54:f:1
cell:BC54:f:1
cell:BD54:f:1
cell:BE54:f:1
cell:BF54:vtf:t:é:au4:f:1
cell:BG54:f:1
cell:BH54:f:1
cell:BI54:f:1
cell:BJ54:f:1
cell:BK54:vtf:t:a:au5:f:1
cell:BL54:f:1
cell:BM54:f:1
cell:BN54:f:1
cell:BO54:f:1
cell:BP54:f:1
cell:BQ54:f:1
cell:BR54:f:1
cell:BS54:f:1
cell:BT54:f:1
cell:BU54:f:1
cell:BV54:f:1
cell:BW54:f:1
cell:BX54:f:1
cell:BY54:f:1
cell:BZ54:f:1
cell:CA54:f:1
cell:CB54:f:1
cell:CC54:f:1
cell:E55:f:1
cell:F55:f:1
cell:G55:f:1
cell:H55:f:1
cell:I55:f:1
cell:J55:f:1
cell:K55:f:1
cell:L55:f:1
cell:M55:f:1
cell:N55:f:1
cell:O55:f:1
cell:P55:f:1
cell:Q55:f:1
cell:R55:f:1
cell:S55:f:1
cell:T55:f:1
cell:U55:f:1
cell:V55:f:1
cell:W55:f:1
cell:X55:f:1
cell:Y55:f:1
cell:Z55:f:1
cell:AA55:f:1
cell:AB55:f:1
cell:AC55:f:1
cell:AD55:f:1
cell:AE55:f:1
cell:AF55:f:1
cell:AG55:vtf:t:e:av1:f:1
cell:AH55:f:1
cell:AI55:f:1
cell:AJ55:f:1
cell:AK55:f:1
cell:AL55:f:1
cell:AM55:f:1
cell:AN55:f:1
cell:AO55:f:1
cell:AP55:vtf:t:o:av2:f:1
cell:AQ55:f:1
cell:AR55:f:1
cell:AS55:f:1
cell:AT55:f:1
cell:AU55:f:1
cell:AV55:f:1
cell:AW55:f:1
cell:AX55:f:1
cell:AY55:vtf:t:u:av3:f:1
cell:AZ55:f:1
cell:BA55:f:1
cell:BB55:f:1
cell:BC55:f:1
cell:BD55:f:1
cell:BE55:f:1
cell:BF55:f:1
cell:BG55:vtf:t:d:av4:f:1
cell:BH55:f:1
cell:BI55:f:1
cell:BJ55:f:1
cell:BK55:f:1
cell:BL55:vtf:t:u:av5:f:1
cell:BM55:f:1
cell:BN55:f:1
cell:BO55:f:1
cell:BP55:f:1
cell:BQ55:f:1
cell:BR55:f:1
cell:BS55:f:1
cell:BT55:f:1
cell:BU55:f:1
cell:BV55:f:1
cell:BW55:f:1
cell:BX55:f:1
cell:BY55:f:1
cell:BZ55:f:1
cell:CA55:f:1
cell:CB55:f:1
cell:CC55:f:1
cell:E56:f:1
cell:F56:f:1
cell:G56:f:1
cell:H56:f:1
cell:I56:f:1
cell:J56:f:1
cell:K56:f:1
cell:L56:f:1
cell:M56:f:1
cell:N56:f:1
cell:O56:f:1
cell:P56:f:1
cell:Q56:f:1
cell:R56:f:1
cell:S56:f:1
cell:T56:f:1
cell:U56:f:1
cell:V56:f:1
cell:W56:f:1
cell:X56:f:1
cell:Y56:f:1
cell:Z56:f:1
cell:AA56:f:1
cell:AB56:f:1
cell:AC56:f:1
cell:AD56:f:1
cell:AE56:f:1
cell:AF56:f:1
cell:AG56:vtf:t:n:aw1:f:1
cell:AH56:f:1
cell:AI56:f:1
cell:AJ56:f:1
cell:AK56:f:1
cell:AL56:f:1
cell:AM56:f:1
cell:AN56:f:1
cell:AO56:f:1
cell:AP56:f:1
cell:AQ56:vtf:t:n:aw2:f:1
cell:AR56:f:1
cell:AS56:f:1
cell:AT56:f:1
cell:AU56:f:1
cell:AV56:f:1
cell:AW56:f:1
cell:AX56:f:1
cell:AY56:vtf:t:n:aw3:f:1
cell:AZ56:f:1
cell:BA56:f:1
cell:BB56:f:1
cell:BC56:f:1
cell:BD56:f:1
cell:BE56:f:1
cell:BF56:f:1
cell:BG56:vtf:t:a:aw4:f:1
cell:BH56:f:1
cell:BI56:f:1
cell:BJ56:f:1
cell:BK56:f:1
cell:BL56:vtf:t:t:aw5:f:1
cell:BM56:f:1
cell:BN56:f:1
cell:BO56:f:1
cell:BP56:f:1
cell:BQ56:f:1
cell:BR56:f:1
cell:BS56:f:1
cell:BT56:f:1
cell:BU56:f:1
cell:BV56:f:1
cell:BW56:f:1
cell:BX56:f:1
cell:BY56:f:1
cell:BZ56:f:1
cell:CA56:f:1
cell:CB56:f:1
cell:CC56:f:1
cell:E57:f:1
cell:F57:f:1
cell:G57:f:1
cell:H57:f:1
cell:I57:f:1
cell:J57:f:1
cell:K57:f:1
cell:L57:f:1
cell:M57:f:1
cell:N57:f:1
cell:O57:f:1
cell:P57:f:1
cell:Q57:f:1
cell:R57:f:1
cell:S57:f:1
cell:T57:f:1
cell:U57:f:1
cell:V57:f:1
cell:W57:f:1
cell:X57:f:1
cell:Y57:f:1
cell:Z57:f:1
cell:AA57:f:1
cell:AB57:f:1
cell:AC57:f:1
cell:AD57:f:1
cell:AE57:f:1
cell:AF57:f:1
cell:AG57:f:1
cell:AH57:vtf:t:t:ax1:f:1
cell:AI57:f:1
cell:AJ57:f:1
cell:AK57:f:1
cell:AL57:f:1
cell:AM57:f:1
cell:AN57:f:1
cell:AO57:f:1
cell:AP57:f:1
cell:AQ57:f:1
cell:AR57:vtf:t:t:ax2:f:1
cell:AS57:f:1
cell:AT57:f:1
cell:AU57:f:1
cell:AV57:f:1
cell:AW57:f:1
cell:AX57:f:1
cell:AY57:f:1
cell:AZ57:vtf:t: :ax3:f:1
cell:BA57:f:1
cell:BB57:f:1
cell:BC57:f:1
cell:BD57:f:1
cell:BE57:f:1
cell:BF57:f:1
cell:BG57:f:1
cell:BH57:vtf:t:i:ax4:f:1
cell:BI57:f:1
cell:BJ57:f:1
cell:BK57:f:1
cell:BL57:vtf:t: :ax5:f:1
cell:BM57:f:1
cell:BN57:f:1
cell:BO57:f:1
cell:BP57:f:1
cell:BQ57:f:1
cell:BR57:f:1
cell:BS57:f:1
cell:BT57:f:1
cell:BU57:f:1
cell:BV57:f:1
cell:BW57:f:1
cell:BX57:f:1
cell:BY57:f:1
cell:BZ57:f:1
cell:CA57:f:1
cell:CB57:f:1
cell:CC57:f:1
cell:E58:f:1
cell:F58:f:1
cell:G58:f:1
cell:H58:f:1
cell:I58:f:1
cell:J58:f:1
cell:K58:f:1
cell:L58:f:1
cell:M58:f:1
cell:N58:f:1
cell:O58:f:1
cell:P58:f:1
cell:Q58:f:1
cell:R58:f:1
cell:S58:f:1
cell:T58:f:1
cell:U58:f:1
cell:V58:f:1
cell:W58:f:1
cell:X58:f:1
cell:Y58:f:1
cell:Z58:f:1
cell:AA58:f:1
cell:AB58:f:1
cell:AC58:f:1
cell:AD58:f:1
cell:AE58:f:1
cell:AF58:f:1
cell:AG58:f:1
cell:AH58:vtf:t: :ay1:f:1
cell:AI58:f:1
cell:AJ58:f:1
cell:AK58:f:1
cell:AL58:f:1
cell:AM58:f:1
cell:AN58:f:1
cell:AO58:f:1
cell:AP58:f:1
cell:AQ58:f:1
cell:AR58:f:1
cell:AS58:vtf:t:r:ay2:f:1
cell:AT58:f:1
cell:AU58:f:1
cell:AV58:f:1
cell:AW58:f:1
cell:AX58:f:1
cell:AY58:f:1
cell:AZ58:vtf:t:u:ay3:f:1
cell:BA58:f:1
cell:BB58:f:1
cell:BC58:f:1
cell:BD58:f:1
cell:BE58:f:1
cell:BF58:f:1
cell:BG58:f:1
cell:BH58:vtf:t:n:ay4:f:1
cell:BI58:f:1
cell:BJ58:f:1
cell:BK58:f:1
cell:BL58:f:1
cell:BM58:vtf:t:e:ay5:f:1
cell:BN58:f:1
cell:BO58:f:1
cell:BP58:f:1
cell:BQ58:f:1
cell:BR58:f:1
cell:BS58:f:1
cell:BT58:f:1
cell:BU58:f:1
cell:BV58:f:1
cell:BW58:f:1
cell:BX58:f:1
cell:BY58:f:1
cell:BZ58:f:1
cell:CA58:f:1
cell:CB58:f:1
cell:CC58:f:1
cell:E59:f:1
cell:F59:f:1
cell:G59:f:1
cell:H59:f:1
cell:I59:f:1
cell:J59:f:1
cell:K59:f:1
cell:L59:f:1
cell:M59:f:1
cell:N59:f:1
cell:O59:f:1
cell:P59:f:1
cell:Q59:f:1
cell:R59:f:1
cell:S59:f:1
cell:T59:f:1
cell:U59:f:1
cell:V59:f:1
cell:W59:f:1
cell:X59:f:1
cell:Y59:f:1
cell:Z59:f:1
cell:AA59:f:1
cell:AB59:f:1
cell:AC59:f:1
cell:AD59:f:1
cell:AE59:f:1
cell:AF59:f:1
cell:AG59:f:1
cell:AH59:f:1
cell:AI59:vtf:t:m:az1:f:1
cell:AJ59:f:1
cell:AK59:f:1
cell:AL59:f:1
cell:AM59:f:1
cell:AN59:f:1
cell:AO59:f:1
cell:AP59:f:1
cell:AQ59:f:1
cell:AR59:f:1
cell:AS59:f:1
cell:AT59:vtf:t:e:az2:f:1
cell:AU59:f:1
cell:AV59:f:1
cell:AW59:f:1
cell:AX59:f:1
cell:AY59:f:1
cell:AZ59:f:1
cell:BA59:vtf:t:n:az3:f:1
cell:BB59:f:1
cell:BC59:f:1
cell:BD59:f:1
cell:BE59:f:1
cell:BF59:f:1
cell:BG59:f:1
cell:BH59:f:1
cell:BI59:vtf:t: :az4:f:1
cell:BJ59:f:1
cell:BK59:f:1
cell:BL59:f:1
cell:BM59:f:1
cell:BN59:vtf:t:t:az5:f:1
cell:BO59:f:1
cell:BP59:f:1
cell:BQ59:f:1
cell:BR59:f:1
cell:BS59:f:1
cell:BT59:f:1
cell:BU59:f:1
cell:BV59:f:1
cell:BW59:f:1
cell:BX59:f:1
cell:BY59:f:1
cell:BZ59:f:1
cell:CA59:f:1
cell:CB59:f:1
cell:CC59:f:1
cell:E60:f:1
cell:F60:f:1
cell:G60:f:1
cell:H60:f:1
cell:I60:f:1
cell:J60:f:1
cell:K60:f:1
cell:L60:f:1
cell:M60:f:1
cell:N60:f:1
cell:O60:f:1
cell:P60:f:1
cell:Q60:f:1
cell:R60:f:1
cell:S60:f:1
cell:T60:f:1
cell:U60:f:1
cell:V60:f:1
cell:W60:f:1
cell:X60:f:1
cell:Y60:f:1
cell:Z60:f:1
cell:AA60:f:1
cell:AB60:f:1
cell:AC60:f:1
cell:AD60:f:1
cell:AE60:f:1
cell:AF60:f:1
cell:AG60:f:1
cell:AH60:f:1
cell:AI60:f:1
cell:AJ60:vtf:t:o:ba1:f:1
cell:AK60:f:1
cell:AL60:f:1
cell:AM60:f:1
cell:AN60:f:1
cell:AO60:f:1
cell:AP60:f:1
cell:AQ60:f:1
cell:AR60:f:1
cell:AS60:f:1
cell:AT60:f:1
cell:AU60:vtf:t:s:ba2:f:1
cell:AV60:f:1
cell:AW60:f:1
cell:AX60:f:1
cell:AY60:f:1
cell:AZ60:f:1
cell:BA60:vtf:t:i:ba3:f:1
cell:BB60:f:1
cell:BC60:f:1
cell:BD60:f:1
cell:BE60:f:1
cell:BF60:f:1
cell:BG60:f:1
cell:BH60:f:1
cell:BI60:f:1
cell:BJ60:vtf:t:p:ba4:f:1
cell:BK60:f:1
cell:BL60:f:1
cell:BM60:f:1
cell:BN60:f:1
cell:BO60:vtf:t: :ba5:f:1
cell:BP60:f:1
cell:BQ60:f:1
cell:BR60:f:1
cell:BS60:f:1
cell:BT60:f:1
cell:BU60:f:1
cell:BV60:f:1
cell:BW60:f:1
cell:BX60:f:1
cell:BY60:f:1
cell:BZ60:f:1
cell:CA60:f:1
cell:CB60:f:1
cell:CC60:f:1
cell:E61:f:1
cell:F61:f:1
cell:G61:f:1
cell:H61:f:1
cell:I61:f:1
cell:J61:f:1
cell:K61:f:1
cell:L61:f:1
cell:M61:f:1
cell:N61:f:1
cell:O61:f:1
cell:P61:f:1
cell:Q61:f:1
cell:R61:f:1
cell:S61:f:1
cell:T61:f:1
cell:U61:f:1
cell:V61:f:1
cell:W61:f:1
cell:X61:f:1
cell:Y61:f:1
cell:Z61:f:1
cell:AA61:f:1
cell:AB61:f:1
cell:AC61:f:1
cell:AD61:f:1
cell:AE61:f:1
cell:AF61:f:1
cell:AG61:f:1
cell:AH61:f:1
cell:AI61:f:1
cell:AJ61:f:1
cell:AK61:vtf:t:r:bb1:f:1
cell:AL61:f:1
cell:AM61:f:1
cell:AN61:f:1
cell:AO61:f:1
cell:AP61:f:1
cell:AQ61:f:1
cell:AR61:f:1
cell:AS61:f:1
cell:AT61:f:1
cell:AU61:vtf:t: :bb2:f:1
cell:AV61:f:1
cell:AW61:f:1
cell:AX61:f:1
cell:AY61:f:1
cell:AZ61:f:1
cell:BA61:f:1
cell:BB61:vtf:t:v:bb3:f:1
cell:BC61:f:1
cell:BD61:f:1
cell:BE61:f:1
cell:BF61:f:1
cell:BG61:f:1
cell:BH61:f:1
cell:BI61:f:1
cell:BJ61:vtf:t:l:bb4:f:1
cell:BK61:f:1
cell:BL61:f:1
cell:BM61:f:1
cell:BN61:f:1
cell:BO61:vtf:t:e:bb5:f:1
cell:BP61:f:1
cell:BQ61:f:1
cell:BR61:f:1
cell:BS61:f:1
cell:BT61:f:1
cell:BU61:f:1
cell:BV61:f:1
cell:BW61:f:1
cell:BX61:f:1
cell:BY61:f:1
cell:BZ61:f:1
cell:CA61:f:1
cell:CB61:f:1
cell:CC61:f:1
cell:E62:f:1
cell:F62:f:1
cell:G62:f:1
cell:H62:f:1
cell:I62:f:1
cell:J62:f:1
cell:K62:f:1
cell:L62:f:1
cell:M62:f:1
cell:N62:f:1
cell:O62:f:1
cell:P62:f:1
cell:Q62:f:1
cell:R62:f:1
cell:S62:f:1
cell:T62:f:1
cell:U62:f:1
cell:V62:f:1
cell:W62:f:1
cell:X62:f:1
cell:Y62:f:1
cell:Z62:f:1
cell:AA62:f:1
cell:AB62:f:1
cell:AC62:f:1
cell:AD62:f:1
cell:AE62:f:1
cell:AF62:f:1
cell:AG62:f:1
cell:AH62:f:1
cell:AI62:f:1
cell:AJ62:f:1
cell:AK62:vtf:t:t:bc1:f:1
cell:AL62:f:1
cell:AM62:f:1
cell:AN62:f:1
cell:AO62:f:1
cell:AP62:f:1
cell:AQ62:f:1
cell:AR62:f:1
cell:AS62:f:1
cell:AT62:f:1
cell:AU62:f:1
cell:AV62:vtf:t:d:bc2:f:1
cell:AW62:f:1
cell:AX62:f:1
cell:AY62:f:1
cell:AZ62:f:1
cell:BA62:f:1
cell:BB62:f:1
cell:BC62:vtf:t:e:bc3:f:1
cell:BD62:f:1
cell:BE62:f:1
cell:BF62:f:1
cell:BG62:f:1
cell:BH62:f:1
cell:BI62:f:1
cell:BJ62:f:1
cell:BK62:vtf:t:e:bc4:f:1
cell:BL62:f:1
cell:BM62:f:1
cell:BN62:f:1
cell:BO62:f:1
cell:BP62:vtf:t:n:bc5:f:1
cell:BQ62:f:1
cell:BR62:f:1
cell:BS62:f:1
cell:BT62:f:1
cell:BU62:f:1
cell:BV62:f:1
cell:BW62:f:1
cell:BX62:f:1
cell:BY62:f:1
cell:BZ62:f:1
cell:CA62:f:1
cell:CB62:f:1
cell:CC62:f:1
cell:E63:f:1
cell:F63:f:1
cell:G63:f:1
cell:H63:f:1
cell:I63:f:1
cell:J63:f:1
cell:K63:f:1
cell:L63:f:1
cell:M63:f:1
cell:N63:f:1
cell:O63:f:1
cell:P63:f:1
cell:Q63:f:1
cell:R63:f:1
cell:S63:f:1
cell:T63:f:1
cell:U63:f:1
cell:V63:f:1
cell:W63:f:1
cell:X63:f:1
cell:Y63:f:1
cell:Z63:f:1
cell:AA63:f:1
cell:AB63:f:1
cell:AC63:f:1
cell:AD63:f:1
cell:AE63:f:1
cell:AF63:f:1
cell:AG63:f:1
cell:AH63:f:1
cell:AI63:f:1
cell:AJ63:f:1
cell:AK63:f:1
cell:AL63:vtf:t:e:bd1:f:1
cell:AM63:f:1
cell:AN63:f:1
cell:AO63:f:1
cell:AP63:f:1
cell:AQ63:f:1
cell:AR63:f:1
cell:AS63:f:1
cell:AT63:f:1
cell:AU63:f:1
cell:AV63:f:1
cell:AW63:vtf:t:e:bd2:f:1
cell:AX63:f:1
cell:AY63:f:1
cell:AZ63:f:1
cell:BA63:f:1
cell:BB63:f:1
cell:BC63:f:1
cell:BD63:vtf:t:r:bd3:f:1
cell:BE63:f:1
cell:BF63:f:1
cell:BG63:f:1
cell:BH63:f:1
cell:BI63:f:1
cell:BJ63:f:1
cell:BK63:f:1
cell:BL63:vtf:t:u:bd4:f:1
cell:BM63:f:1
cell:BN63:f:1
cell:BO63:f:1
cell:BP63:f:1
cell:BQ63:vtf:t: :bd5:f:1
cell:BR63:f:1
cell:BS63:f:1
cell:BT63:f:1
cell:BU63:f:1
cell:BV63:f:1
cell:BW63:f:1
cell:BX63:f:1
cell:BY63:f:1
cell:BZ63:f:1
cell:CA63:f:1
cell:CB63:f:1
cell:CC63:f:1
cell:E64:f:1
cell:F64:f:1
cell:G64:f:1
cell:H64:f:1
cell:I64:f:1
cell:J64:f:1
cell:K64:f:1
cell:L64:f:1
cell:M64:f:1
cell:N64:f:1
cell:O64:f:1
cell:P64:f:1
cell:Q64:f:1
cell:R64:f:1
cell:S64:f:1
cell:T64:f:1
cell:U64:f:1
cell:V64:f:1
cell:W64:f:1
cell:X64:f:1
cell:Y64:f:1
cell:Z64:f:1
cell:AA64:f:1
cell:AB64:f:1
cell:AC64:f:1
cell:AD64:f:1
cell:AE64:f:1
cell:AF64:f:1
cell:AG64:f:1
cell:AH64:f:1
cell:AI64:f:1
cell:AJ64:f:1
cell:AK64:f:1
cell:AL64:f:1
cell:AM64:vtf:t:s:be1:f:1
cell:AN64:f:1
cell:AO64:f:1
cell:AP64:f:1
cell:AQ64:f:1
cell:AR64:f:1
cell:AS64:f:1
cell:AT64:f:1
cell:AU64:f:1
cell:AV64:f:1
cell:AW64:f:1
cell:AX64:vtf:t: :be2:f:1
cell:AY64:f:1
cell:AZ64:f:1
cell:BA64:f:1
cell:BB64:f:1
cell:BC64:f:1
cell:BD64:f:1
cell:BE64:vtf:t:s:be3:f:1
cell:BF64:f:1
cell:BG64:f:1
cell:BH64:f:1
cell:BI64:f:1
cell:BJ64:f:1
cell:BK64:f:1
cell:BL64:f:1
cell:BM64:vtf:t:r:be4:f:1
cell:BN64:f:1
cell:BO64:f:1
cell:BP64:f:1
cell:BQ64:vtf:t:b:be5:f:1
cell:BR64:f:1
cell:BS64:f:1
cell:BT64:f:1
cell:BU64:f:1
cell:BV64:f:1
cell:BW64:f:1
cell:BX64:f:1
cell:BY64:f:1
cell:BZ64:f:1
cell:CA64:f:1
cell:CB64:f:1
cell:CC64:f:1
cell:E65:f:1
cell:F65:f:1
cell:G65:f:1
cell:H65:f:1
cell:I65:f:1
cell:J65:f:1
cell:K65:f:1
cell:L65:f:1
cell:M65:f:1
cell:N65:f:1
cell:O65:f:1
cell:P65:f:1
cell:Q65:f:1
cell:R65:f:1
cell:S65:f:1
cell:T65:f:1
cell:U65:f:1
cell:V65:f:1
cell:W65:f:1
cell:X65:f:1
cell:Y65:f:1
cell:Z65:f:1
cell:AA65:f:1
cell:AB65:f:1
cell:AC65:f:1
cell:AD65:f:1
cell:AE65:f:1
cell:AF65:f:1
cell:AG65:f:1
cell:AH65:f:1
cell:AI65:f:1
cell:AJ65:f:1
cell:AK65:f:1
cell:AL65:f:1
cell:AM65:vtf:t: :bf1:f:1
cell:AN65:f:1
cell:AO65:f:1
cell:AP65:f:1
cell:AQ65:f:1
cell:AR65:f:1
cell:AS65:f:1
cell:AT65:f:1
cell:AU65:f:1
cell:AV65:f:1
cell:AW65:f:1
cell:AX65:vtf:t:m:bf2:f:1
cell:AY65:f:1
cell:AZ65:f:1
cell:BA65:f:1
cell:BB65:f:1
cell:BC65:f:1
cell:BD65:f:1
cell:BE65:vtf:t: :bf3:f:1
cell:BF65:f:1
cell:BG65:f:1
cell:BH65:f:1
cell:BI65:f:1
cell:BJ65:f:1
cell:BK65:f:1
cell:BL65:f:1
cell:BM65:vtf:t:e:bf4:f:1
cell:BN65:f:1
cell:BO65:f:1
cell:BP65:f:1
cell:BQ65:f:1
cell:BR65:vtf:t:a:bf5:f:1
cell:BS65:f:1
cell:BT65:f:1
cell:BU65:f:1
cell:BV65:f:1
cell:BW65:f:1
cell:BX65:f:1
cell:BY65:f:1
cell:BZ65:f:1
cell:CA65:f:1
cell:CB65:f:1
cell:CC65:f:1
cell:E66:f:1
cell:F66:f:1
cell:G66:f:1
cell:H66:f:1
cell:I66:f:1
cell:J66:f:1
cell:K66:f:1
cell:L66:f:1
cell:M66:f:1
cell:N66:f:1
cell:O66:f:1
cell:P66:f:1
cell:Q66:f:1
cell:R66:f:1
cell:S66:f:1
cell:T66:f:1
cell:U66:f:1
cell:V66:f:1
cell:W66:f:1
cell:X66:f:1
cell:Y66:f:1
cell:Z66:f:1
cell:AA66:f:1
cell:AB66:f:1
cell:AC66:f:1
cell:AD66:f:1
cell:AE66:f:1
cell:AF66:f:1
cell:AG66:f:1
cell:AH66:f:1
cell:AI66:f:1
cell:AJ66:f:1
cell:AK66:f:1
cell:AL66:f:1
cell:AM66:f:1
cell:AN66:vtf:t:m:bg1:f:1
cell:AO66:f:1
cell:AP66:f:1
cell:AQ66:f:1
cell:AR66:f:1
cell:AS66:f:1
cell:AT66:f:1
cell:AU66:f:1
cell:AV66:f:1
cell:AW66:f:1
cell:AX66:f:1
cell:AY66:vtf:t:a:bg2:f:1
cell:AZ66:f:1
cell:BA66:f:1
cell:BB66:f:1
cell:BC66:f:1
cell:BD66:f:1
cell:BE66:f:1
cell:BF66:vtf:t:d:bg3:f:1
cell:BG66:f:1
cell:BH66:f:1
cell:BI66:f:1
cell:BJ66:f:1
cell:BK66:f:1
cell:BL66:f:1
cell:BM66:f:1
cell:BN66:vtf:t:n:bg4:f:1
cell:BO66:f:1
cell:BP66:f:1
cell:BQ66:f:1
cell:BR66:f:1
cell:BS66:vtf:t:s:bg5:f:1
cell:BT66:f:1
cell:BU66:f:1
cell:BV66:f:1
cell:BW66:f:1
cell:BX66:f:1
cell:BY66:f:1
cell:BZ66:f:1
cell:CA66:f:1
cell:CB66:f:1
cell:CC66:f:1
cell:E67:f:1
cell:F67:f:1
cell:G67:f:1
cell:H67:f:1
cell:I67:f:1
cell:J67:f:1
cell:K67:f:1
cell:L67:f:1
cell:M67:f:1
cell:N67:f:1
cell:O67:f:1
cell:P67:f:1
cell:Q67:f:1
cell:R67:f:1
cell:S67:f:1
cell:T67:f:1
cell:U67:f:1
cell:V67:f:1
cell:W67:f:1
cell:X67:f:1
cell:Y67:f:1
cell:Z67:f:1
cell:AA67:f:1
cell:AB67:f:1
cell:AC67:f:1
cell:AD67:f:1
cell:AE67:f:1
cell:AF67:f:1
cell:AG67:f:1
cell:AH67:f:1
cell:AI67:f:1
cell:AJ67:f:1
cell:AK67:f:1
cell:AL67:f:1
cell:AM67:f:1
cell:AN67:vtf:t:ê:bh1:f:1
cell:AO67:f:1
cell:AP67:f:1
cell:AQ67:f:1
cell:AR67:f:1
cell:AS67:f:1
cell:AT67:f:1
cell:AU67:f:1
cell:AV67:f:1
cell:AW67:f:1
cell:AX67:f:1
cell:AY67:f:1
cell:AZ67:vtf:t: :bh2:f:1
cell:BA67:f:1
cell:BB67:f:1
cell:BC67:f:1
cell:BD67:f:1
cell:BE67:f:1
cell:BF67:f:1
cell:BG67:vtf:t:e:bh3:f:1
cell:BH67:f:1
cell:BI67:f:1
cell:BJ67:f:1
cell:BK67:f:1
cell:BL67:f:1
cell:BM67:f:1
cell:BN67:f:1
cell:BO67:vtf:t:t:bh4:f:1
cell:BP67:f:1
cell:BQ67:f:1
cell:BR67:f:1
cell:BS67:f:1
cell:BT67:f:1
cell:BU67:f:1
cell:BV67:f:1
cell:BW67:f:1
cell:BX67:f:1
cell:BY67:f:1
cell:BZ67:f:1
cell:CA67:f:1
cell:CB67:f:1
cell:CC67:f:1
cell:E68:f:1
cell:F68:f:1
cell:G68:f:1
cell:H68:f:1
cell:I68:f:1
cell:J68:f:1
cell:K68:f:1
cell:L68:f:1
cell:M68:f:1
cell:N68:f:1
cell:O68:f:1
cell:P68:f:1
cell:Q68:f:1
cell:R68:f:1
cell:S68:f:1
cell:T68:f:1
cell:U68:f:1
cell:V68:f:1
cell:W68:f:1
cell:X68:f:1
cell:Y68:f:1
cell:Z68:f:1
cell:AA68:f:1
cell:AB68:f:1
cell:AC68:f:1
cell:AD68:f:1
cell:AE68:f:1
cell:AF68:f:1
cell:AG68:f:1
cell:AH68:f:1
cell:AI68:f:1
cell:AJ68:f:1
cell:AK68:f:1
cell:AL68:f:1
cell:AM68:f:1
cell:AN68:f:1
cell:AO68:vtf:t:m:bi1:f:1
cell:AP68:f:1
cell:AQ68:f:1
cell:AR68:f:1
cell:AS68:f:1
cell:AT68:f:1
cell:AU68:f:1
cell:AV68:f:1
cell:AW68:f:1
cell:AX68:f:1
cell:AY68:f:1
cell:AZ68:f:1
cell:BA68:vtf:t:v:bi2:f:1
cell:BB68:f:1
cell:BC68:f:1
cell:BD68:f:1
cell:BE68:f:1
cell:BF68:f:1
cell:BG68:f:1
cell:BH68:vtf:t: :bi3:f:1
cell:BI68:f:1
cell:BJ68:f:1
cell:BK68:f:1
cell:BL68:f:1
cell:BM68:f:1
cell:BN68:f:1
cell:BO68:vtf:t: :bi4:f:1
cell:BP68:f:1
cell:BQ68:f:1
cell:BR68:f:1
cell:BS68:f:1
cell:BT68:f:1
cell:BU68:f:1
cell:BV68:f:1
cell:BW68:f:1
cell:BX68:f:1
cell:BY68:f:1
cell:BZ68:f:1
cell:CA68:f:1
cell:CB68:f:1
cell:CC68:f:1
cell:E69:f:1
cell:F69:f:1
cell:G69:f:1
cell:H69:f:1
cell:I69:f:1
cell:J69:f:1
cell:K69:f:1
cell:L69:f:1
cell:M69:f:1
cell:N69:f:1
cell:O69:f:1
cell:P69:f:1
cell:Q69:f:1
cell:R69:f:1
cell:S69:f:1
cell:T69:f:1
cell:U69:f:1
cell:V69:f:1
cell:W69:f:1
cell:X69:f:1
cell:Y69:f:1
cell:Z69:f:1
cell:AA69:f:1
cell:AB69:f:1
cell:AC69:f:1
cell:AD69:f:1
cell:AE69:f:1
cell:AF69:f:1
cell:AG69:f:1
cell:AH69:f:1
cell:AI69:f:1
cell:AJ69:f:1
cell:AK69:f:1
cell:AL69:f:1
cell:AM69:f:1
cell:AN69:f:1
cell:AO69:vtf:t:e:bj1:f:1
cell:AP69:f:1
cell:AQ69:f:1
cell:AR69:f:1
cell:AS69:f:1
cell:AT69:f:1
cell:AU69:f:1
cell:AV69:f:1
cell:AW69:f:1
cell:AX69:f:1
cell:AY69:f:1
cell:AZ69:f:1
cell:BA69:f:1
cell:BB69:vtf:t:i:bj2:f:1
cell:BC69:f:1
cell:BD69:f:1
cell:BE69:f:1
cell:BF69:f:1
cell:BG69:f:1
cell:BH69:vtf:t:v:bj3:f:1
cell:BI69:f:1
cell:BJ69:f:1
cell:BK69:f:1
cell:BL69:f:1
cell:BM69:f:1
cell:BN69:f:1
cell:BO69:f:1
cell:BP69:vtf:t:u:bj4:f:1
cell:BQ69:f:1
cell:BR69:f:1
cell:BS69:f:1
cell:BT69:f:1
cell:BU69:f:1
cell:BV69:f:1
cell:BW69:f:1
cell:BX69:f:1
cell:BY69:f:1
cell:BZ69:f:1
cell:CA69:f:1
cell:CB69:f:1
cell:CC69:f:1
cell:E70:f:1
cell:F70:f:1
cell:G70:f:1
cell:H70:f:1
cell:I70:f:1
cell:J70:f:1
cell:K70:f:1
cell:L70:f:1
cell:M70:f:1
cell:N70:f:1
cell:O70:f:1
cell:P70:f:1
cell:Q70:f:1
cell:R70:f:1
cell:S70:f:1
cell:T70:f:1
cell:U70:f:1
cell:V70:f:1
cell:W70:f:1
cell:X70:f:1
cell:Y70:f:1
cell:Z70:f:1
cell:AA70:f:1
cell:AB70:f:1
cell:AC70:f:1
cell:AD70:f:1
cell:AE70:f:1
cell:AF70:f:1
cell:AG70:f:1
cell:AH70:f:1
cell:AI70:f:1
cell:AJ70:f:1
cell:AK70:f:1
cell:AL70:f:1
cell:AM70:f:1
cell:AN70:f:1
cell:AO70:f:1
cell:AP70:vtf:t: :bk1:f:1
cell:AQ70:f:1
cell:AR70:f:1
cell:AS70:f:1
cell:AT70:f:1
cell:AU70:f:1
cell:AV70:f:1
cell:AW70:f:1
cell:AX70:f:1
cell:AY70:f:1
cell:AZ70:f:1
cell:BA70:f:1
cell:BB70:vtf:t:e:bk2:f:1
cell:BC70:f:1
cell:BD70:f:1
cell:BE70:f:1
cell:BF70:f:1
cell:BG70:f:1
cell:BH70:f:1
cell:BI70:vtf:t:i:bk3:f:1
cell:BJ70:f:1
cell:BK70:f:1
cell:BL70:f:1
cell:BM70:f:1
cell:BN70:f:1
cell:BO70:f:1
cell:BP70:f:1
cell:BQ70:vtf:t:n:bk4:f:1
cell:BR70:f:1
cell:BS70:f:1
cell:BT70:f:1
cell:BU70:f:1
cell:BV70:f:1
cell:BW70:f:1
cell:BX70:f:1
cell:BY70:f:1
cell:BZ70:f:1
cell:CA70:f:1
cell:CB70:f:1
cell:CC70:f:1
cell:E71:f:1
cell:F71:f:1
cell:G71:f:1
cell:H71:f:1
cell:I71:f:1
cell:J71:f:1
cell:K71:f:1
cell:L71:f:1
cell:M71:f:1
cell:N71:f:1
cell:O71:f:1
cell:P71:f:1
cell:Q71:f:1
cell:R71:f:1
cell:S71:f:1
cell:T71:f:1
cell:U71:f:1
cell:V71:f:1
cell:W71:f:1
cell:X71:f:1
cell:Y71:f:1
cell:Z71:f:1
cell:AA71:f:1
cell:AB71:f:1
cell:AC71:f:1
cell:AD71:f:1
cell:AE71:f:1
cell:AF71:f:1
cell:AG71:f:1
cell:AH71:f:1
cell:AI71:f:1
cell:AJ71:f:1
cell:AK71:f:1
cell:AL71:f:1
cell:AM71:f:1
cell:AN71:f:1
cell:AO71:f:1
cell:AP71:vtf:t:d:bl1:f:1
cell:AQ71:f:1
cell:AR71:f:1
cell:AS71:f:1
cell:AT71:f:1
cell:AU71:f:1
cell:AV71:f:1
cell:AW71:f:1
cell:AX71:f:1
cell:AY71:f:1
cell:AZ71:f:1
cell:BA71:f:1
cell:BB71:f:1
cell:BC71:vtf:t: :bl2:f:1
cell:BD71:f:1
cell:BE71:f:1
cell:BF71:f:1
cell:BG71:f:1
cell:BH71:f:1
cell:BI71:f:1
cell:BJ71:vtf:t:l:bl3:f:1
cell:BK71:f:1
cell:BL71:f:1
cell:BM71:f:1
cell:BN71:f:1
cell:BO71:f:1
cell:BP71:f:1
cell:BQ71:vtf:t:e:bl4:f:1
cell:BR71:f:1
cell:BS71:f:1
cell:BT71:f:1
cell:BU71:f:1
cell:BV71:f:1
cell:BW71:f:1
cell:BX71:f:1
cell:BY71:f:1
cell:BZ71:f:1
cell:CA71:f:1
cell:CB71:f:1
cell:CC71:f:1
cell:E72:f:1
cell:F72:f:1
cell:G72:f:1
cell:H72:f:1
cell:I72:f:1
cell:J72:f:1
cell:K72:f:1
cell:L72:f:1
cell:M72:f:1
cell:N72:f:1
cell:O72:f:1
cell:P72:f:1
cell:Q72:f:1
cell:R72:f:1
cell:S72:f:1
cell:T72:f:1
cell:U72:f:1
cell:V72:f:1
cell:W72:f:1
cell:X72:f:1
cell:Y72:f:1
cell:Z72:f:1
cell:AA72:f:1
cell:AB72:f:1
cell:AC72:f:1
cell:AD72:f:1
cell:AE72:f:1
cell:AF72:f:1
cell:AG72:f:1
cell:AH72:f:1
cell:AI72:f:1
cell:AJ72:f:1
cell:AK72:f:1
cell:AL72:f:1
cell:AM72:f:1
cell:AN72:f:1
cell:AO72:f:1
cell:AP72:f:1
cell:AQ72:vtf:t:a:bm1:f:1
cell:AR72:f:1
cell:AS72:f:1
cell:AT72:f:1
cell:AU72:f:1
cell:AV72:f:1
cell:AW72:f:1
cell:AX72:f:1
cell:AY72:f:1
cell:AZ72:f:1
cell:BA72:f:1
cell:BB72:f:1
cell:BC72:vtf:t:ô:bm2:f:1
cell:BD72:f:1
cell:BE72:f:1
cell:BF72:f:1
cell:BG72:f:1
cell:BH72:f:1
cell:BI72:f:1
cell:BJ72:f:1
cell:BK72:vtf:t:l:bm3:f:1
cell:BL72:f:1
cell:BM72:f:1
cell:BN72:f:1
cell:BO72:f:1
cell:BP72:f:1
cell:BQ72:f:1
cell:BR72:vtf:t: :bm4:f:1
cell:BS72:f:1
cell:BT72:f:1
cell:BU72:f:1
cell:BV72:f:1
cell:BW72:f:1
cell:BX72:f:1
cell:BY72:f:1
cell:BZ72:f:1
cell:CA72:f:1
cell:CB72:f:1
cell:CC72:f:1
cell:E73:f:1
cell:F73:f:1
cell:G73:f:1
cell:H73:f:1
cell:I73:f:1
cell:J73:f:1
cell:K73:f:1
cell:L73:f:1
cell:M73:f:1
cell:N73:f:1
cell:O73:f:1
cell:P73:f:1
cell:Q73:f:1
cell:R73:f:1
cell:S73:f:1
cell:T73:f:1
cell:U73:f:1
cell:V73:f:1
cell:W73:f:1
cell:X73:f:1
cell:Y73:f:1
cell:Z73:f:1
cell:AA73:f:1
cell:AB73:f:1
cell:AC73:f:1
cell:AD73:f:1
cell:AE73:f:1
cell:AF73:f:1
cell:AG73:f:1
cell:AH73:f:1
cell:AI73:f:1
cell:AJ73:f:1
cell:AK73:f:1
cell:AL73:f:1
cell:AM73:f:1
cell:AN73:f:1
cell:AO73:f:1
cell:AP73:f:1
cell:AQ73:vtf:t:n:bn1:f:1
cell:AR73:f:1
cell:AS73:f:1
cell:AT73:f:1
cell:AU73:f:1
cell:AV73:f:1
cell:AW73:f:1
cell:AX73:f:1
cell:AY73:f:1
cell:AZ73:f:1
cell:BA73:f:1
cell:BB73:f:1
cell:BC73:vtf:t: :bn2:f:1
cell:BD73:f:1
cell:BE73:f:1
cell:BF73:f:1
cell:BG73:f:1
cell:BH73:f:1
cell:BI73:f:1
cell:BJ73:f:1
cell:BK73:vtf:t:e:bn3:f:1
cell:BL73:f:1
cell:BM73:f:1
cell:BN73:f:1
cell:BO73:f:1
cell:BP73:f:1
cell:BQ73:f:1
cell:BR73:f:1
cell:BS73:vtf:t:a:bn4:f:1
cell:BT73:f:1
cell:BU73:f:1
cell:BV73:f:1
cell:BW73:f:1
cell:BX73:f:1
cell:BY73:f:1
cell:BZ73:f:1
cell:CA73:f:1
cell:CB73:f:1
cell:CC73:f:1
cell:E74:f:1
cell:F74:f:1
cell:G74:f:1
cell:H74:f:1
cell:I74:f:1
cell:J74:f:1
cell:K74:f:1
cell:L74:f:1
cell:M74:f:1
cell:N74:f:1
cell:O74:f:1
cell:P74:f:1
cell:Q74:f:1
cell:R74:f:1
cell:S74:f:1
cell:T74:f:1
cell:U74:f:1
cell:V74:f:1
cell:W74:f:1
cell:X74:f:1
cell:Y74:f:1
cell:Z74:f:1
cell:AA74:f:1
cell:AB74:f:1
cell:AC74:f:1
cell:AD74:f:1
cell:AE74:f:1
cell:AF74:f:1
cell:AG74:f:1
cell:AH74:f:1
cell:AI74:f:1
cell:AJ74:f:1
cell:AK74:f:1
cell:AL74:f:1
cell:AM74:f:1
cell:AN74:f:1
cell:AO74:f:1
cell:AP74:f:1
cell:AQ74:f:1
cell:AR74:vtf:t:s:bo1:f:1
cell:AS74:f:1
cell:AT74:f:1
cell:AU74:f:1
cell:AV74:f:1
cell:AW74:f:1
cell:AX74:f:1
cell:AY74:f:1
cell:AZ74:f:1
cell:BA74:f:1
cell:BB74:f:1
cell:BC74:vtf:t:g:bo2:f:1
cell:BD74:f:1
cell:BE74:f:1
cell:BF74:f:1
cell:BG74:f:1
cell:BH74:f:1
cell:BI74:f:1
cell:BJ74:f:1
cell:BK74:f:1
cell:BL74:vtf:t:s:bo3:f:1
cell:BM74:f:1
cell:BN74:f:1
cell:BO74:f:1
cell:BP74:f:1
cell:BQ74:f:1
cell:BR74:f:1
cell:BS74:f:1
cell:BT74:vtf:t:n:bo4:f:1
cell:BU74:f:1
cell:BV74:f:1
cell:BW74:f:1
cell:BX74:f:1
cell:BY74:f:1
cell:BZ74:f:1
cell:CA74:f:1
cell:CB74:f:1
cell:CC74:f:1
cell:E75:f:1
cell:F75:f:1
cell:G75:f:1
cell:H75:f:1
cell:I75:f:1
cell:J75:f:1
cell:K75:f:1
cell:L75:f:1
cell:M75:f:1
cell:N75:f:1
cell:O75:f:1
cell:P75:f:1
cell:Q75:f:1
cell:R75:f:1
cell:S75:f:1
cell:T75:f:1
cell:U75:f:1
cell:V75:f:1
cell:W75:f:1
cell:X75:f:1
cell:Y75:f:1
cell:Z75:f:1
cell:AA75:f:1
cell:AB75:f:1
cell:AC75:f:1
cell:AD75:f:1
cell:AE75:f:1
cell:AF75:f:1
cell:AG75:f:1
cell:AH75:f:1
cell:AI75:f:1
cell:AJ75:f:1
cell:AK75:f:1
cell:AL75:f:1
cell:AM75:f:1
cell:AN75:f:1
cell:AO75:f:1
cell:AP75:f:1
cell:AQ75:f:1
cell:AR75:vtf:t: :bp1:f:1
cell:AS75:f:1
cell:AT75:f:1
cell:AU75:f:1
cell:AV75:f:1
cell:AW75:f:1
cell:AX75:f:1
cell:AY75:f:1
cell:AZ75:f:1
cell:BA75:f:1
cell:BB75:f:1
cell:BC75:f:1
cell:BD75:vtf:t:o:bp2:f:1
cell:BE75:f:1
cell:BF75:f:1
cell:BG75:f:1
cell:BH75:f:1
cell:BI75:f:1
cell:BJ75:f:1
cell:BK75:f:1
cell:BL75:f:1
cell:BM75:vtf:t: :bp3:f:1
cell:BN75:f:1
cell:BO75:f:1
cell:BP75:f:1
cell:BQ75:f:1
cell:BR75:f:1
cell:BS75:f:1
cell:BT75:vtf:t:c:bp4:f:1
cell:BU75:f:1
cell:BV75:f:1
cell:BW75:f:1
cell:BX75:f:1
cell:BY75:f:1
cell:BZ75:f:1
cell:CA75:f:1
cell:CB75:f:1
cell:CC75:f:1
cell:E76:f:1
cell:F76:f:1
cell:G76:f:1
cell:H76:f:1
cell:I76:f:1
cell:J76:f:1
cell:K76:f:1
cell:L76:f:1
cell:M76:f:1
cell:N76:f:1
cell:O76:f:1
cell:P76:f:1
cell:Q76:f:1
cell:R76:f:1
cell:S76:f:1
cell:T76:f:1
cell:U76:f:1
cell:V76:f:1
cell:W76:f:1
cell:X76:f:1
cell:Y76:f:1
cell:Z76:f:1
cell:AA76:f:1
cell:AB76:f:1
cell:AC76:f:1
cell:AD76:f:1
cell:AE76:f:1
cell:AF76:f:1
cell:AG76:f:1
cell:AH76:f:1
cell:AI76:f:1
cell:AJ76:f:1
cell:AK76:f:1
cell:AL76:f:1
cell:AM76:f:1
cell:AN76:f:1
cell:AO76:f:1
cell:AP76:f:1
cell:AQ76:f:1
cell:AR76:f:1
cell:AS76:vtf:t:l:bq1:f:1
cell:AT76:f:1
cell:AU76:f:1
cell:AV76:f:1
cell:AW76:f:1
cell:AX76:f:1
cell:AY76:f:1
cell:AZ76:f:1
cell:BA76:f:1
cell:BB76:f:1
cell:BC76:f:1
cell:BD76:f:1
cell:BE76:vtf:t:u:bq2:f:1
cell:BF76:f:1
cell:BG76:f:1
cell:BH76:f:1
cell:BI76:f:1
cell:BJ76:f:1
cell:BK76:f:1
cell:BL76:f:1
cell:BM76:f:1
cell:BN76:vtf:t:a:bq3:f:1
cell:BO76:f:1
cell:BP76:f:1
cell:BQ76:f:1
cell:BR76:f:1
cell:BS76:f:1
cell:BT76:f:1
cell:BU76:vtf:t:i:bq4:f:1
cell:BV76:f:1
cell:BW76:f:1
cell:BX76:f:1
cell:BY76:f:1
cell:BZ76:f:1
cell:CA76:f:1
cell:CB76:f:1
cell:CC76:f:1
cell:E77:f:1
cell:F77:f:1
cell:G77:f:1
cell:H77:f:1
cell:I77:f:1
cell:J77:f:1
cell:K77:f:1
cell:L77:f:1
cell:M77:f:1
cell:N77:f:1
cell:O77:f:1
cell:P77:f:1
cell:Q77:f:1
cell:R77:f:1
cell:S77:f:1
cell:T77:f:1
cell:U77:f:1
cell:V77:f:1
cell:W77:f:1
cell:X77:f:1
cell:Y77:f:1
cell:Z77:f:1
cell:AA77:f:1
cell:AB77:f:1
cell:AC77:f:1
cell:AD77:f:1
cell:AE77:f:1
cell:AF77:f:1
cell:AG77:f:1
cell:AH77:f:1
cell:AI77:f:1
cell:AJ77:f:1
cell:AK77:f:1
cell:AL77:f:1
cell:AM77:f:1
cell:AN77:f:1
cell:AO77:f:1
cell:AP77:f:1
cell:AQ77:f:1
cell:AR77:f:1
cell:AS77:vtf:t:e:br1:f:1
cell:AT77:f:1
cell:AU77:f:1
cell:AV77:f:1
cell:AW77:f:1
cell:AX77:f:1
cell:AY77:f:1
cell:AZ77:f:1
cell:BA77:f:1
cell:BB77:f:1
cell:BC77:f:1
cell:BD77:f:1
cell:BE77:f:1
cell:BF77:vtf:t:t:br2:f:1
cell:BG77:f:1
cell:BH77:f:1
cell:BI77:f:1
cell:BJ77:f:1
cell:BK77:f:1
cell:BL77:f:1
cell:BM77:f:1
cell:BN77:vtf:t:u:br3:f:1
cell:BO77:f:1
cell:BP77:f:1
cell:BQ77:f:1
cell:BR77:f:1
cell:BS77:f:1
cell:BT77:f:1
cell:BU77:f:1
cell:BV77:vtf:t:e:br4:f:1
cell:BW77:f:1
cell:BX77:f:1
cell:BY77:f:1
cell:BZ77:f:1
cell:CA77:f:1
cell:CB77:f:1
cell:CC77:f:1
cell:E78:f:1
cell:F78:f:1
cell:G78:f:1
cell:H78:f:1
cell:I78:f:1
cell:J78:f:1
cell:K78:f:1
cell:L78:f:1
cell:M78:f:1
cell:N78:f:1
cell:O78:f:1
cell:P78:f:1
cell:Q78:f:1
cell:R78:f:1
cell:S78:f:1
cell:T78:f:1
cell:U78:f:1
cell:V78:f:1
cell:W78:f:1
cell:X78:f:1
cell:Y78:f:1
cell:Z78:f:1
cell:AA78:f:1
cell:AB78:f:1
cell:AC78:f:1
cell:AD78:f:1
cell:AE78:f:1
cell:AF78:f:1
cell:AG78:f:1
cell:AH78:f:1
cell:AI78:f:1
cell:AJ78:f:1
cell:AK78:f:1
cell:AL78:f:1
cell:AM78:f:1
cell:AN78:f:1
cell:AO78:f:1
cell:AP78:f:1
cell:AQ78:f:1
cell:AR78:f:1
cell:AS78:f:1
cell:AT78:vtf:t: :bs1:f:1
cell:AU78:f:1
cell:AV78:f:1
cell:AW78:f:1
cell:AX78:f:1
cell:AY78:f:1
cell:AZ78:f:1
cell:BA78:f:1
cell:BB78:f:1
cell:BC78:f:1
cell:BD78:f:1
cell:BE78:f:1
cell:BF78:f:1
cell:BG78:vtf:t:t:bs2:f:1
cell:BH78:f:1
cell:BI78:f:1
cell:BJ78:f:1
cell:BK78:f:1
cell:BL78:f:1
cell:BM78:f:1
cell:BN78:f:1
cell:BO78:vtf:t:r:bs3:f:1
cell:BP78:f:1
cell:BQ78:f:1
cell:BR78:f:1
cell:BS78:f:1
cell:BT78:f:1
cell:BU78:f:1
cell:BV78:vtf:t:n:bs4:f:1
cell:BW78:f:1
cell:BX78:f:1
cell:BY78:f:1
cell:BZ78:f:1
cell:CA78:f:1
cell:CB78:f:1
cell:CC78:f:1
cell:E79:f:1
cell:F79:f:1
cell:G79:f:1
cell:H79:f:1
cell:I79:f:1
cell:J79:f:1
cell:K79:f:1
cell:L79:f:1
cell:M79:f:1
cell:N79:f:1
cell:O79:f:1
cell:P79:f:1
cell:Q79:f:1
cell:R79:f:1
cell:S79:f:1
cell:T79:f:1
cell:U79:f:1
cell:V79:f:1
cell:W79:f:1
cell:X79:f:1
cell:Y79:f:1
cell:Z79:f:1
cell:AA79:f:1
cell:AB79:f:1
cell:AC79:f:1
cell:AD79:f:1
cell:AE79:f:1
cell:AF79:f:1
cell:AG79:f:1
cell:AH79:f:1
cell:AI79:f:1
cell:AJ79:f:1
cell:AK79:f:1
cell:AL79:f:1
cell:AM79:f:1
cell:AN79:f:1
cell:AO79:f:1
cell:AP79:f:1
cell:AQ79:f:1
cell:AR79:f:1
cell:AS79:f:1
cell:AT79:vtf:t:s:bt1:f:1
cell:AU79:f:1
cell:AV79:f:1
cell:AW79:f:1
cell:AX79:f:1
cell:AY79:f:1
cell:AZ79:f:1
cell:BA79:f:1
cell:BB79:f:1
cell:BC79:f:1
cell:BD79:f:1
cell:BE79:f:1
cell:BF79:f:1
cell:BG79:vtf:t:e:bt2:f:1
cell:BH79:f:1
cell:BI79:f:1
cell:BJ79:f:1
cell:BK79:f:1
cell:BL79:f:1
cell:BM79:f:1
cell:BN79:f:1
cell:BO79:vtf:t:i:bt3:f:1
cell:BP79:f:1
cell:BQ79:f:1
cell:BR79:f:1
cell:BS79:f:1
cell:BT79:f:1
cell:BU79:f:1
cell:BV79:vtf:t:n:bt4:f:1
cell:BW79:f:1
cell:BX79:f:1
cell:BY79:f:1
cell:BZ79:f:1
cell:CA79:f:1
cell:CB79:f:1
cell:CC79:f:1
cell:E80:f:1
cell:F80:f:1
cell:G80:f:1
cell:H80:f:1
cell:I80:f:1
cell:J80:f:1
cell:K80:f:1
cell:L80:f:1
cell:M80:f:1
cell:N80:f:1
cell:O80:f:1
cell:P80:f:1
cell:Q80:f:1
cell:R80:f:1
cell:S80:f:1
cell:T80:f:1
cell:U80:f:1
cell:V80:f:1
cell:W80:f:1
cell:X80:f:1
cell:Y80:f:1
cell:Z80:f:1
cell:AA80:f:1
cell:AB80:f:1
cell:AC80:f:1
cell:AD80:f:1
cell:AE80:f:1
cell:AF80:f:1
cell:AG80:f:1
cell:AH80:f:1
cell:AI80:f:1
cell:AJ80:f:1
cell:AK80:f:1
cell:AL80:f:1
cell:AM80:f:1
cell:AN80:f:1
cell:AO80:f:1
cell:AP80:f:1
cell:AQ80:f:1
cell:AR80:f:1
cell:AS80:f:1
cell:AT80:f:1
cell:AU80:vtf:t:o:bu1:f:1
cell:AV80:f:1
cell:AW80:f:1
cell:AX80:f:1
cell:AY80:f:1
cell:AZ80:f:1
cell:BA80:f:1
cell:BB80:f:1
cell:BC80:f:1
cell:BD80:f:1
cell:BE80:f:1
cell:BF80:f:1
cell:BG80:f:1
cell:BH80:vtf:t:l:bu2:f:1
cell:BI80:f:1
cell:BJ80:f:1
cell:BK80:f:1
cell:BL80:f:1
cell:BM80:f:1
cell:BN80:f:1
cell:BO80:f:1
cell:BP80:vtf:t:c:bu3:f:1
cell:BQ80:f:1
cell:BR80:f:1
cell:BS80:f:1
cell:BT80:f:1
cell:BU80:f:1
cell:BV80:f:1
cell:BW80:vtf:t:e:bu4:f:1
cell:BX80:f:1
cell:BY80:f:1
cell:BZ80:f:1
cell:CA80:f:1
cell:CB80:f:1
cell:CC80:f:1
cell:E81:f:1
cell:F81:f:1
cell:G81:f:1
cell:H81:f:1
cell:I81:f:1
cell:J81:f:1
cell:K81:f:1
cell:L81:f:1
cell:M81:f:1
cell:N81:f:1
cell:O81:f:1
cell:P81:f:1
cell:Q81:f:1
cell:R81:f:1
cell:S81:f:1
cell:T81:f:1
cell:U81:f:1
cell:V81:f:1
cell:W81:f:1
cell:X81:f:1
cell:Y81:f:1
cell:Z81:f:1
cell:AA81:f:1
cell:AB81:f:1
cell:AC81:f:1
cell:AD81:f:1
cell:AE81:f:1
cell:AF81:f:1
cell:AG81:f:1
cell:AH81:f:1
cell:AI81:f:1
cell:AJ81:f:1
cell:AK81:f:1
cell:AL81:f:1
cell:AM81:f:1
cell:AN81:f:1
cell:AO81:f:1
cell:AP81:f:1
cell:AQ81:f:1
cell:AR81:f:1
cell:AS81:f:1
cell:AT81:f:1
cell:AU81:vtf:t:u:bv1:f:1
cell:AV81:f:1
cell:AW81:f:1
cell:AX81:f:1
cell:AY81:f:1
cell:AZ81:f:1
cell:BA81:f:1
cell:BB81:f:1
cell:BC81:f:1
cell:BD81:f:1
cell:BE81:f:1
cell:BF81:f:1
cell:BG81:f:1
cell:BH81:vtf:t:e:bv2:f:1
cell:BI81:f:1
cell:BJ81:f:1
cell:BK81:f:1
cell:BL81:f:1
cell:BM81:f:1
cell:BN81:f:1
cell:BO81:f:1
cell:BP81:f:1
cell:BQ81:vtf:t:u:bv3:f:1
cell:BR81:f:1
cell:BS81:f:1
cell:BT81:f:1
cell:BU81:f:1
cell:BV81:f:1
cell:BW81:f:1
cell:BX81:vtf:t: :bv4:f:1
cell:BY81:f:1
cell:BZ81:f:1
cell:CA81:f:1
cell:CB81:f:1
cell:CC81:f:1
cell:E82:f:1
cell:F82:f:1
cell:G82:f:1
cell:H82:f:1
cell:I82:f:1
cell:J82:f:1
cell:K82:f:1
cell:L82:f:1
cell:M82:f:1
cell:N82:f:1
cell:O82:f:1
cell:P82:f:1
cell:Q82:f:1
cell:R82:f:1
cell:S82:f:1
cell:T82:f:1
cell:U82:f:1
cell:V82:f:1
cell:W82:f:1
cell:X82:f:1
cell:Y82:f:1
cell:Z82:f:1
cell:AA82:f:1
cell:AB82:f:1
cell:AC82:f:1
cell:AD82:f:1
cell:AE82:f:1
cell:AF82:f:1
cell:AG82:f:1
cell:AH82:f:1
cell:AI82:f:1
cell:AJ82:f:1
cell:AK82:f:1
cell:AL82:f:1
cell:AM82:f:1
cell:AN82:f:1
cell:AO82:f:1
cell:AP82:f:1
cell:AQ82:f:1
cell:AR82:f:1
cell:AS82:f:1
cell:AT82:f:1
cell:AU82:f:1
cell:AV82:vtf:t:v:bw1:f:1
cell:AW82:f:1
cell:AX82:f:1
cell:AY82:f:1
cell:AZ82:f:1
cell:BA82:f:1
cell:BB82:f:1
cell:BC82:f:1
cell:BD82:f:1
cell:BE82:f:1
cell:BF82:f:1
cell:BG82:f:1
cell:BH82:f:1
cell:BI82:vtf:t:t:bw2:f:1
cell:BJ82:f:1
cell:BK82:f:1
cell:BL82:f:1
cell:BM82:f:1
cell:BN82:f:1
cell:BO82:f:1
cell:BP82:f:1
cell:BQ82:f:1
cell:BR82:vtf:t:l:bw3:f:1
cell:BS82:f:1
cell:BT82:f:1
cell:BU82:f:1
cell:BV82:f:1
cell:BW82:f:1
cell:BX82:vtf:t:m:bw4:f:1
cell:BY82:f:1
cell:BZ82:f:1
cell:CA82:f:1
cell:CB82:f:1
cell:CC82:f:1
cell:E83:f:1
cell:F83:f:1
cell:G83:f:1
cell:H83:f:1
cell:I83:f:1
cell:J83:f:1
cell:K83:f:1
cell:L83:f:1
cell:M83:f:1
cell:N83:f:1
cell:O83:f:1
cell:P83:f:1
cell:Q83:f:1
cell:R83:f:1
cell:S83:f:1
cell:T83:f:1
cell:U83:f:1
cell:V83:f:1
cell:W83:f:1
cell:X83:f:1
cell:Y83:f:1
cell:Z83:f:1
cell:AA83:f:1
cell:AB83:f:1
cell:AC83:f:1
cell:AD83:f:1
cell:AE83:f:1
cell:AF83:f:1
cell:AG83:f:1
cell:AH83:f:1
cell:AI83:f:1
cell:AJ83:f:1
cell:AK83:f:1
cell:AL83:f:1
cell:AM83:f:1
cell:AN83:f:1
cell:AO83:f:1
cell:AP83:f:1
cell:AQ83:f:1
cell:AR83:f:1
cell:AS83:f:1
cell:AT83:f:1
cell:AU83:f:1
cell:AV83:vtf:t:e:bx1:f:1
cell:AW83:f:1
cell:AX83:f:1
cell:AY83:f:1
cell:AZ83:f:1
cell:BA83:f:1
cell:BB83:f:1
cell:BC83:f:1
cell:BD83:f:1
cell:BE83:f:1
cell:BF83:f:1
cell:BG83:f:1
cell:BH83:f:1
cell:BI83:vtf:t:t:bx2:f:1
cell:BJ83:f:1
cell:BK83:f:1
cell:BL83:f:1
cell:BM83:f:1
cell:BN83:f:1
cell:BO83:f:1
cell:BP83:f:1
cell:BQ83:f:1
cell:BR83:vtf:t:a:bx3:f:1
cell:BS83:f:1
cell:BT83:f:1
cell:BU83:f:1
cell:BV83:f:1
cell:BW83:f:1
cell:BX83:f:1
cell:BY83:vtf:t:u:bx4:f:1
cell:BZ83:f:1
cell:CA83:f:1
cell:CB83:f:1
cell:CC83:f:1
cell:E84:f:1
cell:F84:f:1
cell:G84:f:1
cell:H84:f:1
cell:I84:f:1
cell:J84:f:1
cell:K84:f:1
cell:L84:f:1
cell:M84:f:1
cell:N84:f:1
cell:O84:f:1
cell:P84:f:1
cell:Q84:f:1
cell:R84:f:1
cell:S84:f:1
cell:T84:f:1
cell:U84:f:1
cell:V84:f:1
cell:W84:f:1
cell:X84:f:1
cell:Y84:f:1
cell:Z84:f:1
cell:AA84:f:1
cell:AB84:f:1
cell:AC84:f:1
cell:AD84:f:1
cell:AE84:f:1
cell:AF84:f:1
cell:AG84:f:1
cell:AH84:f:1
cell:AI84:f:1
cell:AJ84:f:1
cell:AK84:f:1
cell:AL84:f:1
cell:AM84:f:1
cell:AN84:f:1
cell:AO84:f:1
cell:AP84:f:1
cell:AQ84:f:1
cell:AR84:f:1
cell:AS84:f:1
cell:AT84:f:1
cell:AU84:f:1
cell:AV84:f:1
cell:AW84:vtf:t:n:by1:f:1
cell:AX84:f:1
cell:AY84:f:1
cell:AZ84:f:1
cell:BA84:f:1
cell:BB84:f:1
cell:BC84:f:1
cell:BD84:f:1
cell:BE84:f:1
cell:BF84:f:1
cell:BG84:f:1
cell:BH84:f:1
cell:BI84:f:1
cell:BJ84:vtf:t:e:by2:f:1
cell:BK84:f:1
cell:BL84:f:1
cell:BM84:f:1
cell:BN84:f:1
cell:BO84:f:1
cell:BP84:f:1
cell:BQ84:f:1
cell:BR84:f:1
cell:BS84:vtf:t:i:by3:f:1
cell:BT84:f:1
cell:BU84:f:1
cell:BV84:f:1
cell:BW84:f:1
cell:BX84:f:1
cell:BY84:vtf:t:s:by4:f:1
cell:BZ84:f:1
cell:CA84:f:1
cell:CB84:f:1
cell:CC84:f:1
cell:E85:f:1
cell:F85:f:1
cell:G85:f:1
cell:H85:f:1
cell:I85:f:1
cell:J85:f:1
cell:K85:f:1
cell:L85:f:1
cell:M85:f:1
cell:N85:f:1
cell:O85:f:1
cell:P85:f:1
cell:Q85:f:1
cell:R85:f:1
cell:S85:f:1
cell:T85:f:1
cell:U85:f:1
cell:V85:f:1
cell:W85:f:1
cell:X85:f:1
cell:Y85:f:1
cell:Z85:f:1
cell:AA85:f:1
cell:AB85:f:1
cell:AC85:f:1
cell:AD85:f:1
cell:AE85:f:1
cell:AF85:f:1
cell:AG85:f:1
cell:AH85:f:1
cell:AI85:f:1
cell:AJ85:f:1
cell:AK85:f:1
cell:AL85:f:1
cell:AM85:f:1
cell:AN85:f:1
cell:AO85:f:1
cell:AP85:f:1
cell:AQ85:f:1
cell:AR85:f:1
cell:AS85:f:1
cell:AT85:f:1
cell:AU85:f:1
cell:AV85:f:1
cell:AW85:vtf:t:i:bz1:f:1
cell:AX85:f:1
cell:AY85:f:1
cell:AZ85:f:1
cell:BA85:f:1
cell:BB85:f:1
cell:BC85:f:1
cell:BD85:f:1
cell:BE85:f:1
cell:BF85:f:1
cell:BG85:f:1
cell:BH85:f:1
cell:BI85:f:1
cell:BJ85:f:1
cell:BK85:vtf:t:s:bz2:f:1
cell:BL85:f:1
cell:BM85:f:1
cell:BN85:f:1
cell:BO85:f:1
cell:BP85:f:1
cell:BQ85:f:1
cell:BR85:f:1
cell:BS85:vtf:t:r:bz3:f:1
cell:BT85:f:1
cell:BU85:f:1
cell:BV85:f:1
cell:BW85:f:1
cell:BX85:f:1
cell:BY85:f:1
cell:BZ85:vtf:t:i:bz4:f:1
cell:CA85:f:1
cell:CB85:f:1
cell:CC85:f:1
cell:E86:f:1
cell:F86:f:1
cell:G86:f:1
cell:H86:f:1
cell:I86:f:1
cell:J86:f:1
cell:K86:f:1
cell:L86:f:1
cell:M86:f:1
cell:N86:f:1
cell:O86:f:1
cell:P86:f:1
cell:Q86:f:1
cell:R86:f:1
cell:S86:f:1
cell:T86:f:1
cell:U86:f:1
cell:V86:f:1
cell:W86:f:1
cell:X86:f:1
cell:Y86:f:1
cell:Z86:f:1
cell:AA86:f:1
cell:AB86:f:1
cell:AC86:f:1
cell:AD86:f:1
cell:AE86:f:1
cell:AF86:f:1
cell:AG86:f:1
cell:AH86:f:1
cell:AI86:f:1
cell:AJ86:f:1
cell:AK86:f:1
cell:AL86:f:1
cell:AM86:f:1
cell:AN86:f:1
cell:AO86:f:1
cell:AP86:f:1
cell:AQ86:f:1
cell:AR86:f:1
cell:AS86:f:1
cell:AT86:f:1
cell:AU86:f:1
cell:AV86:f:1
cell:AW86:f:1
cell:AX86:vtf:t:r:ca1:f:1
cell:AY86:f:1
cell:AZ86:f:1
cell:BA86:f:1
cell:BB86:f:1
cell:BC86:f:1
cell:BD86:f:1
cell:BE86:f:1
cell:BF86:f:1
cell:BG86:f:1
cell:BH86:f:1
cell:BI86:f:1
cell:BJ86:f:1
cell:BK86:vtf:t: :ca2:f:1
cell:BL86:f:1
cell:BM86:f:1
cell:BN86:f:1
cell:BO86:f:1
cell:BP86:f:1
cell:BQ86:f:1
cell:BR86:f:1
cell:BS86:f:1
cell:BT86:vtf:t:e:ca3:f:1
cell:BU86:f:1
cell:BV86:f:1
cell:BW86:f:1
cell:BX86:f:1
cell:BY86:f:1
cell:BZ86:f:1
cell:CA86:vtf:t:q:ca4:f:1
cell:CB86:f:1
cell:CC86:f:1
cell:E87:f:1
cell:F87:f:1
cell:G87:f:1
cell:H87:f:1
cell:I87:f:1
cell:J87:f:1
cell:K87:f:1
cell:L87:f:1
cell:M87:f:1
cell:N87:f:1
cell:O87:f:1
cell:P87:f:1
cell:Q87:f:1
cell:R87:f:1
cell:S87:f:1
cell:T87:f:1
cell:U87:f:1
cell:V87:f:1
cell:W87:f:1
cell:X87:f:1
cell:Y87:f:1
cell:Z87:f:1
cell:AA87:f:1
cell:AB87:f:1
cell:AC87:f:1
cell:AD87:f:1
cell:AE87:f:1
cell:AF87:f:1
cell:AG87:f:1
cell:AH87:f:1
cell:AI87:f:1
cell:AJ87:f:1
cell:AK87:f:1
cell:AL87:f:1
cell:AM87:f:1
cell:AN87:f:1
cell:AO87:f:1
cell:AP87:f:1
cell:AQ87:f:1
cell:AR87:f:1
cell:AS87:f:1
cell:AT87:f:1
cell:AU87:f:1
cell:AV87:f:1
cell:AW87:f:1
cell:AX87:f:1
cell:AY87:f:1
cell:AZ87:f:1
cell:BA87:f:1
cell:BB87:f:1
cell:BC87:f:1
cell:BD87:f:1
cell:BE87:f:1
cell:BF87:f:1
cell:BG87:f:1
cell:BH87:f:1
cell:BI87:f:1
cell:BJ87:f:1
cell:BK87:f:1
cell:BL87:f:1
cell:BM87:f:1
cell:BN87:f:1
cell:BO87:f:1
cell:BP87:f:1
cell:BQ87:f:1
cell:BR87:f:1
cell:BS87:f:1
cell:BT87:vtf:t:s:cb3:f:1
cell:BU87:f:1
cell:BV87:f:1
cell:BW87:f:1
cell:BX87:f:1
cell:BY87:f:1
cell:BZ87:f:1
cell:CA87:vtf:t:u:cb4:f:1
cell:CB87:f:1
cell:CC87:f:1
cell:E88:f:1
cell:F88:f:1
cell:G88:f:1
cell:H88:f:1
cell:I88:f:1
cell:J88:f:1
cell:K88:f:1
cell:L88:f:1
cell:M88:f:1
cell:N88:f:1
cell:O88:f:1
cell:P88:f:1
cell:Q88:f:1
cell:R88:f:1
cell:S88:f:1
cell:T88:f:1
cell:U88:f:1
cell:V88:f:1
cell:W88:f:1
cell:X88:f:1
cell:Y88:f:1
cell:Z88:f:1
cell:AA88:f:1
cell:AB88:f:1
cell:AC88:f:1
cell:AD88:f:1
cell:AE88:f:1
cell:AF88:f:1
cell:AG88:f:1
cell:AH88:f:1
cell:AI88:f:1
cell:AJ88:f:1
cell:AK88:f:1
cell:AL88:f:1
cell:AM88:f:1
cell:AN88:f:1
cell:AO88:f:1
cell:AP88:f:1
cell:AQ88:f:1
cell:AR88:f:1
cell:AS88:f:1
cell:AT88:f:1
cell:AU88:f:1
cell:AV88:f:1
cell:AW88:f:1
cell:AX88:f:1
cell:AY88:f:1
cell:AZ88:f:1
cell:BA88:f:1
cell:BB88:f:1
cell:BC88:f:1
cell:BD88:f:1
cell:BE88:f:1
cell:BF88:f:1
cell:BG88:f:1
cell:BH88:f:1
cell:BI88:f:1
cell:BJ88:f:1
cell:BK88:f:1
cell:BL88:f:1
cell:BM88:f:1
cell:BN88:f:1
cell:BO88:f:1
cell:BP88:f:1
cell:BQ88:f:1
cell:BR88:f:1
cell:BS88:f:1
cell:BT88:f:1
cell:BU88:f:1
cell:BV88:f:1
cell:BW88:f:1
cell:BX88:f:1
cell:BY88:f:1
cell:BZ88:f:1
cell:CA88:f:1
cell:CB88:vtf:t:e:cc4:f:1
cell:CC88:f:1
cell:E89:f:1
cell:F89:f:1
cell:G89:f:1
cell:H89:f:1
cell:I89:f:1
cell:J89:f:1
cell:K89:f:1
cell:L89:f:1
cell:M89:f:1
cell:N89:f:1
cell:O89:f:1
cell:P89:f:1
cell:Q89:f:1
cell:R89:f:1
cell:S89:f:1
cell:T89:f:1
cell:U89:f:1
cell:V89:f:1
cell:W89:f:1
cell:X89:f:1
cell:Y89:f:1
cell:Z89:f:1
cell:AA89:f:1
cell:AB89:f:1
cell:AC89:f:1
cell:AD89:f:1
cell:AE89:f:1
cell:AF89:f:1
cell:AG89:f:1
cell:AH89:f:1
cell:AI89:f:1
cell:AJ89:f:1
cell:AK89:f:1
cell:AL89:f:1
cell:AM89:f:1
cell:AN89:f:1
cell:AO89:f:1
cell:AP89:f:1
cell:AQ89:f:1
cell:AR89:f:1
cell:AS89:f:1
cell:AT89:f:1
cell:AU89:f:1
cell:AV89:f:1
cell:AW89:f:1
cell:AX89:f:1
cell:AY89:f:1
cell:AZ89:f:1
cell:BA89:f:1
cell:BB89:f:1
cell:BC89:f:1
cell:BD89:f:1
cell:BE89:f:1
cell:BF89:f:1
cell:BG89:f:1
cell:BH89:f:1
cell:BI89:f:1
cell:BJ89:f:1
cell:BK89:f:1
cell:BL89:f:1
cell:BM89:f:1
cell:BN89:f:1
cell:BO89:f:1
cell:BP89:f:1
cell:BQ89:f:1
cell:BR89:f:1
cell:BS89:f:1
cell:BT89:f:1
cell:BU89:f:1
cell:BV89:f:1
cell:BW89:f:1
cell:BX89:f:1
cell:BY89:f:1
cell:BZ89:f:1
cell:CA89:f:1
cell:CB89:f:1
cell:CC89:f:1
col:A:w:14
col:B:w:14
col:C:w:14
col:D:w:14
col:E:w:14
col:F:w:14
col:G:w:14
col:H:w:14
col:I:w:14
col:J:w:14
col:K:w:14
col:L:w:14
col:M:w:14
col:N:w:14
col:O:w:14
col:P:w:14
col:Q:w:14
col:R:w:14
col:S:w:14
col:T:w:14
col:U:w:14
col:V:w:14
col:W:w:14
col:X:w:14
col:Y:w:14
col:Z:w:14
col:AA:w:14
col:AB:w:14
col:AC:w:14
col:AD:w:14
col:AE:w:14
col:AF:w:14
col:AG:w:14
col:AH:w:14
col:AI:w:14
col:AJ:w:14
col:AK:w:14
col:AL:w:14
col:AM:w:14
col:AN:w:14
col:AO:w:14
col:AP:w:14
col:AQ:w:14
col:AR:w:14
col:AS:w:14
col:AT:w:14
col:AU:w:14
col:AV:w:14
col:AW:w:14
col:AX:w:14
col:AY:w:14
col:AZ:w:14
col:BA:w:14
col:BB:w:14
col:BC:w:14
col:BD:w:14
col:BE:w:14
col:BF:w:14
col:BG:w:14
col:BH:w:14
col:BI:w:14
col:BJ:w:14
col:BK:w:14
col:BL:w:14
col:BM:w:14
col:BN:w:14
col:BO:w:14
col:BP:w:14
col:BQ:w:14
col:BR:w:14
col:BS:w:14
col:BT:w:14
col:BU:w:14
col:BV:w:14
col:BW:w:14
col:BX:w:14
col:BY:w:14
col:BZ:w:14
col:CA:w:14
col:CB:w:14
col:CC:w:14
row:1:hide:yes
row:2:hide:yes
row:3:hide:yes
row:4:hide:yes
row:5:hide:yes
sheet:c:81:r:89
font:1:normal bold * *
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.0
rowpane:0:1:24
colpane:0:1:40
ecell:A6
sort::-1:down::::
graph:range:undefined:type::minmax:undefined,undefined,undefined,undefined
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
set E8:CC89 font normal bold * *
--SocialCalcSpreadsheetControlSave--
"""
''Il pleut'' by Guillaume Apollinaire. Calligrammes (1918).
[[English translation|SocialCalc/Demos/calligramme-in-english--demo]]
"""
<$edit-socialcalc tiddler="SocialCalc/Demos/calligramme" mode="view" grid="no" height=500/>
socialcalc:version:1.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
# SocialCalc Spreadsheet Control Save
version:1.0
part:sheet
part:edit
part:audit
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.5
cell:A1:t:I:f:1
cell:B1:t:t
cell:C1:t:':f:1
cell:D1:t:s
cell:E1:t: :f:1
cell:F1:t:r
cell:G1:t:a
cell:H1:t:i
cell:I1:t:n
cell:J1:t:i
cell:K1:t:n
cell:L1:t:g
cell:M1:t:
cell:N1:t:w
cell:O1:t:o
cell:P1:t:m
cell:Q1:t:e
cell:R1:t:n
cell:S1:t:'
cell:T1:t:s
cell:U1:t:
cell:V1:t:v
cell:W1:t:o
cell:X1:t:i
cell:Y1:t:c
cell:Z1:t:e
cell:AA1:t:s
cell:AB1:t:
cell:AC1:t:a
cell:AD1:t:s
cell:AE1:t:
cell:AF1:t:i
cell:AG1:t:f
cell:AH1:t:
cell:AI1:t:t
cell:AJ1:t:h
cell:AK1:t:e
cell:AL1:t:y
cell:AM1:t:
cell:AN1:t:h
cell:AO1:t:a
cell:AP1:t:d
cell:AQ1:t:
cell:AR1:t:d
cell:AS1:t:i
cell:AT1:t:e
cell:AU1:t:d
cell:AV1:t:
cell:AW1:t:e
cell:AX1:t:v
cell:AY1:t:e
cell:AZ1:t:n
cell:BA1:t:
cell:BB1:t:i
cell:BC1:t:n
cell:BD1:t:
cell:BE1:t:m
cell:BF1:t:e
cell:BG1:t:m
cell:BH1:t:o
cell:BI1:t:r
cell:BJ1:t:y
cell:BK1:t:
cell:BL1:t:
cell:BM1:t:
cell:BN1:t:
cell:BO1:t:
cell:BP1:t:
cell:BQ1:t:
cell:BR1:t:
cell:BS1:t:
cell:BT1:t:
cell:BU1:t:
cell:BV1:t:
cell:BW1:t:
cell:BX1:t:
cell:BY1:t:
cell:BZ1:t:
cell:CA1:t:
cell:CB1:t:
cell:A2:t:A
cell:B2:t:n
cell:C2:t:d
cell:D2:t:
cell:E2:t:i
cell:F2:t:t
cell:G2:t:'
cell:H2:t:s
cell:I2:t:
cell:J2:t:r
cell:K2:t:a
cell:L2:t:i
cell:M2:t:n
cell:N2:t:i
cell:O2:t:n
cell:P2:t:g
cell:Q2:t:
cell:R2:t:y
cell:S2:t:o
cell:T2:t:u
cell:U2:t:
cell:V2:t:a
cell:W2:t:s
cell:X2:t:
cell:Y2:t:w
cell:Z2:t:e
cell:AA2:t:l
cell:AB2:t:l
cell:AC2:t:
cell:AD2:t:m
cell:AE2:t:a
cell:AF2:t:r
cell:AG2:t:v
cell:AH2:t:e
cell:AI2:t:l
cell:AJ2:t:l
cell:AK2:t:o
cell:AL2:t:u
cell:AM2:t:s
cell:AN2:t:
cell:AO2:t:e
cell:AP2:t:n
cell:AQ2:t:c
cell:AR2:t:o
cell:AS2:t:u
cell:AT2:t:n
cell:AU2:t:t
cell:AV2:t:e
cell:AW2:t:r
cell:AX2:t:s
cell:AY2:t:
cell:AZ2:t:o
cell:BA2:t:f
cell:BB2:t:
cell:BC2:t:m
cell:BD2:t:y
cell:BE2:t:
cell:BF2:t:l
cell:BG2:t:i
cell:BH2:t:f
cell:BI2:t:e
cell:BJ2:t:
cell:BK2:t:O
cell:BL2:t:
cell:BM2:t:l
cell:BN2:t:i
cell:BO2:t:t
cell:BP2:t:t
cell:BQ2:t:l
cell:BR2:t:e
cell:BS2:t:
cell:BT2:t:d
cell:BU2:t:r
cell:BV2:t:o
cell:BW2:t:p
cell:BX2:t:s
cell:BY2:t:
cell:BZ2:t:
cell:CA2:t:
cell:CB2:t:
cell:A3:t:T
cell:B3:t:h
cell:C3:t:o
cell:D3:t:s
cell:E3:t:e
cell:F3:t:
cell:G3:t:r
cell:H3:t:e
cell:I3:t:a
cell:J3:t:r
cell:K3:t:i
cell:L3:t:n
cell:M3:t:g
cell:N3:t:
cell:O3:t:c
cell:P3:t:l
cell:Q3:t:o
cell:R3:t:u
cell:S3:t:d
cell:T3:t:s
cell:U3:t:
cell:V3:t:b
cell:W3:t:e
cell:X3:t:g
cell:Y3:t:i
cell:Z3:t:n
cell:AA3:t:
cell:AB3:t:t
cell:AC3:t:o
cell:AD3:t:
cell:AE3:t:n
cell:AF3:t:e
cell:AG3:t:i
cell:AH3:t:g
cell:AI3:t:h
cell:AJ3:t:
cell:AK3:t:a
cell:AL3:t:
cell:AM3:t:w
cell:AN3:t:h
cell:AO3:t:o
cell:AP3:t:l
cell:AQ3:t:e
cell:AR3:t:
cell:AS3:t:u
cell:AT3:t:n
cell:AU3:t:i
cell:AV3:t:v
cell:AW3:t:e
cell:AX3:t:r
cell:AY3:t:s
cell:AZ3:t:e
cell:BA3:t:
cell:BB3:t:o
cell:BC3:t:f
cell:BD3:t:
cell:BE3:t:a
cell:BF3:t:u
cell:BG3:t:r
cell:BH3:t:i
cell:BI3:t:c
cell:BJ3:t:u
cell:BK3:t:l
cell:BL3:t:a
cell:BM3:t:r
cell:BN3:t:
cell:BO3:t:c
cell:BP3:t:i
cell:BQ3:t:t
cell:BR3:t:i
cell:BS3:t:e
cell:BT3:t:s
cell:BU3:t:
cell:BV3:t:
cell:BW3:t:
cell:BX3:t:
cell:BY3:t:
cell:BZ3:t:
cell:CA3:t:
cell:CB3:t:
cell:A4:t:L
cell:B4:t:i
cell:C4:t:s
cell:D4:t:t
cell:E4:t:e
cell:F4:t:n
cell:G4:t:
cell:H4:t:i
cell:I4:t:f
cell:J4:t:
cell:K4:t:i
cell:L4:t:t
cell:M4:t:
cell:N4:t:r
cell:O4:t:a
cell:P4:t:i
cell:Q4:t:n
cell:R4:t:s
cell:S4:t:
cell:T4:t:w
cell:U4:t:h
cell:V4:t:i
cell:W4:t:l
cell:X4:t:e
cell:Y4:t:
cell:Z4:t:r
cell:AA4:t:e
cell:AB4:t:g
cell:AC4:t:r
cell:AD4:t:e
cell:AE4:t:t
cell:AF4:t:
cell:AG4:t:a
cell:AH4:t:n
cell:AI4:t:d
cell:AJ4:t:
cell:AK4:t:d
cell:AL4:t:i
cell:AM4:t:s
cell:AN4:t:d
cell:AO4:t:a
cell:AP4:t:i
cell:AQ4:t:n
cell:AR4:t:
cell:AS4:t:w
cell:AT4:t:e
cell:AU4:t:e
cell:AV4:t:p
cell:AW4:t:
cell:AX4:t:t
cell:AY4:t:o
cell:AZ4:t:
cell:BA4:t:a
cell:BB4:t:n
cell:BC4:t:
cell:BD4:t:a
cell:BE4:t:n
cell:BF4:t:c
cell:BG4:t:i
cell:BH4:t:e
cell:BI4:t:n
cell:BJ4:t:t
cell:BK4:t:
cell:BL4:t:m
cell:BM4:t:u
cell:BN4:t:s
cell:BO4:t:i
cell:BP4:t:c
cell:BQ4:t:
cell:BR4:t:
cell:BS4:t:
cell:BT4:t:
cell:BU4:t:
cell:BV4:t:
cell:BW4:t:
cell:BX4:t:
cell:BY4:t:
cell:BZ4:t:
cell:CA4:t:
cell:CB4:t:
cell:CC4:t:
cell:A5:t:L
cell:B5:t:i
cell:C5:t:s
cell:D5:t:t
cell:E5:t:e
cell:F5:t:n
cell:G5:t:
cell:H5:t:t
cell:I5:t:o
cell:J5:t:
cell:K5:t:t
cell:L5:t:h
cell:M5:t:e
cell:N5:t:
cell:O5:t:b
cell:P5:t:o
cell:Q5:t:n
cell:R5:t:d
cell:S5:t:s
cell:T5:t:
cell:U5:t:f
cell:V5:t:a
cell:W5:t:l
cell:X5:t:l
cell:Y5:t:
cell:Z5:t:o
cell:AA5:t:f
cell:AB5:t:f
cell:AC5:t:
cell:AD5:t:w
cell:AE5:t:h
cell:AF5:t:i
cell:AG5:t:c
cell:AH5:t:h
cell:AI5:t:
cell:AJ5:t:h
cell:AK5:t:o
cell:AL5:t:l
cell:AM5:t:d
cell:AN5:t:
cell:AO5:t:y
cell:AP5:t:o
cell:AQ5:t:u
cell:AR5:t:
cell:AS5:t:a
cell:AT5:t:b
cell:AU5:t:o
cell:AV5:t:v
cell:AW5:t:e
cell:AX5:t:
cell:AY5:t:a
cell:AZ5:t:n
cell:BA5:t:d
cell:BB5:t:
cell:BC5:t:b
cell:BD5:t:e
cell:BE5:t:l
cell:BF5:t:o
cell:BG5:t:w
cell:E8:vtf:t:I:a1:f:1
cell:F8:f:1
cell:G8:f:1
cell:H8:f:1
cell:I8:f:1
cell:J8:f:1
cell:K8:f:1
cell:L8:f:1
cell:M8:f:1
cell:N8:f:1
cell:O8:f:1
cell:P8:f:1
cell:Q8:vtf:t:A:a2:f:1
cell:R8:f:1
cell:S8:f:1
cell:T8:f:1
cell:U8:f:1
cell:V8:vtf:t:T:a3:f:1
cell:W8:f:1
cell:X8:f:1
cell:Y8:f:1
cell:Z8:f:1
cell:AA8:vtf:t:L:a4:f:1
cell:AB8:f:1
cell:AC8:f:1
cell:AD8:f:1
cell:AE8:f:1
cell:AF8:vtf:t:L:a5:f:1
cell:AG8:f:1
cell:AH8:f:1
cell:AI8:f:1
cell:AJ8:f:1
cell:AK8:f:1
cell:AL8:f:1
cell:AM8:f:1
cell:AN8:f:1
cell:AO8:f:1
cell:AP8:f:1
cell:AQ8:f:1
cell:AR8:f:1
cell:AS8:f:1
cell:AT8:f:1
cell:AU8:f:1
cell:AV8:f:1
cell:AW8:f:1
cell:AX8:f:1
cell:AY8:f:1
cell:AZ8:f:1
cell:BA8:f:1
cell:BB8:f:1
cell:BC8:f:1
cell:BD8:f:1
cell:BE8:f:1
cell:BF8:f:1
cell:BG8:f:1
cell:BH8:f:1
cell:BI8:f:1
cell:BJ8:f:1
cell:BK8:f:1
cell:BL8:f:1
cell:BM8:f:1
cell:BN8:f:1
cell:BO8:f:1
cell:BP8:f:1
cell:BQ8:f:1
cell:BR8:f:1
cell:BS8:f:1
cell:BT8:f:1
cell:BU8:f:1
cell:BV8:f:1
cell:E9:f:1
cell:F9:vtf:t:t:b1:f:1
cell:G9:f:1
cell:H9:f:1
cell:I9:f:1
cell:J9:f:1
cell:K9:f:1
cell:L9:f:1
cell:M9:f:1
cell:N9:f:1
cell:O9:f:1
cell:P9:f:1
cell:Q9:vtf:t:n:b2:f:1
cell:R9:f:1
cell:S9:f:1
cell:T9:f:1
cell:U9:f:1
cell:V9:f:1
cell:W9:vtf:t:h:b3:f:1
cell:X9:f:1
cell:Y9:f:1
cell:Z9:f:1
cell:AA9:f:1
cell:AB9:vtf:t:i:b4:f:1
cell:AC9:f:1
cell:AD9:f:1
cell:AE9:f:1
cell:AF9:vtf:t:i:b5:f:1
cell:AG9:f:1
cell:AH9:f:1
cell:AI9:f:1
cell:AJ9:f:1
cell:AK9:f:1
cell:AL9:f:1
cell:AM9:f:1
cell:AN9:f:1
cell:AO9:f:1
cell:AP9:f:1
cell:AQ9:f:1
cell:AR9:f:1
cell:AS9:f:1
cell:AT9:f:1
cell:AU9:f:1
cell:AV9:f:1
cell:AW9:f:1
cell:AX9:f:1
cell:AY9:f:1
cell:AZ9:f:1
cell:BA9:f:1
cell:BB9:f:1
cell:BC9:f:1
cell:BD9:f:1
cell:BE9:f:1
cell:BF9:f:1
cell:BG9:f:1
cell:BH9:f:1
cell:BI9:f:1
cell:BJ9:f:1
cell:BK9:f:1
cell:BL9:f:1
cell:BM9:f:1
cell:BN9:f:1
cell:BO9:f:1
cell:BP9:f:1
cell:BQ9:f:1
cell:BR9:f:1
cell:BS9:f:1
cell:BT9:f:1
cell:BU9:f:1
cell:BV9:f:1
cell:E10:f:1
cell:F10:f:1
cell:G10:vtf:t:':c1:f:1
cell:H10:f:1
cell:I10:f:1
cell:J10:f:1
cell:K10:f:1
cell:L10:f:1
cell:M10:f:1
cell:N10:f:1
cell:O10:f:1
cell:P10:f:1
cell:Q10:f:1
cell:R10:vtf:t:d:c2:f:1
cell:S10:f:1
cell:T10:f:1
cell:U10:f:1
cell:V10:f:1
cell:W10:f:1
cell:X10:vtf:t:o:c3:f:1
cell:Y10:f:1
cell:Z10:f:1
cell:AA10:f:1
cell:AB10:vtf:t:s:c4:f:1
cell:AC10:f:1
cell:AD10:f:1
cell:AE10:f:1
cell:AF10:f:1
cell:AG10:vtf:t:s:c5:f:1
cell:AH10:f:1
cell:AI10:f:1
cell:AJ10:f:1
cell:AK10:f:1
cell:AL10:f:1
cell:AM10:f:1
cell:AN10:f:1
cell:AO10:f:1
cell:AP10:f:1
cell:AQ10:f:1
cell:AR10:f:1
cell:AS10:f:1
cell:AT10:f:1
cell:AU10:f:1
cell:AV10:f:1
cell:AW10:f:1
cell:AX10:f:1
cell:AY10:f:1
cell:AZ10:f:1
cell:BA10:f:1
cell:BB10:f:1
cell:BC10:f:1
cell:BD10:f:1
cell:BE10:f:1
cell:BF10:f:1
cell:BG10:f:1
cell:BH10:f:1
cell:BI10:f:1
cell:BJ10:f:1
cell:BK10:f:1
cell:BL10:f:1
cell:BM10:f:1
cell:BN10:f:1
cell:BO10:f:1
cell:BP10:f:1
cell:BQ10:f:1
cell:BR10:f:1
cell:BS10:f:1
cell:BT10:f:1
cell:BU10:f:1
cell:BV10:f:1
cell:E11:f:1
cell:F11:f:1
cell:G11:vtf:t:s:d1:f:1
cell:H11:f:1
cell:I11:f:1
cell:J11:f:1
cell:K11:f:1
cell:L11:f:1
cell:M11:f:1
cell:N11:f:1
cell:O11:f:1
cell:P11:f:1
cell:Q11:f:1
cell:R11:vtf:t: :d2:f:1
cell:S11:f:1
cell:T11:f:1
cell:U11:f:1
cell:V11:f:1
cell:W11:f:1
cell:X11:vtf:t:s:d3:f:1
cell:Y11:f:1
cell:Z11:f:1
cell:AA11:f:1
cell:AB11:f:1
cell:AC11:vtf:t:t:d4:f:1
cell:AD11:f:1
cell:AE11:f:1
cell:AF11:f:1
cell:AG11:f:1
cell:AH11:vtf:t:t:d5:f:1
cell:AI11:f:1
cell:AJ11:f:1
cell:AK11:f:1
cell:AL11:f:1
cell:AM11:f:1
cell:AN11:f:1
cell:AO11:f:1
cell:AP11:f:1
cell:AQ11:f:1
cell:AR11:f:1
cell:AS11:f:1
cell:AT11:f:1
cell:AU11:f:1
cell:AV11:f:1
cell:AW11:f:1
cell:AX11:f:1
cell:AY11:f:1
cell:AZ11:f:1
cell:BA11:f:1
cell:BB11:f:1
cell:BC11:f:1
cell:BD11:f:1
cell:BE11:f:1
cell:BF11:f:1
cell:BG11:f:1
cell:BH11:f:1
cell:BI11:f:1
cell:BJ11:f:1
cell:BK11:f:1
cell:BL11:f:1
cell:BM11:f:1
cell:BN11:f:1
cell:BO11:f:1
cell:BP11:f:1
cell:BQ11:f:1
cell:BR11:f:1
cell:BS11:f:1
cell:BT11:f:1
cell:BU11:f:1
cell:BV11:f:1
cell:E12:f:1
cell:F12:f:1
cell:G12:f:1
cell:H12:vtf:t: :e1:f:1
cell:I12:f:1
cell:J12:f:1
cell:K12:f:1
cell:L12:f:1
cell:M12:f:1
cell:N12:f:1
cell:O12:f:1
cell:P12:f:1
cell:Q12:f:1
cell:R12:f:1
cell:S12:vtf:t:i:e2:f:1
cell:T12:f:1
cell:U12:f:1
cell:V12:f:1
cell:W12:f:1
cell:X12:f:1
cell:Y12:vtf:t:e:e3:f:1
cell:Z12:f:1
cell:AA12:f:1
cell:AB12:f:1
cell:AC12:vtf:t:e:e4:f:1
cell:AD12:f:1
cell:AE12:f:1
cell:AF12:f:1
cell:AG12:f:1
cell:AH12:f:1
cell:AI12:vtf:t:e:e5:f:1
cell:AJ12:f:1
cell:AK12:f:1
cell:AL12:f:1
cell:AM12:f:1
cell:AN12:f:1
cell:AO12:f:1
cell:AP12:f:1
cell:AQ12:f:1
cell:AR12:f:1
cell:AS12:f:1
cell:AT12:f:1
cell:AU12:f:1
cell:AV12:f:1
cell:AW12:f:1
cell:AX12:f:1
cell:AY12:f:1
cell:AZ12:f:1
cell:BA12:f:1
cell:BB12:f:1
cell:BC12:f:1
cell:BD12:f:1
cell:BE12:f:1
cell:BF12:f:1
cell:BG12:f:1
cell:BH12:f:1
cell:BI12:f:1
cell:BJ12:f:1
cell:BK12:f:1
cell:BL12:f:1
cell:BM12:f:1
cell:BN12:f:1
cell:BO12:f:1
cell:BP12:f:1
cell:BQ12:f:1
cell:BR12:f:1
cell:BS12:f:1
cell:BT12:f:1
cell:BU12:f:1
cell:BV12:f:1
cell:E13:f:1
cell:F13:f:1
cell:G13:f:1
cell:H13:f:1
cell:I13:vtf:t:r:f1:f:1
cell:J13:f:1
cell:K13:f:1
cell:L13:f:1
cell:M13:f:1
cell:N13:f:1
cell:O13:f:1
cell:P13:f:1
cell:Q13:f:1
cell:R13:f:1
cell:S13:vtf:t:t:f2:f:1
cell:T13:f:1
cell:U13:f:1
cell:V13:f:1
cell:W13:f:1
cell:X13:f:1
cell:Y13:vtf:t: :f3:f:1
cell:Z13:f:1
cell:AA13:f:1
cell:AB13:f:1
cell:AC13:f:1
cell:AD13:vtf:t:n:f4:f:1
cell:AE13:f:1
cell:AF13:f:1
cell:AG13:f:1
cell:AH13:f:1
cell:AI13:vtf:t:n:f5:f:1
cell:AJ13:f:1
cell:AK13:f:1
cell:AL13:f:1
cell:AM13:f:1
cell:AN13:f:1
cell:AO13:f:1
cell:AP13:f:1
cell:AQ13:f:1
cell:AR13:f:1
cell:AS13:f:1
cell:AT13:f:1
cell:AU13:f:1
cell:AV13:f:1
cell:AW13:f:1
cell:AX13:f:1
cell:AY13:f:1
cell:AZ13:f:1
cell:BA13:f:1
cell:BB13:f:1
cell:BC13:f:1
cell:BD13:f:1
cell:BE13:f:1
cell:BF13:f:1
cell:BG13:f:1
cell:BH13:f:1
cell:BI13:f:1
cell:BJ13:f:1
cell:BK13:f:1
cell:BL13:f:1
cell:BM13:f:1
cell:BN13:f:1
cell:BO13:f:1
cell:BP13:f:1
cell:BQ13:f:1
cell:BR13:f:1
cell:BS13:f:1
cell:BT13:f:1
cell:BU13:f:1
cell:BV13:f:1
cell:E14:f:1
cell:F14:f:1
cell:G14:f:1
cell:H14:f:1
cell:I14:vtf:t:a:g1:f:1
cell:J14:f:1
cell:K14:f:1
cell:L14:f:1
cell:M14:f:1
cell:N14:f:1
cell:O14:f:1
cell:P14:f:1
cell:Q14:f:1
cell:R14:f:1
cell:S14:f:1
cell:T14:vtf:t:':g2:f:1
cell:U14:f:1
cell:V14:f:1
cell:W14:f:1
cell:X14:f:1
cell:Y14:f:1
cell:Z14:vtf:t:r:g3:f:1
cell:AA14:f:1
cell:AB14:f:1
cell:AC14:f:1
cell:AD14:f:1
cell:AE14:vtf:t: :g4:f:1
cell:AF14:f:1
cell:AG14:f:1
cell:AH14:f:1
cell:AI14:f:1
cell:AJ14:vtf:t: :g5:f:1
cell:AK14:f:1
cell:AL14:f:1
cell:AM14:f:1
cell:AN14:f:1
cell:AO14:f:1
cell:AP14:f:1
cell:AQ14:f:1
cell:AR14:f:1
cell:AS14:f:1
cell:AT14:f:1
cell:AU14:f:1
cell:AV14:f:1
cell:AW14:f:1
cell:AX14:f:1
cell:AY14:f:1
cell:AZ14:f:1
cell:BA14:f:1
cell:BB14:f:1
cell:BC14:f:1
cell:BD14:f:1
cell:BE14:f:1
cell:BF14:f:1
cell:BG14:f:1
cell:BH14:f:1
cell:BI14:f:1
cell:BJ14:f:1
cell:BK14:f:1
cell:BL14:f:1
cell:BM14:f:1
cell:BN14:f:1
cell:BO14:f:1
cell:BP14:f:1
cell:BQ14:f:1
cell:BR14:f:1
cell:BS14:f:1
cell:BT14:f:1
cell:BU14:f:1
cell:BV14:f:1
cell:E15:f:1
cell:F15:f:1
cell:G15:f:1
cell:H15:f:1
cell:I15:f:1
cell:J15:vtf:t:i:h1:f:1
cell:K15:f:1
cell:L15:f:1
cell:M15:f:1
cell:N15:f:1
cell:O15:f:1
cell:P15:f:1
cell:Q15:f:1
cell:R15:f:1
cell:S15:f:1
cell:T15:vtf:t:s:h2:f:1
cell:U15:f:1
cell:V15:f:1
cell:W15:f:1
cell:X15:f:1
cell:Y15:f:1
cell:Z15:vtf:t:e:h3:f:1
cell:AA15:f:1
cell:AB15:f:1
cell:AC15:f:1
cell:AD15:f:1
cell:AE15:vtf:t:i:h4:f:1
cell:AF15:f:1
cell:AG15:f:1
cell:AH15:f:1
cell:AI15:f:1
cell:AJ15:f:1
cell:AK15:vtf:t:t:h5:f:1
cell:AL15:f:1
cell:AM15:f:1
cell:AN15:f:1
cell:AO15:f:1
cell:AP15:f:1
cell:AQ15:f:1
cell:AR15:f:1
cell:AS15:f:1
cell:AT15:f:1
cell:AU15:f:1
cell:AV15:f:1
cell:AW15:f:1
cell:AX15:f:1
cell:AY15:f:1
cell:AZ15:f:1
cell:BA15:f:1
cell:BB15:f:1
cell:BC15:f:1
cell:BD15:f:1
cell:BE15:f:1
cell:BF15:f:1
cell:BG15:f:1
cell:BH15:f:1
cell:BI15:f:1
cell:BJ15:f:1
cell:BK15:f:1
cell:BL15:f:1
cell:BM15:f:1
cell:BN15:f:1
cell:BO15:f:1
cell:BP15:f:1
cell:BQ15:f:1
cell:BR15:f:1
cell:BS15:f:1
cell:BT15:f:1
cell:BU15:f:1
cell:BV15:f:1
cell:E16:f:1
cell:F16:f:1
cell:G16:f:1
cell:H16:f:1
cell:I16:f:1
cell:J16:vtf:t:n:i1:f:1
cell:K16:f:1
cell:L16:f:1
cell:M16:f:1
cell:N16:f:1
cell:O16:f:1
cell:P16:f:1
cell:Q16:f:1
cell:R16:f:1
cell:S16:f:1
cell:T16:f:1
cell:U16:vtf:t: :i2:f:1
cell:V16:f:1
cell:W16:f:1
cell:X16:f:1
cell:Y16:f:1
cell:Z16:vtf:t:a:i3:f:1
cell:AA16:f:1
cell:AB16:f:1
cell:AC16:f:1
cell:AD16:f:1
cell:AE16:f:1
cell:AF16:vtf:t:f:i4:f:1
cell:AG16:f:1
cell:AH16:f:1
cell:AI16:f:1
cell:AJ16:f:1
cell:AK16:f:1
cell:AL16:vtf:t:o:i5:f:1
cell:AM16:f:1
cell:AN16:f:1
cell:AO16:f:1
cell:AP16:f:1
cell:AQ16:f:1
cell:AR16:f:1
cell:AS16:f:1
cell:AT16:f:1
cell:AU16:f:1
cell:AV16:f:1
cell:AW16:f:1
cell:AX16:f:1
cell:AY16:f:1
cell:AZ16:f:1
cell:BA16:f:1
cell:BB16:f:1
cell:BC16:f:1
cell:BD16:f:1
cell:BE16:f:1
cell:BF16:f:1
cell:BG16:f:1
cell:BH16:f:1
cell:BI16:f:1
cell:BJ16:f:1
cell:BK16:f:1
cell:BL16:f:1
cell:BM16:f:1
cell:BN16:f:1
cell:BO16:f:1
cell:BP16:f:1
cell:BQ16:f:1
cell:BR16:f:1
cell:BS16:f:1
cell:BT16:f:1
cell:BU16:f:1
cell:BV16:f:1
cell:E17:f:1
cell:F17:f:1
cell:G17:f:1
cell:H17:f:1
cell:I17:f:1
cell:J17:vtf:t:i:j1:f:1
cell:K17:f:1
cell:L17:f:1
cell:M17:f:1
cell:N17:f:1
cell:O17:f:1
cell:P17:f:1
cell:Q17:f:1
cell:R17:f:1
cell:S17:f:1
cell:T17:f:1
cell:U17:vtf:t:r:j2:f:1
cell:V17:f:1
cell:W17:f:1
cell:X17:f:1
cell:Y17:f:1
cell:Z17:f:1
cell:AA17:vtf:t:r:j3:f:1
cell:AB17:f:1
cell:AC17:f:1
cell:AD17:f:1
cell:AE17:f:1
cell:AF17:vtf:t: :j4:f:1
cell:AG17:f:1
cell:AH17:f:1
cell:AI17:f:1
cell:AJ17:f:1
cell:AK17:f:1
cell:AL17:f:1
cell:AM17:vtf:t: :j5:f:1
cell:AN17:f:1
cell:AO17:f:1
cell:AP17:f:1
cell:AQ17:f:1
cell:AR17:f:1
cell:AS17:f:1
cell:AT17:f:1
cell:AU17:f:1
cell:AV17:f:1
cell:AW17:f:1
cell:AX17:f:1
cell:AY17:f:1
cell:AZ17:f:1
cell:BA17:f:1
cell:BB17:f:1
cell:BC17:f:1
cell:BD17:f:1
cell:BE17:f:1
cell:BF17:f:1
cell:BG17:f:1
cell:BH17:f:1
cell:BI17:f:1
cell:BJ17:f:1
cell:BK17:f:1
cell:BL17:f:1
cell:BM17:f:1
cell:BN17:f:1
cell:BO17:f:1
cell:BP17:f:1
cell:BQ17:f:1
cell:BR17:f:1
cell:BS17:f:1
cell:BT17:f:1
cell:BU17:f:1
cell:BV17:f:1
cell:E18:f:1
cell:F18:f:1
cell:G18:f:1
cell:H18:f:1
cell:I18:f:1
cell:J18:vtf:t:n:k1:f:1
cell:K18:f:1
cell:L18:f:1
cell:M18:f:1
cell:N18:f:1
cell:O18:f:1
cell:P18:f:1
cell:Q18:f:1
cell:R18:f:1
cell:S18:f:1
cell:T18:f:1
cell:U18:f:1
cell:V18:vtf:t:a:k2:f:1
cell:W18:f:1
cell:X18:f:1
cell:Y18:f:1
cell:Z18:f:1
cell:AA18:f:1
cell:AB18:vtf:t:i:k3:f:1
cell:AC18:f:1
cell:AD18:f:1
cell:AE18:f:1
cell:AF18:f:1
cell:AG18:vtf:t:i:k4:f:1
cell:AH18:f:1
cell:AI18:f:1
cell:AJ18:f:1
cell:AK18:f:1
cell:AL18:f:1
cell:AM18:f:1
cell:AN18:vtf:t:t:k5:f:1
cell:AO18:f:1
cell:AP18:f:1
cell:AQ18:f:1
cell:AR18:f:1
cell:AS18:f:1
cell:AT18:f:1
cell:AU18:f:1
cell:AV18:f:1
cell:AW18:f:1
cell:AX18:f:1
cell:AY18:f:1
cell:AZ18:f:1
cell:BA18:f:1
cell:BB18:f:1
cell:BC18:f:1
cell:BD18:f:1
cell:BE18:f:1
cell:BF18:f:1
cell:BG18:f:1
cell:BH18:f:1
cell:BI18:f:1
cell:BJ18:f:1
cell:BK18:f:1
cell:BL18:f:1
cell:BM18:f:1
cell:BN18:f:1
cell:BO18:f:1
cell:BP18:f:1
cell:BQ18:f:1
cell:BR18:f:1
cell:BS18:f:1
cell:BT18:f:1
cell:BU18:f:1
cell:BV18:f:1
cell:E19:f:1
cell:F19:f:1
cell:G19:f:1
cell:H19:f:1
cell:I19:f:1
cell:J19:f:1
cell:K19:vtf:t:g:l1:f:1
cell:L19:f:1
cell:M19:f:1
cell:N19:f:1
cell:O19:f:1
cell:P19:f:1
cell:Q19:f:1
cell:R19:f:1
cell:S19:f:1
cell:T19:f:1
cell:U19:f:1
cell:V19:vtf:t:i:l2:f:1
cell:W19:f:1
cell:X19:f:1
cell:Y19:f:1
cell:Z19:f:1
cell:AA19:f:1
cell:AB19:f:1
cell:AC19:vtf:t:n:l3:f:1
cell:AD19:f:1
cell:AE19:f:1
cell:AF19:f:1
cell:AG19:vtf:t:t:l4:f:1
cell:AH19:f:1
cell:AI19:f:1
cell:AJ19:f:1
cell:AK19:f:1
cell:AL19:f:1
cell:AM19:f:1
cell:AN19:vtf:t:h:l5:f:1
cell:AO19:f:1
cell:AP19:f:1
cell:AQ19:f:1
cell:AR19:f:1
cell:AS19:f:1
cell:AT19:f:1
cell:AU19:f:1
cell:AV19:f:1
cell:AW19:f:1
cell:AX19:f:1
cell:AY19:f:1
cell:AZ19:f:1
cell:BA19:f:1
cell:BB19:f:1
cell:BC19:f:1
cell:BD19:f:1
cell:BE19:f:1
cell:BF19:f:1
cell:BG19:f:1
cell:BH19:f:1
cell:BI19:f:1
cell:BJ19:f:1
cell:BK19:f:1
cell:BL19:f:1
cell:BM19:f:1
cell:BN19:f:1
cell:BO19:f:1
cell:BP19:f:1
cell:BQ19:f:1
cell:BR19:f:1
cell:BS19:f:1
cell:BT19:f:1
cell:BU19:f:1
cell:BV19:f:1
cell:E20:f:1
cell:F20:f:1
cell:G20:f:1
cell:H20:f:1
cell:I20:f:1
cell:J20:f:1
cell:K20:vtf:t: :m1:f:1
cell:L20:f:1
cell:M20:f:1
cell:N20:f:1
cell:O20:f:1
cell:P20:f:1
cell:Q20:f:1
cell:R20:f:1
cell:S20:f:1
cell:T20:f:1
cell:U20:f:1
cell:V20:vtf:t:n:m2:f:1
cell:W20:f:1
cell:X20:f:1
cell:Y20:f:1
cell:Z20:f:1
cell:AA20:f:1
cell:AB20:f:1
cell:AC20:vtf:t:g:m3:f:1
cell:AD20:f:1
cell:AE20:f:1
cell:AF20:f:1
cell:AG20:f:1
cell:AH20:vtf:t: :m4:f:1
cell:AI20:f:1
cell:AJ20:f:1
cell:AK20:f:1
cell:AL20:f:1
cell:AM20:f:1
cell:AN20:f:1
cell:AO20:vtf:t:e:m5:f:1
cell:AP20:f:1
cell:AQ20:f:1
cell:AR20:f:1
cell:AS20:f:1
cell:AT20:f:1
cell:AU20:f:1
cell:AV20:f:1
cell:AW20:f:1
cell:AX20:f:1
cell:AY20:f:1
cell:AZ20:f:1
cell:BA20:f:1
cell:BB20:f:1
cell:BC20:f:1
cell:BD20:f:1
cell:BE20:f:1
cell:BF20:f:1
cell:BG20:f:1
cell:BH20:f:1
cell:BI20:f:1
cell:BJ20:f:1
cell:BK20:f:1
cell:BL20:f:1
cell:BM20:f:1
cell:BN20:f:1
cell:BO20:f:1
cell:BP20:f:1
cell:BQ20:f:1
cell:BR20:f:1
cell:BS20:f:1
cell:BT20:f:1
cell:BU20:f:1
cell:BV20:f:1
cell:E21:f:1
cell:F21:f:1
cell:G21:f:1
cell:H21:f:1
cell:I21:f:1
cell:J21:f:1
cell:K21:f:1
cell:L21:vtf:t:w:n1:f:1
cell:M21:f:1
cell:N21:f:1
cell:O21:f:1
cell:P21:f:1
cell:Q21:f:1
cell:R21:f:1
cell:S21:f:1
cell:T21:f:1
cell:U21:f:1
cell:V21:f:1
cell:W21:vtf:t:i:n2:f:1
cell:X21:f:1
cell:Y21:f:1
cell:Z21:f:1
cell:AA21:f:1
cell:AB21:f:1
cell:AC21:f:1
cell:AD21:vtf:t: :n3:f:1
cell:AE21:f:1
cell:AF21:f:1
cell:AG21:f:1
cell:AH21:f:1
cell:AI21:vtf:t:r:n4:f:1
cell:AJ21:f:1
cell:AK21:f:1
cell:AL21:f:1
cell:AM21:f:1
cell:AN21:f:1
cell:AO21:f:1
cell:AP21:vtf:t: :n5:f:1
cell:AQ21:f:1
cell:AR21:f:1
cell:AS21:f:1
cell:AT21:f:1
cell:AU21:f:1
cell:AV21:f:1
cell:AW21:f:1
cell:AX21:f:1
cell:AY21:f:1
cell:AZ21:f:1
cell:BA21:f:1
cell:BB21:f:1
cell:BC21:f:1
cell:BD21:f:1
cell:BE21:f:1
cell:BF21:f:1
cell:BG21:f:1
cell:BH21:f:1
cell:BI21:f:1
cell:BJ21:f:1
cell:BK21:f:1
cell:BL21:f:1
cell:BM21:f:1
cell:BN21:f:1
cell:BO21:f:1
cell:BP21:f:1
cell:BQ21:f:1
cell:BR21:f:1
cell:BS21:f:1
cell:BT21:f:1
cell:BU21:f:1
cell:BV21:f:1
cell:E22:f:1
cell:F22:f:1
cell:G22:f:1
cell:H22:f:1
cell:I22:f:1
cell:J22:f:1
cell:K22:f:1
cell:L22:vtf:t:o:o1:f:1
cell:M22:f:1
cell:N22:f:1
cell:O22:f:1
cell:P22:f:1
cell:Q22:f:1
cell:R22:f:1
cell:S22:f:1
cell:T22:f:1
cell:U22:f:1
cell:V22:f:1
cell:W22:vtf:t:n:o2:f:1
cell:X22:f:1
cell:Y22:f:1
cell:Z22:f:1
cell:AA22:f:1
cell:AB22:f:1
cell:AC22:f:1
cell:AD22:f:1
cell:AE22:vtf:t:c:o3:f:1
cell:AF22:f:1
cell:AG22:f:1
cell:AH22:f:1
cell:AI22:f:1
cell:AJ22:vtf:t:a:o4:f:1
cell:AK22:f:1
cell:AL22:f:1
cell:AM22:f:1
cell:AN22:f:1
cell:AO22:f:1
cell:AP22:f:1
cell:AQ22:vtf:t:b:o5:f:1
cell:AR22:f:1
cell:AS22:f:1
cell:AT22:f:1
cell:AU22:f:1
cell:AV22:f:1
cell:AW22:f:1
cell:AX22:f:1
cell:AY22:f:1
cell:AZ22:f:1
cell:BA22:f:1
cell:BB22:f:1
cell:BC22:f:1
cell:BD22:f:1
cell:BE22:f:1
cell:BF22:f:1
cell:BG22:f:1
cell:BH22:f:1
cell:BI22:f:1
cell:BJ22:f:1
cell:BK22:f:1
cell:BL22:f:1
cell:BM22:f:1
cell:BN22:f:1
cell:BO22:f:1
cell:BP22:f:1
cell:BQ22:f:1
cell:BR22:f:1
cell:BS22:f:1
cell:BT22:f:1
cell:BU22:f:1
cell:BV22:f:1
cell:E23:f:1
cell:F23:f:1
cell:G23:f:1
cell:H23:f:1
cell:I23:f:1
cell:J23:f:1
cell:K23:f:1
cell:L23:f:1
cell:M23:vtf:t:m:p1:f:1
cell:N23:f:1
cell:O23:f:1
cell:P23:f:1
cell:Q23:f:1
cell:R23:f:1
cell:S23:f:1
cell:T23:f:1
cell:U23:f:1
cell:V23:f:1
cell:W23:f:1
cell:X23:vtf:t:g:p2:f:1
cell:Y23:f:1
cell:Z23:f:1
cell:AA23:f:1
cell:AB23:f:1
cell:AC23:f:1
cell:AD23:f:1
cell:AE23:vtf:t:l:p3:f:1
cell:AF23:f:1
cell:AG23:f:1
cell:AH23:f:1
cell:AI23:f:1
cell:AJ23:vtf:t:i:p4:f:1
cell:AK23:f:1
cell:AL23:f:1
cell:AM23:f:1
cell:AN23:f:1
cell:AO23:f:1
cell:AP23:f:1
cell:AQ23:vtf:t:o:p5:f:1
cell:AR23:f:1
cell:AS23:f:1
cell:AT23:f:1
cell:AU23:f:1
cell:AV23:f:1
cell:AW23:f:1
cell:AX23:f:1
cell:AY23:f:1
cell:AZ23:f:1
cell:BA23:f:1
cell:BB23:f:1
cell:BC23:f:1
cell:BD23:f:1
cell:BE23:f:1
cell:BF23:f:1
cell:BG23:f:1
cell:BH23:f:1
cell:BI23:f:1
cell:BJ23:f:1
cell:BK23:f:1
cell:BL23:f:1
cell:BM23:f:1
cell:BN23:f:1
cell:BO23:f:1
cell:BP23:f:1
cell:BQ23:f:1
cell:BR23:f:1
cell:BS23:f:1
cell:BT23:f:1
cell:BU23:f:1
cell:BV23:f:1
cell:E24:f:1
cell:F24:f:1
cell:G24:f:1
cell:H24:f:1
cell:I24:f:1
cell:J24:f:1
cell:K24:f:1
cell:L24:f:1
cell:M24:f:1
cell:N24:vtf:t:e:q1:f:1
cell:O24:f:1
cell:P24:f:1
cell:Q24:f:1
cell:R24:f:1
cell:S24:f:1
cell:T24:f:1
cell:U24:f:1
cell:V24:f:1
cell:W24:f:1
cell:X24:vtf:t: :q2:f:1
cell:Y24:f:1
cell:Z24:f:1
cell:AA24:f:1
cell:AB24:f:1
cell:AC24:f:1
cell:AD24:f:1
cell:AE24:f:1
cell:AF24:vtf:t:o:q3:f:1
cell:AG24:f:1
cell:AH24:f:1
cell:AI24:f:1
cell:AJ24:f:1
cell:AK24:vtf:t:n:q4:f:1
cell:AL24:f:1
cell:AM24:f:1
cell:AN24:f:1
cell:AO24:f:1
cell:AP24:f:1
cell:AQ24:f:1
cell:AR24:vtf:t:n:q5:f:1
cell:AS24:f:1
cell:AT24:f:1
cell:AU24:f:1
cell:AV24:f:1
cell:AW24:f:1
cell:AX24:f:1
cell:AY24:f:1
cell:AZ24:f:1
cell:BA24:f:1
cell:BB24:f:1
cell:BC24:f:1
cell:BD24:f:1
cell:BE24:f:1
cell:BF24:f:1
cell:BG24:f:1
cell:BH24:f:1
cell:BI24:f:1
cell:BJ24:f:1
cell:BK24:f:1
cell:BL24:f:1
cell:BM24:f:1
cell:BN24:f:1
cell:BO24:f:1
cell:BP24:f:1
cell:BQ24:f:1
cell:BR24:f:1
cell:BS24:f:1
cell:BT24:f:1
cell:BU24:f:1
cell:BV24:f:1
cell:E25:f:1
cell:F25:f:1
cell:G25:f:1
cell:H25:f:1
cell:I25:f:1
cell:J25:f:1
cell:K25:f:1
cell:L25:f:1
cell:M25:f:1
cell:N25:vtf:t:n:r1:f:1
cell:O25:f:1
cell:P25:f:1
cell:Q25:f:1
cell:R25:f:1
cell:S25:f:1
cell:T25:f:1
cell:U25:f:1
cell:V25:f:1
cell:W25:f:1
cell:X25:f:1
cell:Y25:vtf:t:y:r2:f:1
cell:Z25:f:1
cell:AA25:f:1
cell:AB25:f:1
cell:AC25:f:1
cell:AD25:f:1
cell:AE25:f:1
cell:AF25:f:1
cell:AG25:vtf:t:u:r3:f:1
cell:AH25:f:1
cell:AI25:f:1
cell:AJ25:f:1
cell:AK25:f:1
cell:AL25:vtf:t:s:r4:f:1
cell:AM25:f:1
cell:AN25:f:1
cell:AO25:f:1
cell:AP25:f:1
cell:AQ25:f:1
cell:AR25:f:1
cell:AS25:vtf:t:d:r5:f:1
cell:AT25:f:1
cell:AU25:f:1
cell:AV25:f:1
cell:AW25:f:1
cell:AX25:f:1
cell:AY25:f:1
cell:AZ25:f:1
cell:BA25:f:1
cell:BB25:f:1
cell:BC25:f:1
cell:BD25:f:1
cell:BE25:f:1
cell:BF25:f:1
cell:BG25:f:1
cell:BH25:f:1
cell:BI25:f:1
cell:BJ25:f:1
cell:BK25:f:1
cell:BL25:f:1
cell:BM25:f:1
cell:BN25:f:1
cell:BO25:f:1
cell:BP25:f:1
cell:BQ25:f:1
cell:BR25:f:1
cell:BS25:f:1
cell:BT25:f:1
cell:BU25:f:1
cell:BV25:f:1
cell:E26:f:1
cell:F26:f:1
cell:G26:f:1
cell:H26:f:1
cell:I26:f:1
cell:J26:f:1
cell:K26:f:1
cell:L26:f:1
cell:M26:f:1
cell:N26:f:1
cell:O26:vtf:t:':s1:f:1
cell:P26:f:1
cell:Q26:f:1
cell:R26:f:1
cell:S26:f:1
cell:T26:f:1
cell:U26:f:1
cell:V26:f:1
cell:W26:f:1
cell:X26:f:1
cell:Y26:vtf:t:o:s2:f:1
cell:Z26:f:1
cell:AA26:f:1
cell:AB26:f:1
cell:AC26:f:1
cell:AD26:f:1
cell:AE26:f:1
cell:AF26:f:1
cell:AG26:vtf:t:d:s3:f:1
cell:AH26:f:1
cell:AI26:f:1
cell:AJ26:f:1
cell:AK26:f:1
cell:AL26:vtf:t: :s4:f:1
cell:AM26:f:1
cell:AN26:f:1
cell:AO26:f:1
cell:AP26:f:1
cell:AQ26:f:1
cell:AR26:f:1
cell:AS26:f:1
cell:AT26:vtf:t:s:s5:f:1
cell:AU26:f:1
cell:AV26:f:1
cell:AW26:f:1
cell:AX26:f:1
cell:AY26:f:1
cell:AZ26:f:1
cell:BA26:f:1
cell:BB26:f:1
cell:BC26:f:1
cell:BD26:f:1
cell:BE26:f:1
cell:BF26:f:1
cell:BG26:f:1
cell:BH26:f:1
cell:BI26:f:1
cell:BJ26:f:1
cell:BK26:f:1
cell:BL26:f:1
cell:BM26:f:1
cell:BN26:f:1
cell:BO26:f:1
cell:BP26:f:1
cell:BQ26:f:1
cell:BR26:f:1
cell:BS26:f:1
cell:BT26:f:1
cell:BU26:f:1
cell:BV26:f:1
cell:E27:f:1
cell:F27:f:1
cell:G27:f:1
cell:H27:f:1
cell:I27:f:1
cell:J27:f:1
cell:K27:f:1
cell:L27:f:1
cell:M27:f:1
cell:N27:f:1
cell:O27:f:1
cell:P27:vtf:t:s:t1:f:1
cell:Q27:f:1
cell:R27:f:1
cell:S27:f:1
cell:T27:f:1
cell:U27:f:1
cell:V27:f:1
cell:W27:f:1
cell:X27:f:1
cell:Y27:f:1
cell:Z27:vtf:t:u:t2:f:1
cell:AA27:f:1
cell:AB27:f:1
cell:AC27:f:1
cell:AD27:f:1
cell:AE27:f:1
cell:AF27:f:1
cell:AG27:f:1
cell:AH27:vtf:t:s:t3:f:1
cell:AI27:f:1
cell:AJ27:f:1
cell:AK27:f:1
cell:AL27:f:1
cell:AM27:vtf:t:w:t4:f:1
cell:AN27:f:1
cell:AO27:f:1
cell:AP27:f:1
cell:AQ27:f:1
cell:AR27:f:1
cell:AS27:f:1
cell:AT27:vtf:t: :t5:f:1
cell:AU27:f:1
cell:AV27:f:1
cell:AW27:f:1
cell:AX27:f:1
cell:AY27:f:1
cell:AZ27:f:1
cell:BA27:f:1
cell:BB27:f:1
cell:BC27:f:1
cell:BD27:f:1
cell:BE27:f:1
cell:BF27:f:1
cell:BG27:f:1
cell:BH27:f:1
cell:BI27:f:1
cell:BJ27:f:1
cell:BK27:f:1
cell:BL27:f:1
cell:BM27:f:1
cell:BN27:f:1
cell:BO27:f:1
cell:BP27:f:1
cell:BQ27:f:1
cell:BR27:f:1
cell:BS27:f:1
cell:BT27:f:1
cell:BU27:f:1
cell:BV27:f:1
cell:E28:f:1
cell:F28:f:1
cell:G28:f:1
cell:H28:f:1
cell:I28:f:1
cell:J28:f:1
cell:K28:f:1
cell:L28:f:1
cell:M28:f:1
cell:N28:f:1
cell:O28:f:1
cell:P28:vtf:t: :u1:f:1
cell:Q28:vtf:t: :u1:f:1
cell:R28:f:1
cell:S28:f:1
cell:T28:f:1
cell:U28:f:1
cell:V28:f:1
cell:W28:f:1
cell:X28:f:1
cell:Y28:f:1
cell:Z28:vtf:t: :u2:f:1
cell:AA28:f:1
cell:AB28:f:1
cell:AC28:f:1
cell:AD28:f:1
cell:AE28:f:1
cell:AF28:f:1
cell:AG28:f:1
cell:AH28:vtf:t: :u3:f:1
cell:AI28:f:1
cell:AJ28:f:1
cell:AK28:f:1
cell:AL28:f:1
cell:AM28:f:1
cell:AN28:vtf:t:h:u4:f:1
cell:AO28:f:1
cell:AP28:f:1
cell:AQ28:f:1
cell:AR28:f:1
cell:AS28:f:1
cell:AT28:f:1
cell:AU28:vtf:t:f:u5:f:1
cell:AV28:f:1
cell:AW28:f:1
cell:AX28:f:1
cell:AY28:f:1
cell:AZ28:f:1
cell:BA28:f:1
cell:BB28:f:1
cell:BC28:f:1
cell:BD28:f:1
cell:BE28:f:1
cell:BF28:f:1
cell:BG28:f:1
cell:BH28:f:1
cell:BI28:f:1
cell:BJ28:f:1
cell:BK28:f:1
cell:BL28:f:1
cell:BM28:f:1
cell:BN28:f:1
cell:BO28:f:1
cell:BP28:f:1
cell:BQ28:f:1
cell:BR28:f:1
cell:BS28:f:1
cell:BT28:f:1
cell:BU28:f:1
cell:BV28:f:1
cell:E29:f:1
cell:F29:f:1
cell:G29:f:1
cell:H29:f:1
cell:I29:f:1
cell:J29:f:1
cell:K29:f:1
cell:L29:f:1
cell:M29:f:1
cell:N29:f:1
cell:O29:f:1
cell:P29:f:1
cell:Q29:vtf:t:v:v1:f:1
cell:R29:f:1
cell:S29:f:1
cell:T29:f:1
cell:U29:f:1
cell:V29:f:1
cell:W29:f:1
cell:X29:f:1
cell:Y29:f:1
cell:Z29:f:1
cell:AA29:vtf:t:a:v2:f:1
cell:AB29:f:1
cell:AC29:f:1
cell:AD29:f:1
cell:AE29:f:1
cell:AF29:f:1
cell:AG29:f:1
cell:AH29:vtf:t:b:v3:f:1
cell:AI29:f:1
cell:AJ29:f:1
cell:AK29:f:1
cell:AL29:f:1
cell:AM29:f:1
cell:AN29:f:1
cell:AO29:vtf:t:i:v4:f:1
cell:AP29:f:1
cell:AQ29:f:1
cell:AR29:f:1
cell:AS29:f:1
cell:AT29:f:1
cell:AU29:f:1
cell:AV29:vtf:t:a:v5:f:1
cell:AW29:f:1
cell:AX29:f:1
cell:AY29:f:1
cell:AZ29:f:1
cell:BA29:f:1
cell:BB29:f:1
cell:BC29:f:1
cell:BD29:f:1
cell:BE29:f:1
cell:BF29:f:1
cell:BG29:f:1
cell:BH29:f:1
cell:BI29:f:1
cell:BJ29:f:1
cell:BK29:f:1
cell:BL29:f:1
cell:BM29:f:1
cell:BN29:f:1
cell:BO29:f:1
cell:BP29:f:1
cell:BQ29:f:1
cell:BR29:f:1
cell:BS29:f:1
cell:BT29:f:1
cell:BU29:f:1
cell:BV29:f:1
cell:E30:f:1
cell:F30:f:1
cell:G30:f:1
cell:H30:f:1
cell:I30:f:1
cell:J30:f:1
cell:K30:f:1
cell:L30:f:1
cell:M30:f:1
cell:N30:f:1
cell:O30:f:1
cell:P30:f:1
cell:Q30:f:1
cell:R30:vtf:t:o:w1:f:1
cell:S30:f:1
cell:T30:f:1
cell:U30:f:1
cell:V30:f:1
cell:W30:f:1
cell:X30:f:1
cell:Y30:f:1
cell:Z30:f:1
cell:AA30:vtf:t:s:w2:f:1
cell:AB30:f:1
cell:AC30:f:1
cell:AD30:f:1
cell:AE30:f:1
cell:AF30:f:1
cell:AG30:f:1
cell:AH30:f:1
cell:AI30:vtf:t:e:w3:f:1
cell:AJ30:f:1
cell:AK30:f:1
cell:AL30:f:1
cell:AM30:f:1
cell:AN30:f:1
cell:AO30:f:1
cell:AP30:vtf:t:l:w4:f:1
cell:AQ30:f:1
cell:AR30:f:1
cell:AS30:f:1
cell:AT30:f:1
cell:AU30:f:1
cell:AV30:f:1
cell:AW30:vtf:t:l:w5:f:1
cell:AX30:f:1
cell:AY30:f:1
cell:AZ30:f:1
cell:BA30:f:1
cell:BB30:f:1
cell:BC30:f:1
cell:BD30:f:1
cell:BE30:f:1
cell:BF30:f:1
cell:BG30:f:1
cell:BH30:f:1
cell:BI30:f:1
cell:BJ30:f:1
cell:BK30:f:1
cell:BL30:f:1
cell:BM30:f:1
cell:BN30:f:1
cell:BO30:f:1
cell:BP30:f:1
cell:BQ30:f:1
cell:BR30:f:1
cell:BS30:f:1
cell:BT30:f:1
cell:BU30:f:1
cell:BV30:f:1
cell:E31:f:1
cell:F31:f:1
cell:G31:f:1
cell:H31:f:1
cell:I31:f:1
cell:J31:f:1
cell:K31:f:1
cell:L31:f:1
cell:M31:f:1
cell:N31:f:1
cell:O31:f:1
cell:P31:f:1
cell:Q31:f:1
cell:R31:vtf:t:i:x1:f:1
cell:S31:f:1
cell:T31:f:1
cell:U31:f:1
cell:V31:f:1
cell:W31:f:1
cell:X31:f:1
cell:Y31:f:1
cell:Z31:f:1
cell:AA31:f:1
cell:AB31:vtf:t: :x2:f:1
cell:AC31:f:1
cell:AD31:f:1
cell:AE31:f:1
cell:AF31:f:1
cell:AG31:f:1
cell:AH31:f:1
cell:AI31:vtf:t:g:x3:f:1
cell:AJ31:f:1
cell:AK31:f:1
cell:AL31:f:1
cell:AM31:f:1
cell:AN31:f:1
cell:AO31:f:1
cell:AP31:f:1
cell:AQ31:vtf:t:e:x4:f:1
cell:AR31:f:1
cell:AS31:f:1
cell:AT31:f:1
cell:AU31:f:1
cell:AV31:f:1
cell:AW31:f:1
cell:AX31:vtf:t:l:x5:f:1
cell:AY31:f:1
cell:AZ31:f:1
cell:BA31:f:1
cell:BB31:f:1
cell:BC31:f:1
cell:BD31:f:1
cell:BE31:f:1
cell:BF31:f:1
cell:BG31:f:1
cell:BH31:f:1
cell:BI31:f:1
cell:BJ31:f:1
cell:BK31:f:1
cell:BL31:f:1
cell:BM31:f:1
cell:BN31:f:1
cell:BO31:f:1
cell:BP31:f:1
cell:BQ31:f:1
cell:BR31:f:1
cell:BS31:f:1
cell:BT31:f:1
cell:BU31:f:1
cell:BV31:f:1
cell:E32:f:1
cell:F32:f:1
cell:G32:f:1
cell:H32:f:1
cell:I32:f:1
cell:J32:f:1
cell:K32:f:1
cell:L32:f:1
cell:M32:f:1
cell:N32:f:1
cell:O32:f:1
cell:P32:f:1
cell:Q32:f:1
cell:R32:f:1
cell:S32:vtf:t:c:y1:f:1
cell:T32:f:1
cell:U32:f:1
cell:V32:f:1
cell:W32:f:1
cell:X32:f:1
cell:Y32:f:1
cell:Z32:f:1
cell:AA32:f:1
cell:AB32:vtf:t:w:y2:f:1
cell:AC32:f:1
cell:AD32:f:1
cell:AE32:f:1
cell:AF32:f:1
cell:AG32:f:1
cell:AH32:f:1
cell:AI32:f:1
cell:AJ32:vtf:t:i:y3:f:1
cell:AK32:f:1
cell:AL32:f:1
cell:AM32:f:1
cell:AN32:f:1
cell:AO32:f:1
cell:AP32:f:1
cell:AQ32:f:1
cell:AR32:vtf:t: :y4:f:1
cell:AS32:f:1
cell:AT32:f:1
cell:AU32:f:1
cell:AV32:f:1
cell:AW32:f:1
cell:AX32:vtf:t: :y5:f:1
cell:AY32:f:1
cell:AZ32:f:1
cell:BA32:f:1
cell:BB32:f:1
cell:BC32:f:1
cell:BD32:f:1
cell:BE32:f:1
cell:BF32:f:1
cell:BG32:f:1
cell:BH32:f:1
cell:BI32:f:1
cell:BJ32:f:1
cell:BK32:f:1
cell:BL32:f:1
cell:BM32:f:1
cell:BN32:f:1
cell:BO32:f:1
cell:BP32:f:1
cell:BQ32:f:1
cell:BR32:f:1
cell:BS32:f:1
cell:BT32:f:1
cell:BU32:f:1
cell:BV32:f:1
cell:E33:f:1
cell:F33:f:1
cell:G33:f:1
cell:H33:f:1
cell:I33:f:1
cell:J33:f:1
cell:K33:f:1
cell:L33:f:1
cell:M33:f:1
cell:N33:f:1
cell:O33:f:1
cell:P33:f:1
cell:Q33:f:1
cell:R33:f:1
cell:S33:vtf:t:e:z1:f:1
cell:T33:f:1
cell:U33:f:1
cell:V33:f:1
cell:W33:f:1
cell:X33:f:1
cell:Y33:f:1
cell:Z33:f:1
cell:AA33:f:1
cell:AB33:f:1
cell:AC33:vtf:t:e:z2:f:1
cell:AD33:f:1
cell:AE33:f:1
cell:AF33:f:1
cell:AG33:f:1
cell:AH33:f:1
cell:AI33:f:1
cell:AJ33:f:1
cell:AK33:vtf:t:n:z3:f:1
cell:AL33:f:1
cell:AM33:f:1
cell:AN33:f:1
cell:AO33:f:1
cell:AP33:f:1
cell:AQ33:f:1
cell:AR33:vtf:t:r:z4:f:1
cell:AS33:f:1
cell:AT33:f:1
cell:AU33:f:1
cell:AV33:f:1
cell:AW33:f:1
cell:AX33:f:1
cell:AY33:vtf:t:o:z5:f:1
cell:AZ33:f:1
cell:BA33:f:1
cell:BB33:f:1
cell:BC33:f:1
cell:BD33:f:1
cell:BE33:f:1
cell:BF33:f:1
cell:BG33:f:1
cell:BH33:f:1
cell:BI33:f:1
cell:BJ33:f:1
cell:BK33:f:1
cell:BL33:f:1
cell:BM33:f:1
cell:BN33:f:1
cell:BO33:f:1
cell:BP33:f:1
cell:BQ33:f:1
cell:BR33:f:1
cell:BS33:f:1
cell:BT33:f:1
cell:BU33:f:1
cell:BV33:f:1
cell:E34:f:1
cell:F34:f:1
cell:G34:f:1
cell:H34:f:1
cell:I34:f:1
cell:J34:f:1
cell:K34:f:1
cell:L34:f:1
cell:M34:f:1
cell:N34:f:1
cell:O34:f:1
cell:P34:f:1
cell:Q34:f:1
cell:R34:f:1
cell:S34:f:1
cell:T34:vtf:t:s:aa1:f:1
cell:U34:f:1
cell:V34:f:1
cell:W34:f:1
cell:X34:f:1
cell:Y34:f:1
cell:Z34:f:1
cell:AA34:f:1
cell:AB34:f:1
cell:AC34:vtf:t:l:aa2:f:1
cell:AD34:f:1
cell:AE34:f:1
cell:AF34:f:1
cell:AG34:f:1
cell:AH34:f:1
cell:AI34:f:1
cell:AJ34:f:1
cell:AK34:vtf:t: :aa3:f:1
cell:AL34:f:1
cell:AM34:f:1
cell:AN34:f:1
cell:AO34:f:1
cell:AP34:f:1
cell:AQ34:f:1
cell:AR34:f:1
cell:AS34:vtf:t:e:aa4:f:1
cell:AT34:f:1
cell:AU34:f:1
cell:AV34:f:1
cell:AW34:f:1
cell:AX34:f:1
cell:AY34:f:1
cell:AZ34:vtf:t:f:aa5:f:1
cell:BA34:f:1
cell:BB34:f:1
cell:BC34:f:1
cell:BD34:f:1
cell:BE34:f:1
cell:BF34:f:1
cell:BG34:f:1
cell:BH34:f:1
cell:BI34:f:1
cell:BJ34:f:1
cell:BK34:f:1
cell:BL34:f:1
cell:BM34:f:1
cell:BN34:f:1
cell:BO34:f:1
cell:BP34:f:1
cell:BQ34:f:1
cell:BR34:f:1
cell:BS34:f:1
cell:BT34:f:1
cell:BU34:f:1
cell:BV34:f:1
cell:E35:f:1
cell:F35:f:1
cell:G35:f:1
cell:H35:f:1
cell:I35:f:1
cell:J35:f:1
cell:K35:f:1
cell:L35:f:1
cell:M35:f:1
cell:N35:f:1
cell:O35:f:1
cell:P35:f:1
cell:Q35:f:1
cell:R35:f:1
cell:S35:f:1
cell:T35:f:1
cell:U35:vtf:t: :ab1:f:1
cell:V35:f:1
cell:W35:f:1
cell:X35:f:1
cell:Y35:f:1
cell:Z35:f:1
cell:AA35:f:1
cell:AB35:f:1
cell:AC35:f:1
cell:AD35:vtf:t:l:ab2:f:1
cell:AE35:f:1
cell:AF35:f:1
cell:AG35:f:1
cell:AH35:f:1
cell:AI35:f:1
cell:AJ35:f:1
cell:AK35:f:1
cell:AL35:vtf:t:t:ab3:f:1
cell:AM35:f:1
cell:AN35:f:1
cell:AO35:f:1
cell:AP35:f:1
cell:AQ35:f:1
cell:AR35:f:1
cell:AS35:f:1
cell:AT35:vtf:t:g:ab4:f:1
cell:AU35:f:1
cell:AV35:f:1
cell:AW35:f:1
cell:AX35:f:1
cell:AY35:f:1
cell:AZ35:f:1
cell:BA35:vtf:t:f:ab5:f:1
cell:BB35:f:1
cell:BC35:f:1
cell:BD35:f:1
cell:BE35:f:1
cell:BF35:f:1
cell:BG35:f:1
cell:BH35:f:1
cell:BI35:f:1
cell:BJ35:f:1
cell:BK35:f:1
cell:BL35:f:1
cell:BM35:f:1
cell:BN35:f:1
cell:BO35:f:1
cell:BP35:f:1
cell:BQ35:f:1
cell:BR35:f:1
cell:BS35:f:1
cell:BT35:f:1
cell:BU35:f:1
cell:BV35:f:1
cell:E36:f:1
cell:F36:f:1
cell:G36:f:1
cell:H36:f:1
cell:I36:f:1
cell:J36:f:1
cell:K36:f:1
cell:L36:f:1
cell:M36:f:1
cell:N36:f:1
cell:O36:f:1
cell:P36:f:1
cell:Q36:f:1
cell:R36:f:1
cell:S36:f:1
cell:T36:f:1
cell:U36:vtf:t:a:ac1:f:1
cell:V36:f:1
cell:W36:f:1
cell:X36:f:1
cell:Y36:f:1
cell:Z36:f:1
cell:AA36:f:1
cell:AB36:f:1
cell:AC36:f:1
cell:AD36:f:1
cell:AE36:vtf:t: :ac2:f:1
cell:AF36:f:1
cell:AG36:f:1
cell:AH36:f:1
cell:AI36:f:1
cell:AJ36:f:1
cell:AK36:f:1
cell:AL36:vtf:t:o:ac3:f:1
cell:AM36:f:1
cell:AN36:f:1
cell:AO36:f:1
cell:AP36:f:1
cell:AQ36:f:1
cell:AR36:f:1
cell:AS36:f:1
cell:AT36:vtf:t:r:ac4:f:1
cell:AU36:f:1
cell:AV36:f:1
cell:AW36:f:1
cell:AX36:f:1
cell:AY36:f:1
cell:AZ36:f:1
cell:BA36:f:1
cell:BB36:vtf:t: :ac5:f:1
cell:BC36:f:1
cell:BD36:f:1
cell:BE36:f:1
cell:BF36:f:1
cell:BG36:f:1
cell:BH36:f:1
cell:BI36:f:1
cell:BJ36:f:1
cell:BK36:f:1
cell:BL36:f:1
cell:BM36:f:1
cell:BN36:f:1
cell:BO36:f:1
cell:BP36:f:1
cell:BQ36:f:1
cell:BR36:f:1
cell:BS36:f:1
cell:BT36:f:1
cell:BU36:f:1
cell:BV36:f:1
cell:E37:f:1
cell:F37:f:1
cell:G37:f:1
cell:H37:f:1
cell:I37:f:1
cell:J37:f:1
cell:K37:f:1
cell:L37:f:1
cell:M37:f:1
cell:N37:f:1
cell:O37:f:1
cell:P37:f:1
cell:Q37:f:1
cell:R37:f:1
cell:S37:f:1
cell:T37:f:1
cell:U37:f:1
cell:V37:vtf:t:s:ad1:f:1
cell:W37:f:1
cell:X37:f:1
cell:Y37:f:1
cell:Z37:f:1
cell:AA37:f:1
cell:AB37:f:1
cell:AC37:f:1
cell:AD37:f:1
cell:AE37:vtf:t:m:ad2:f:1
cell:AF37:f:1
cell:AG37:f:1
cell:AH37:f:1
cell:AI37:f:1
cell:AJ37:f:1
cell:AK37:f:1
cell:AL37:f:1
cell:AM37:vtf:t: :ad3:f:1
cell:AN37:f:1
cell:AO37:f:1
cell:AP37:f:1
cell:AQ37:f:1
cell:AR37:f:1
cell:AS37:f:1
cell:AT37:f:1
cell:AU37:vtf:t:e:ad4:f:1
cell:AV37:f:1
cell:AW37:f:1
cell:AX37:f:1
cell:AY37:f:1
cell:AZ37:f:1
cell:BA37:f:1
cell:BB37:vtf:t:w:ad5:f:1
cell:BC37:f:1
cell:BD37:f:1
cell:BE37:f:1
cell:BF37:f:1
cell:BG37:f:1
cell:BH37:f:1
cell:BI37:f:1
cell:BJ37:f:1
cell:BK37:f:1
cell:BL37:f:1
cell:BM37:f:1
cell:BN37:f:1
cell:BO37:f:1
cell:BP37:f:1
cell:BQ37:f:1
cell:BR37:f:1
cell:BS37:f:1
cell:BT37:f:1
cell:BU37:f:1
cell:BV37:f:1
cell:E38:f:1
cell:F38:f:1
cell:G38:f:1
cell:H38:f:1
cell:I38:f:1
cell:J38:f:1
cell:K38:f:1
cell:L38:f:1
cell:M38:f:1
cell:N38:f:1
cell:O38:f:1
cell:P38:f:1
cell:Q38:f:1
cell:R38:f:1
cell:S38:f:1
cell:T38:f:1
cell:U38:f:1
cell:V38:vtf:t: :ae1:f:1
cell:W38:f:1
cell:X38:f:1
cell:Y38:f:1
cell:Z38:f:1
cell:AA38:f:1
cell:AB38:f:1
cell:AC38:f:1
cell:AD38:f:1
cell:AE38:f:1
cell:AF38:vtf:t:a:ae2:f:1
cell:AG38:f:1
cell:AH38:f:1
cell:AI38:f:1
cell:AJ38:f:1
cell:AK38:f:1
cell:AL38:f:1
cell:AM38:f:1
cell:AN38:vtf:t:n:ae3:f:1
cell:AO38:f:1
cell:AP38:f:1
cell:AQ38:f:1
cell:AR38:f:1
cell:AS38:f:1
cell:AT38:f:1
cell:AU38:f:1
cell:AV38:vtf:t:t:ae4:f:1
cell:AW38:f:1
cell:AX38:f:1
cell:AY38:f:1
cell:AZ38:f:1
cell:BA38:f:1
cell:BB38:f:1
cell:BC38:vtf:t:h:ae5:f:1
cell:BD38:f:1
cell:BE38:f:1
cell:BF38:f:1
cell:BG38:f:1
cell:BH38:f:1
cell:BI38:f:1
cell:BJ38:f:1
cell:BK38:f:1
cell:BL38:f:1
cell:BM38:f:1
cell:BN38:f:1
cell:BO38:f:1
cell:BP38:f:1
cell:BQ38:f:1
cell:BR38:f:1
cell:BS38:f:1
cell:BT38:f:1
cell:BU38:f:1
cell:BV38:f:1
cell:E39:f:1
cell:F39:f:1
cell:G39:f:1
cell:H39:f:1
cell:I39:f:1
cell:J39:f:1
cell:K39:f:1
cell:L39:f:1
cell:M39:f:1
cell:N39:f:1
cell:O39:f:1
cell:P39:f:1
cell:Q39:f:1
cell:R39:f:1
cell:S39:f:1
cell:T39:f:1
cell:U39:f:1
cell:V39:f:1
cell:W39:vtf:t:i:af1:f:1
cell:X39:f:1
cell:Y39:f:1
cell:Z39:f:1
cell:AA39:f:1
cell:AB39:f:1
cell:AC39:f:1
cell:AD39:f:1
cell:AE39:f:1
cell:AF39:vtf:t:r:af2:f:1
cell:AG39:f:1
cell:AH39:f:1
cell:AI39:f:1
cell:AJ39:f:1
cell:AK39:f:1
cell:AL39:f:1
cell:AM39:f:1
cell:AN39:vtf:t:e:af3:f:1
cell:AO39:f:1
cell:AP39:f:1
cell:AQ39:f:1
cell:AR39:f:1
cell:AS39:f:1
cell:AT39:f:1
cell:AU39:f:1
cell:AV39:vtf:t: :af4:f:1
cell:AW39:f:1
cell:AX39:f:1
cell:AY39:f:1
cell:AZ39:f:1
cell:BA39:f:1
cell:BB39:f:1
cell:BC39:f:1
cell:BD39:vtf:t:i:af5:f:1
cell:BE39:f:1
cell:BF39:f:1
cell:BG39:f:1
cell:BH39:f:1
cell:BI39:f:1
cell:BJ39:f:1
cell:BK39:f:1
cell:BL39:f:1
cell:BM39:f:1
cell:BN39:f:1
cell:BO39:f:1
cell:BP39:f:1
cell:BQ39:f:1
cell:BR39:f:1
cell:BS39:f:1
cell:BT39:f:1
cell:BU39:f:1
cell:BV39:f:1
cell:E40:f:1
cell:F40:f:1
cell:G40:f:1
cell:H40:f:1
cell:I40:f:1
cell:J40:f:1
cell:K40:f:1
cell:L40:f:1
cell:M40:f:1
cell:N40:f:1
cell:O40:f:1
cell:P40:f:1
cell:Q40:f:1
cell:R40:f:1
cell:S40:f:1
cell:T40:f:1
cell:U40:f:1
cell:V40:f:1
cell:W40:vtf:t:f:ag1:f:1
cell:X40:f:1
cell:Y40:f:1
cell:Z40:f:1
cell:AA40:f:1
cell:AB40:f:1
cell:AC40:f:1
cell:AD40:f:1
cell:AE40:f:1
cell:AF40:f:1
cell:AG40:vtf:t:v:ag2:f:1
cell:AH40:f:1
cell:AI40:f:1
cell:AJ40:f:1
cell:AK40:f:1
cell:AL40:f:1
cell:AM40:f:1
cell:AN40:f:1
cell:AO40:vtf:t:i:ag3:f:1
cell:AP40:f:1
cell:AQ40:f:1
cell:AR40:f:1
cell:AS40:f:1
cell:AT40:f:1
cell:AU40:f:1
cell:AV40:f:1
cell:AW40:vtf:t:a:ag4:f:1
cell:AX40:f:1
cell:AY40:f:1
cell:AZ40:f:1
cell:BA40:f:1
cell:BB40:f:1
cell:BC40:f:1
cell:BD40:vtf:t:c:ag5:f:1
cell:BE40:f:1
cell:BF40:f:1
cell:BG40:f:1
cell:BH40:f:1
cell:BI40:f:1
cell:BJ40:f:1
cell:BK40:f:1
cell:BL40:f:1
cell:BM40:f:1
cell:BN40:f:1
cell:BO40:f:1
cell:BP40:f:1
cell:BQ40:f:1
cell:BR40:f:1
cell:BS40:f:1
cell:BT40:f:1
cell:BU40:f:1
cell:BV40:f:1
cell:E41:f:1
cell:F41:f:1
cell:G41:f:1
cell:H41:f:1
cell:I41:f:1
cell:J41:f:1
cell:K41:f:1
cell:L41:f:1
cell:M41:f:1
cell:N41:f:1
cell:O41:f:1
cell:P41:f:1
cell:Q41:f:1
cell:R41:f:1
cell:S41:f:1
cell:T41:f:1
cell:U41:f:1
cell:V41:f:1
cell:W41:f:1
cell:X41:vtf:t: :ah1:f:1
cell:Y41:f:1
cell:Z41:f:1
cell:AA41:f:1
cell:AB41:f:1
cell:AC41:f:1
cell:AD41:f:1
cell:AE41:f:1
cell:AF41:f:1
cell:AG41:f:1
cell:AH41:vtf:t:e:ah2:f:1
cell:AI41:f:1
cell:AJ41:f:1
cell:AK41:f:1
cell:AL41:f:1
cell:AM41:f:1
cell:AN41:f:1
cell:AO41:vtf:t:g:ah3:f:1
cell:AP41:f:1
cell:AQ41:f:1
cell:AR41:f:1
cell:AS41:f:1
cell:AT41:f:1
cell:AU41:f:1
cell:AV41:f:1
cell:AW41:vtf:t:n:ah4:f:1
cell:AX41:f:1
cell:AY41:f:1
cell:AZ41:f:1
cell:BA41:f:1
cell:BB41:f:1
cell:BC41:f:1
cell:BD41:f:1
cell:BE41:vtf:t:h:ah5:f:1
cell:BF41:f:1
cell:BG41:f:1
cell:BH41:f:1
cell:BI41:f:1
cell:BJ41:f:1
cell:BK41:f:1
cell:BL41:f:1
cell:BM41:f:1
cell:BN41:f:1
cell:BO41:f:1
cell:BP41:f:1
cell:BQ41:f:1
cell:BR41:f:1
cell:BS41:f:1
cell:BT41:f:1
cell:BU41:f:1
cell:BV41:f:1
cell:E42:f:1
cell:F42:f:1
cell:G42:f:1
cell:H42:f:1
cell:I42:f:1
cell:J42:f:1
cell:K42:f:1
cell:L42:f:1
cell:M42:f:1
cell:N42:f:1
cell:O42:f:1
cell:P42:f:1
cell:Q42:f:1
cell:R42:f:1
cell:S42:f:1
cell:T42:f:1
cell:U42:f:1
cell:V42:f:1
cell:W42:f:1
cell:X42:f:1
cell:Y42:vtf:t:t:ai1:f:1
cell:Z42:f:1
cell:AA42:f:1
cell:AB42:f:1
cell:AC42:f:1
cell:AD42:f:1
cell:AE42:f:1
cell:AF42:f:1
cell:AG42:f:1
cell:AH42:vtf:t:l:ai2:f:1
cell:AI42:f:1
cell:AJ42:f:1
cell:AK42:f:1
cell:AL42:f:1
cell:AM42:f:1
cell:AN42:f:1
cell:AO42:f:1
cell:AP42:vtf:t:h:ai3:f:1
cell:AQ42:f:1
cell:AR42:f:1
cell:AS42:f:1
cell:AT42:f:1
cell:AU42:f:1
cell:AV42:f:1
cell:AW42:f:1
cell:AX42:vtf:t:d:ai4:f:1
cell:AY42:f:1
cell:AZ42:f:1
cell:BA42:f:1
cell:BB42:f:1
cell:BC42:f:1
cell:BD42:f:1
cell:BE42:f:1
cell:BF42:vtf:t: :ai5:f:1
cell:BG42:f:1
cell:BH42:f:1
cell:BI42:f:1
cell:BJ42:f:1
cell:BK42:f:1
cell:BL42:f:1
cell:BM42:f:1
cell:BN42:f:1
cell:BO42:f:1
cell:BP42:f:1
cell:BQ42:f:1
cell:BR42:f:1
cell:BS42:f:1
cell:BT42:f:1
cell:BU42:f:1
cell:BV42:f:1
cell:E43:f:1
cell:F43:f:1
cell:G43:f:1
cell:H43:f:1
cell:I43:f:1
cell:J43:f:1
cell:K43:f:1
cell:L43:f:1
cell:M43:f:1
cell:N43:f:1
cell:O43:f:1
cell:P43:f:1
cell:Q43:f:1
cell:R43:f:1
cell:S43:f:1
cell:T43:f:1
cell:U43:f:1
cell:V43:f:1
cell:W43:f:1
cell:X43:f:1
cell:Y43:f:1
cell:Z43:vtf:t:h:aj1:f:1
cell:AA43:f:1
cell:AB43:f:1
cell:AC43:f:1
cell:AD43:f:1
cell:AE43:f:1
cell:AF43:f:1
cell:AG43:f:1
cell:AH43:f:1
cell:AI43:vtf:t:l:aj2:f:1
cell:AJ43:f:1
cell:AK43:f:1
cell:AL43:f:1
cell:AM43:f:1
cell:AN43:f:1
cell:AO43:f:1
cell:AP43:f:1
cell:AQ43:vtf:t: :aj3:f:1
cell:AR43:f:1
cell:AS43:f:1
cell:AT43:f:1
cell:AU43:f:1
cell:AV43:f:1
cell:AW43:f:1
cell:AX43:vtf:t: :aj4:f:1
cell:AY43:f:1
cell:AZ43:f:1
cell:BA43:f:1
cell:BB43:f:1
cell:BC43:f:1
cell:BD43:f:1
cell:BE43:f:1
cell:BF43:vtf:t:h:aj5:f:1
cell:BG43:f:1
cell:BH43:f:1
cell:BI43:f:1
cell:BJ43:f:1
cell:BK43:f:1
cell:BL43:f:1
cell:BM43:f:1
cell:BN43:f:1
cell:BO43:f:1
cell:BP43:f:1
cell:BQ43:f:1
cell:BR43:f:1
cell:BS43:f:1
cell:BT43:f:1
cell:BU43:f:1
cell:BV43:f:1
cell:E44:f:1
cell:F44:f:1
cell:G44:f:1
cell:H44:f:1
cell:I44:f:1
cell:J44:f:1
cell:K44:f:1
cell:L44:f:1
cell:M44:f:1
cell:N44:f:1
cell:O44:f:1
cell:P44:f:1
cell:Q44:f:1
cell:R44:f:1
cell:S44:f:1
cell:T44:f:1
cell:U44:f:1
cell:V44:f:1
cell:W44:f:1
cell:X44:f:1
cell:Y44:f:1
cell:Z44:vtf:t:e:ak1:f:1
cell:AA44:f:1
cell:AB44:f:1
cell:AC44:f:1
cell:AD44:f:1
cell:AE44:f:1
cell:AF44:f:1
cell:AG44:f:1
cell:AH44:f:1
cell:AI44:f:1
cell:AJ44:vtf:t:o:ak2:f:1
cell:AK44:f:1
cell:AL44:f:1
cell:AM44:f:1
cell:AN44:f:1
cell:AO44:f:1
cell:AP44:f:1
cell:AQ44:f:1
cell:AR44:vtf:t:a:ak3:f:1
cell:AS44:f:1
cell:AT44:f:1
cell:AU44:f:1
cell:AV44:f:1
cell:AW44:f:1
cell:AX44:f:1
cell:AY44:vtf:t:d:ak4:f:1
cell:AZ44:f:1
cell:BA44:f:1
cell:BB44:f:1
cell:BC44:f:1
cell:BD44:f:1
cell:BE44:f:1
cell:BF44:f:1
cell:BG44:vtf:t:o:ak5:f:1
cell:BH44:f:1
cell:BI44:f:1
cell:BJ44:f:1
cell:BK44:f:1
cell:BL44:f:1
cell:BM44:f:1
cell:BN44:f:1
cell:BO44:f:1
cell:BP44:f:1
cell:BQ44:f:1
cell:BR44:f:1
cell:BS44:f:1
cell:BT44:f:1
cell:BU44:f:1
cell:BV44:f:1
cell:E45:f:1
cell:F45:f:1
cell:G45:f:1
cell:H45:f:1
cell:I45:f:1
cell:J45:f:1
cell:K45:f:1
cell:L45:f:1
cell:M45:f:1
cell:N45:f:1
cell:O45:f:1
cell:P45:f:1
cell:Q45:f:1
cell:R45:f:1
cell:S45:f:1
cell:T45:f:1
cell:U45:f:1
cell:V45:f:1
cell:W45:f:1
cell:X45:f:1
cell:Y45:f:1
cell:Z45:vtf:t:y:al1:f:1
cell:AA45:f:1
cell:AB45:f:1
cell:AC45:f:1
cell:AD45:f:1
cell:AE45:f:1
cell:AF45:f:1
cell:AG45:f:1
cell:AH45:f:1
cell:AI45:f:1
cell:AJ45:f:1
cell:AK45:vtf:t:u:al2:f:1
cell:AL45:f:1
cell:AM45:f:1
cell:AN45:f:1
cell:AO45:f:1
cell:AP45:f:1
cell:AQ45:f:1
cell:AR45:f:1
cell:AS45:vtf:t: :al3:f:1
cell:AT45:f:1
cell:AU45:f:1
cell:AV45:f:1
cell:AW45:f:1
cell:AX45:f:1
cell:AY45:vtf:t:i:al4:f:1
cell:AZ45:f:1
cell:BA45:f:1
cell:BB45:f:1
cell:BC45:f:1
cell:BD45:f:1
cell:BE45:f:1
cell:BF45:f:1
cell:BG45:vtf:t:l:al5:f:1
cell:BH45:f:1
cell:BI45:f:1
cell:BJ45:f:1
cell:BK45:f:1
cell:BL45:f:1
cell:BM45:f:1
cell:BN45:f:1
cell:BO45:f:1
cell:BP45:f:1
cell:BQ45:f:1
cell:BR45:f:1
cell:BS45:f:1
cell:BT45:f:1
cell:BU45:f:1
cell:BV45:f:1
cell:E46:f:1
cell:F46:f:1
cell:G46:f:1
cell:H46:f:1
cell:I46:f:1
cell:J46:f:1
cell:K46:f:1
cell:L46:f:1
cell:M46:f:1
cell:N46:f:1
cell:O46:f:1
cell:P46:f:1
cell:Q46:f:1
cell:R46:f:1
cell:S46:f:1
cell:T46:f:1
cell:U46:f:1
cell:V46:f:1
cell:W46:f:1
cell:X46:f:1
cell:Y46:f:1
cell:Z46:f:1
cell:AA46:vtf:t: :am1:f:1
cell:AB46:f:1
cell:AC46:f:1
cell:AD46:f:1
cell:AE46:f:1
cell:AF46:f:1
cell:AG46:f:1
cell:AH46:f:1
cell:AI46:f:1
cell:AJ46:f:1
cell:AK46:vtf:t:s:am2:f:1
cell:AL46:f:1
cell:AM46:f:1
cell:AN46:f:1
cell:AO46:f:1
cell:AP46:f:1
cell:AQ46:f:1
cell:AR46:f:1
cell:AS46:vtf:t:w:am3:f:1
cell:AT46:f:1
cell:AU46:f:1
cell:AV46:f:1
cell:AW46:f:1
cell:AX46:f:1
cell:AY46:f:1
cell:AZ46:vtf:t:s:am4:f:1
cell:BA46:f:1
cell:BB46:f:1
cell:BC46:f:1
cell:BD46:f:1
cell:BE46:f:1
cell:BF46:f:1
cell:BG46:f:1
cell:BH46:vtf:t:d:am5:f:1
cell:BI46:f:1
cell:BJ46:f:1
cell:BK46:f:1
cell:BL46:f:1
cell:BM46:f:1
cell:BN46:f:1
cell:BO46:f:1
cell:BP46:f:1
cell:BQ46:f:1
cell:BR46:f:1
cell:BS46:f:1
cell:BT46:f:1
cell:BU46:f:1
cell:BV46:f:1
cell:E47:f:1
cell:F47:f:1
cell:G47:f:1
cell:H47:f:1
cell:I47:f:1
cell:J47:f:1
cell:K47:f:1
cell:L47:f:1
cell:M47:f:1
cell:N47:f:1
cell:O47:f:1
cell:P47:f:1
cell:Q47:f:1
cell:R47:f:1
cell:S47:f:1
cell:T47:f:1
cell:U47:f:1
cell:V47:f:1
cell:W47:f:1
cell:X47:f:1
cell:Y47:f:1
cell:Z47:f:1
cell:AA47:vtf:t:h:an1:f:1
cell:AB47:f:1
cell:AC47:f:1
cell:AD47:f:1
cell:AE47:f:1
cell:AF47:f:1
cell:AG47:f:1
cell:AH47:f:1
cell:AI47:f:1
cell:AJ47:f:1
cell:AK47:f:1
cell:AL47:vtf:t: :an2:f:1
cell:AM47:f:1
cell:AN47:f:1
cell:AO47:f:1
cell:AP47:f:1
cell:AQ47:f:1
cell:AR47:f:1
cell:AS47:f:1
cell:AT47:vtf:t:h:an3:f:1
cell:AU47:f:1
cell:AV47:f:1
cell:AW47:f:1
cell:AX47:f:1
cell:AY47:f:1
cell:AZ47:vtf:t:d:an4:f:1
cell:BA47:f:1
cell:BB47:f:1
cell:BC47:f:1
cell:BD47:f:1
cell:BE47:f:1
cell:BF47:f:1
cell:BG47:f:1
cell:BH47:vtf:t: :an5:f:1
cell:BI47:f:1
cell:BJ47:f:1
cell:BK47:f:1
cell:BL47:f:1
cell:BM47:f:1
cell:BN47:f:1
cell:BO47:f:1
cell:BP47:f:1
cell:BQ47:f:1
cell:BR47:f:1
cell:BS47:f:1
cell:BT47:f:1
cell:BU47:f:1
cell:BV47:f:1
cell:E48:f:1
cell:F48:f:1
cell:G48:f:1
cell:H48:f:1
cell:I48:f:1
cell:J48:f:1
cell:K48:f:1
cell:L48:f:1
cell:M48:f:1
cell:N48:f:1
cell:O48:f:1
cell:P48:f:1
cell:Q48:f:1
cell:R48:f:1
cell:S48:f:1
cell:T48:f:1
cell:U48:f:1
cell:V48:f:1
cell:W48:f:1
cell:X48:f:1
cell:Y48:f:1
cell:Z48:f:1
cell:AA48:f:1
cell:AB48:vtf:t:a:ao1:f:1
cell:AC48:f:1
cell:AD48:f:1
cell:AE48:f:1
cell:AF48:f:1
cell:AG48:f:1
cell:AH48:f:1
cell:AI48:f:1
cell:AJ48:f:1
cell:AK48:f:1
cell:AL48:vtf:t:e:ao2:f:1
cell:AM48:f:1
cell:AN48:f:1
cell:AO48:f:1
cell:AP48:f:1
cell:AQ48:f:1
cell:AR48:f:1
cell:AS48:f:1
cell:AT48:f:1
cell:AU48:vtf:t:o:ao3:f:1
cell:AV48:f:1
cell:AW48:f:1
cell:AX48:f:1
cell:AY48:f:1
cell:AZ48:f:1
cell:BA48:vtf:t:a:ao4:f:1
cell:BB48:f:1
cell:BC48:f:1
cell:BD48:f:1
cell:BE48:f:1
cell:BF48:f:1
cell:BG48:f:1
cell:BH48:f:1
cell:BI48:vtf:t:y:ao5:f:1
cell:BJ48:f:1
cell:BK48:f:1
cell:BL48:f:1
cell:BM48:f:1
cell:BN48:f:1
cell:BO48:f:1
cell:BP48:f:1
cell:BQ48:f:1
cell:BR48:f:1
cell:BS48:f:1
cell:BT48:f:1
cell:BU48:f:1
cell:BV48:f:1
cell:E49:f:1
cell:F49:f:1
cell:G49:f:1
cell:H49:f:1
cell:I49:f:1
cell:J49:f:1
cell:K49:f:1
cell:L49:f:1
cell:M49:f:1
cell:N49:f:1
cell:O49:f:1
cell:P49:f:1
cell:Q49:f:1
cell:R49:f:1
cell:S49:f:1
cell:T49:f:1
cell:U49:f:1
cell:V49:f:1
cell:W49:f:1
cell:X49:f:1
cell:Y49:f:1
cell:Z49:f:1
cell:AA49:f:1
cell:AB49:vtf:t:d:ap1:f:1
cell:AC49:f:1
cell:AD49:f:1
cell:AE49:f:1
cell:AF49:f:1
cell:AG49:f:1
cell:AH49:f:1
cell:AI49:f:1
cell:AJ49:f:1
cell:AK49:f:1
cell:AL49:f:1
cell:AM49:vtf:t:n:ap2:f:1
cell:AN49:f:1
cell:AO49:f:1
cell:AP49:f:1
cell:AQ49:f:1
cell:AR49:f:1
cell:AS49:f:1
cell:AT49:f:1
cell:AU49:f:1
cell:AV49:vtf:t:l:ap3:f:1
cell:AW49:f:1
cell:AX49:f:1
cell:AY49:f:1
cell:AZ49:f:1
cell:BA49:f:1
cell:BB49:vtf:t:i:ap4:f:1
cell:BC49:f:1
cell:BD49:f:1
cell:BE49:f:1
cell:BF49:f:1
cell:BG49:f:1
cell:BH49:f:1
cell:BI49:vtf:t:o:ap5:f:1
cell:BJ49:f:1
cell:BK49:f:1
cell:BL49:f:1
cell:BM49:f:1
cell:BN49:f:1
cell:BO49:f:1
cell:BP49:f:1
cell:BQ49:f:1
cell:BR49:f:1
cell:BS49:f:1
cell:BT49:f:1
cell:BU49:f:1
cell:BV49:f:1
cell:E50:f:1
cell:F50:f:1
cell:G50:f:1
cell:H50:f:1
cell:I50:f:1
cell:J50:f:1
cell:K50:f:1
cell:L50:f:1
cell:M50:f:1
cell:N50:f:1
cell:O50:f:1
cell:P50:f:1
cell:Q50:f:1
cell:R50:f:1
cell:S50:f:1
cell:T50:f:1
cell:U50:f:1
cell:V50:f:1
cell:W50:f:1
cell:X50:f:1
cell:Y50:f:1
cell:Z50:f:1
cell:AA50:f:1
cell:AB50:f:1
cell:AC50:vtf:t: :aq1:f:1
cell:AD50:f:1
cell:AE50:f:1
cell:AF50:f:1
cell:AG50:f:1
cell:AH50:f:1
cell:AI50:f:1
cell:AJ50:f:1
cell:AK50:f:1
cell:AL50:f:1
cell:AM50:vtf:t:c:aq2:f:1
cell:AN50:f:1
cell:AO50:f:1
cell:AP50:f:1
cell:AQ50:f:1
cell:AR50:f:1
cell:AS50:f:1
cell:AT50:f:1
cell:AU50:f:1
cell:AV50:vtf:t:e:aq3:f:1
cell:AW50:f:1
cell:AX50:f:1
cell:AY50:f:1
cell:AZ50:f:1
cell:BA50:f:1
cell:BB50:f:1
cell:BC50:vtf:t:n:aq4:f:1
cell:BD50:f:1
cell:BE50:f:1
cell:BF50:f:1
cell:BG50:f:1
cell:BH50:f:1
cell:BI50:vtf:t:u:aq5:f:1
cell:BJ50:f:1
cell:BK50:f:1
cell:BL50:f:1
cell:BM50:f:1
cell:BN50:f:1
cell:BO50:f:1
cell:BP50:f:1
cell:BQ50:f:1
cell:BR50:f:1
cell:BS50:f:1
cell:BT50:f:1
cell:BU50:f:1
cell:BV50:f:1
cell:E51:f:1
cell:F51:f:1
cell:G51:f:1
cell:H51:f:1
cell:I51:f:1
cell:J51:f:1
cell:K51:f:1
cell:L51:f:1
cell:M51:f:1
cell:N51:f:1
cell:O51:f:1
cell:P51:f:1
cell:Q51:f:1
cell:R51:f:1
cell:S51:f:1
cell:T51:f:1
cell:U51:f:1
cell:V51:f:1
cell:W51:f:1
cell:X51:f:1
cell:Y51:f:1
cell:Z51:f:1
cell:AA51:f:1
cell:AB51:f:1
cell:AC51:f:1
cell:AD51:vtf:t:d:ar1:f:1
cell:AE51:f:1
cell:AF51:f:1
cell:AG51:f:1
cell:AH51:f:1
cell:AI51:f:1
cell:AJ51:f:1
cell:AK51:f:1
cell:AL51:f:1
cell:AM51:f:1
cell:AN51:vtf:t:o:ar2:f:1
cell:AO51:f:1
cell:AP51:f:1
cell:AQ51:f:1
cell:AR51:f:1
cell:AS51:f:1
cell:AT51:f:1
cell:AU51:f:1
cell:AV51:f:1
cell:AW51:vtf:t: :ar3:f:1
cell:AX51:f:1
cell:AY51:f:1
cell:AZ51:f:1
cell:BA51:f:1
cell:BB51:f:1
cell:BC51:f:1
cell:BD51:vtf:t: :ar4:f:1
cell:BE51:f:1
cell:BF51:f:1
cell:BG51:f:1
cell:BH51:f:1
cell:BI51:f:1
cell:BJ51:vtf:t: :ar5:f:1
cell:BK51:f:1
cell:BL51:f:1
cell:BM51:f:1
cell:BN51:f:1
cell:BO51:f:1
cell:BP51:f:1
cell:BQ51:f:1
cell:BR51:f:1
cell:BS51:f:1
cell:BT51:f:1
cell:BU51:f:1
cell:BV51:f:1
cell:E52:f:1
cell:F52:f:1
cell:G52:f:1
cell:H52:f:1
cell:I52:f:1
cell:J52:f:1
cell:K52:f:1
cell:L52:f:1
cell:M52:f:1
cell:N52:f:1
cell:O52:f:1
cell:P52:f:1
cell:Q52:f:1
cell:R52:f:1
cell:S52:f:1
cell:T52:f:1
cell:U52:f:1
cell:V52:f:1
cell:W52:f:1
cell:X52:f:1
cell:Y52:f:1
cell:Z52:f:1
cell:AA52:f:1
cell:AB52:f:1
cell:AC52:f:1
cell:AD52:f:1
cell:AE52:vtf:t:i:as1:f:1
cell:AF52:f:1
cell:AG52:f:1
cell:AH52:f:1
cell:AI52:f:1
cell:AJ52:f:1
cell:AK52:f:1
cell:AL52:f:1
cell:AM52:f:1
cell:AN52:vtf:t:u:as2:f:1
cell:AO52:f:1
cell:AP52:f:1
cell:AQ52:f:1
cell:AR52:f:1
cell:AS52:f:1
cell:AT52:f:1
cell:AU52:f:1
cell:AV52:f:1
cell:AW52:vtf:t:u:as3:f:1
cell:AX52:f:1
cell:AY52:f:1
cell:AZ52:f:1
cell:BA52:f:1
cell:BB52:f:1
cell:BC52:f:1
cell:BD52:f:1
cell:BE52:vtf:t:w:as4:f:1
cell:BF52:f:1
cell:BG52:f:1
cell:BH52:f:1
cell:BI52:f:1
cell:BJ52:vtf:t:a:as5:f:1
cell:BK52:f:1
cell:BL52:f:1
cell:BM52:f:1
cell:BN52:f:1
cell:BO52:f:1
cell:BP52:f:1
cell:BQ52:f:1
cell:BR52:f:1
cell:BS52:f:1
cell:BT52:f:1
cell:BU52:f:1
cell:BV52:f:1
cell:E53:f:1
cell:F53:f:1
cell:G53:f:1
cell:H53:f:1
cell:I53:f:1
cell:J53:f:1
cell:K53:f:1
cell:L53:f:1
cell:M53:f:1
cell:N53:f:1
cell:O53:f:1
cell:P53:f:1
cell:Q53:f:1
cell:R53:f:1
cell:S53:f:1
cell:T53:f:1
cell:U53:f:1
cell:V53:f:1
cell:W53:f:1
cell:X53:f:1
cell:Y53:f:1
cell:Z53:f:1
cell:AA53:f:1
cell:AB53:f:1
cell:AC53:f:1
cell:AD53:f:1
cell:AE53:f:1
cell:AF53:vtf:t:e:at1:f:1
cell:AG53:f:1
cell:AH53:f:1
cell:AI53:f:1
cell:AJ53:f:1
cell:AK53:f:1
cell:AL53:f:1
cell:AM53:f:1
cell:AN53:f:1
cell:AO53:vtf:t:n:at2:f:1
cell:AP53:f:1
cell:AQ53:f:1
cell:AR53:f:1
cell:AS53:f:1
cell:AT53:f:1
cell:AU53:f:1
cell:AV53:f:1
cell:AW53:f:1
cell:AX53:vtf:t:n:at3:f:1
cell:AY53:f:1
cell:AZ53:f:1
cell:BA53:f:1
cell:BB53:f:1
cell:BC53:f:1
cell:BD53:f:1
cell:BE53:f:1
cell:BF53:vtf:t:e:at4:f:1
cell:BG53:f:1
cell:BH53:f:1
cell:BI53:f:1
cell:BJ53:f:1
cell:BK53:vtf:t:b:at5:f:1
cell:BL53:f:1
cell:BM53:f:1
cell:BN53:f:1
cell:BO53:f:1
cell:BP53:f:1
cell:BQ53:f:1
cell:BR53:f:1
cell:BS53:f:1
cell:BT53:f:1
cell:BU53:f:1
cell:BV53:f:1
cell:E54:f:1
cell:F54:f:1
cell:G54:f:1
cell:H54:f:1
cell:I54:f:1
cell:J54:f:1
cell:K54:f:1
cell:L54:f:1
cell:M54:f:1
cell:N54:f:1
cell:O54:f:1
cell:P54:f:1
cell:Q54:f:1
cell:R54:f:1
cell:S54:f:1
cell:T54:f:1
cell:U54:f:1
cell:V54:f:1
cell:W54:f:1
cell:X54:f:1
cell:Y54:f:1
cell:Z54:f:1
cell:AA54:f:1
cell:AB54:f:1
cell:AC54:f:1
cell:AD54:f:1
cell:AE54:f:1
cell:AF54:vtf:t:d:au1:f:1
cell:AG54:f:1
cell:AH54:f:1
cell:AI54:f:1
cell:AJ54:f:1
cell:AK54:f:1
cell:AL54:f:1
cell:AM54:f:1
cell:AN54:f:1
cell:AO54:f:1
cell:AP54:vtf:t:t:au2:f:1
cell:AQ54:f:1
cell:AR54:f:1
cell:AS54:f:1
cell:AT54:f:1
cell:AU54:f:1
cell:AV54:f:1
cell:AW54:f:1
cell:AX54:vtf:t:i:au3:f:1
cell:AY54:f:1
cell:AZ54:f:1
cell:BA54:f:1
cell:BB54:f:1
cell:BC54:f:1
cell:BD54:f:1
cell:BE54:f:1
cell:BF54:vtf:t:e:au4:f:1
cell:BG54:f:1
cell:BH54:f:1
cell:BI54:f:1
cell:BJ54:f:1
cell:BK54:vtf:t:o:au5:f:1
cell:BL54:f:1
cell:BM54:f:1
cell:BN54:f:1
cell:BO54:f:1
cell:BP54:f:1
cell:BQ54:f:1
cell:BR54:f:1
cell:BS54:f:1
cell:BT54:f:1
cell:BU54:f:1
cell:BV54:f:1
cell:E55:f:1
cell:F55:f:1
cell:G55:f:1
cell:H55:f:1
cell:I55:f:1
cell:J55:f:1
cell:K55:f:1
cell:L55:f:1
cell:M55:f:1
cell:N55:f:1
cell:O55:f:1
cell:P55:f:1
cell:Q55:f:1
cell:R55:f:1
cell:S55:f:1
cell:T55:f:1
cell:U55:f:1
cell:V55:f:1
cell:W55:f:1
cell:X55:f:1
cell:Y55:f:1
cell:Z55:f:1
cell:AA55:f:1
cell:AB55:f:1
cell:AC55:f:1
cell:AD55:f:1
cell:AE55:f:1
cell:AF55:f:1
cell:AG55:vtf:t: :av1:f:1
cell:AH55:f:1
cell:AI55:f:1
cell:AJ55:f:1
cell:AK55:f:1
cell:AL55:f:1
cell:AM55:f:1
cell:AN55:f:1
cell:AO55:f:1
cell:AP55:vtf:t:e:av2:f:1
cell:AQ55:f:1
cell:AR55:f:1
cell:AS55:f:1
cell:AT55:f:1
cell:AU55:f:1
cell:AV55:f:1
cell:AW55:f:1
cell:AX55:f:1
cell:AY55:vtf:t:v:av3:f:1
cell:AZ55:f:1
cell:BA55:f:1
cell:BB55:f:1
cell:BC55:f:1
cell:BD55:f:1
cell:BE55:f:1
cell:BF55:f:1
cell:BG55:vtf:t:p:av4:f:1
cell:BH55:f:1
cell:BI55:f:1
cell:BJ55:f:1
cell:BK55:f:1
cell:BL55:vtf:t:v:av5:f:1
cell:BM55:f:1
cell:BN55:f:1
cell:BO55:f:1
cell:BP55:f:1
cell:BQ55:f:1
cell:BR55:f:1
cell:BS55:f:1
cell:BT55:f:1
cell:BU55:f:1
cell:BV55:f:1
cell:E56:f:1
cell:F56:f:1
cell:G56:f:1
cell:H56:f:1
cell:I56:f:1
cell:J56:f:1
cell:K56:f:1
cell:L56:f:1
cell:M56:f:1
cell:N56:f:1
cell:O56:f:1
cell:P56:f:1
cell:Q56:f:1
cell:R56:f:1
cell:S56:f:1
cell:T56:f:1
cell:U56:f:1
cell:V56:f:1
cell:W56:f:1
cell:X56:f:1
cell:Y56:f:1
cell:Z56:f:1
cell:AA56:f:1
cell:AB56:f:1
cell:AC56:f:1
cell:AD56:f:1
cell:AE56:f:1
cell:AF56:f:1
cell:AG56:vtf:t:e:aw1:f:1
cell:AH56:f:1
cell:AI56:f:1
cell:AJ56:f:1
cell:AK56:f:1
cell:AL56:f:1
cell:AM56:f:1
cell:AN56:f:1
cell:AO56:f:1
cell:AP56:f:1
cell:AQ56:vtf:t:r:aw2:f:1
cell:AR56:f:1
cell:AS56:f:1
cell:AT56:f:1
cell:AU56:f:1
cell:AV56:f:1
cell:AW56:f:1
cell:AX56:f:1
cell:AY56:vtf:t:e:aw3:f:1
cell:AZ56:f:1
cell:BA56:f:1
cell:BB56:f:1
cell:BC56:f:1
cell:BD56:f:1
cell:BE56:f:1
cell:BF56:f:1
cell:BG56:vtf:t: :aw4:f:1
cell:BH56:f:1
cell:BI56:f:1
cell:BJ56:f:1
cell:BK56:f:1
cell:BL56:vtf:t:e:aw5:f:1
cell:BM56:f:1
cell:BN56:f:1
cell:BO56:f:1
cell:BP56:f:1
cell:BQ56:f:1
cell:BR56:f:1
cell:BS56:f:1
cell:BT56:f:1
cell:BU56:f:1
cell:BV56:f:1
cell:E57:f:1
cell:F57:f:1
cell:G57:f:1
cell:H57:f:1
cell:I57:f:1
cell:J57:f:1
cell:K57:f:1
cell:L57:f:1
cell:M57:f:1
cell:N57:f:1
cell:O57:f:1
cell:P57:f:1
cell:Q57:f:1
cell:R57:f:1
cell:S57:f:1
cell:T57:f:1
cell:U57:f:1
cell:V57:f:1
cell:W57:f:1
cell:X57:f:1
cell:Y57:f:1
cell:Z57:f:1
cell:AA57:f:1
cell:AB57:f:1
cell:AC57:f:1
cell:AD57:f:1
cell:AE57:f:1
cell:AF57:f:1
cell:AG57:f:1
cell:AH57:vtf:t:v:ax1:f:1
cell:AI57:f:1
cell:AJ57:f:1
cell:AK57:f:1
cell:AL57:f:1
cell:AM57:f:1
cell:AN57:f:1
cell:AO57:f:1
cell:AP57:f:1
cell:AQ57:f:1
cell:AR57:vtf:t:s:ax2:f:1
cell:AS57:f:1
cell:AT57:f:1
cell:AU57:f:1
cell:AV57:f:1
cell:AW57:f:1
cell:AX57:f:1
cell:AY57:f:1
cell:AZ57:vtf:t:r:ax3:f:1
cell:BA57:f:1
cell:BB57:f:1
cell:BC57:f:1
cell:BD57:f:1
cell:BE57:f:1
cell:BF57:f:1
cell:BG57:f:1
cell:BH57:vtf:t:t:ax4:f:1
cell:BI57:f:1
cell:BJ57:f:1
cell:BK57:f:1
cell:BL57:vtf:t: :ax5:f:1
cell:BM57:f:1
cell:BN57:f:1
cell:BO57:f:1
cell:BP57:f:1
cell:BQ57:f:1
cell:BR57:f:1
cell:BS57:f:1
cell:BT57:f:1
cell:BU57:f:1
cell:BV57:f:1
cell:E58:f:1
cell:F58:f:1
cell:G58:f:1
cell:H58:f:1
cell:I58:f:1
cell:J58:f:1
cell:K58:f:1
cell:L58:f:1
cell:M58:f:1
cell:N58:f:1
cell:O58:f:1
cell:P58:f:1
cell:Q58:f:1
cell:R58:f:1
cell:S58:f:1
cell:T58:f:1
cell:U58:f:1
cell:V58:f:1
cell:W58:f:1
cell:X58:f:1
cell:Y58:f:1
cell:Z58:f:1
cell:AA58:f:1
cell:AB58:f:1
cell:AC58:f:1
cell:AD58:f:1
cell:AE58:f:1
cell:AF58:f:1
cell:AG58:f:1
cell:AH58:vtf:t:e:ay1:f:1
cell:AI58:f:1
cell:AJ58:f:1
cell:AK58:f:1
cell:AL58:f:1
cell:AM58:f:1
cell:AN58:f:1
cell:AO58:f:1
cell:AP58:f:1
cell:AQ58:f:1
cell:AR58:f:1
cell:AS58:vtf:t: :ay2:f:1
cell:AT58:f:1
cell:AU58:f:1
cell:AV58:f:1
cell:AW58:f:1
cell:AX58:f:1
cell:AY58:f:1
cell:AZ58:vtf:t:s:ay3:f:1
cell:BA58:f:1
cell:BB58:f:1
cell:BC58:f:1
cell:BD58:f:1
cell:BE58:f:1
cell:BF58:f:1
cell:BG58:f:1
cell:BH58:vtf:t:o:ay4:f:1
cell:BI58:f:1
cell:BJ58:f:1
cell:BK58:f:1
cell:BL58:f:1
cell:BM58:vtf:t:a:ay5:f:1
cell:BN58:f:1
cell:BO58:f:1
cell:BP58:f:1
cell:BQ58:f:1
cell:BR58:f:1
cell:BS58:f:1
cell:BT58:f:1
cell:BU58:f:1
cell:BV58:f:1
cell:E59:f:1
cell:F59:f:1
cell:G59:f:1
cell:H59:f:1
cell:I59:f:1
cell:J59:f:1
cell:K59:f:1
cell:L59:f:1
cell:M59:f:1
cell:N59:f:1
cell:O59:f:1
cell:P59:f:1
cell:Q59:f:1
cell:R59:f:1
cell:S59:f:1
cell:T59:f:1
cell:U59:f:1
cell:V59:f:1
cell:W59:f:1
cell:X59:f:1
cell:Y59:f:1
cell:Z59:f:1
cell:AA59:f:1
cell:AB59:f:1
cell:AC59:f:1
cell:AD59:f:1
cell:AE59:f:1
cell:AF59:f:1
cell:AG59:f:1
cell:AH59:f:1
cell:AI59:vtf:t:n:az1:f:1
cell:AJ59:f:1
cell:AK59:f:1
cell:AL59:f:1
cell:AM59:f:1
cell:AN59:f:1
cell:AO59:f:1
cell:AP59:f:1
cell:AQ59:f:1
cell:AR59:f:1
cell:AS59:f:1
cell:AT59:vtf:t:o:az2:f:1
cell:AU59:f:1
cell:AV59:f:1
cell:AW59:f:1
cell:AX59:f:1
cell:AY59:f:1
cell:AZ59:f:1
cell:BA59:vtf:t:e:az3:f:1
cell:BB59:f:1
cell:BC59:f:1
cell:BD59:f:1
cell:BE59:f:1
cell:BF59:f:1
cell:BG59:f:1
cell:BH59:f:1
cell:BI59:vtf:t: :az4:f:1
cell:BJ59:f:1
cell:BK59:f:1
cell:BL59:f:1
cell:BM59:f:1
cell:BN59:vtf:t:n:az5:f:1
cell:BO59:f:1
cell:BP59:f:1
cell:BQ59:f:1
cell:BR59:f:1
cell:BS59:f:1
cell:BT59:f:1
cell:BU59:f:1
cell:BV59:f:1
cell:E60:f:1
cell:F60:f:1
cell:G60:f:1
cell:H60:f:1
cell:I60:f:1
cell:J60:f:1
cell:K60:f:1
cell:L60:f:1
cell:M60:f:1
cell:N60:f:1
cell:O60:f:1
cell:P60:f:1
cell:Q60:f:1
cell:R60:f:1
cell:S60:f:1
cell:T60:f:1
cell:U60:f:1
cell:V60:f:1
cell:W60:f:1
cell:X60:f:1
cell:Y60:f:1
cell:Z60:f:1
cell:AA60:f:1
cell:AB60:f:1
cell:AC60:f:1
cell:AD60:f:1
cell:AE60:f:1
cell:AF60:f:1
cell:AG60:f:1
cell:AH60:f:1
cell:AI60:f:1
cell:AJ60:vtf:t: :ba1:f:1
cell:AK60:f:1
cell:AL60:f:1
cell:AM60:f:1
cell:AN60:f:1
cell:AO60:f:1
cell:AP60:f:1
cell:AQ60:f:1
cell:AR60:f:1
cell:AS60:f:1
cell:AT60:f:1
cell:AU60:vtf:t:f:ba2:f:1
cell:AV60:f:1
cell:AW60:f:1
cell:AX60:f:1
cell:AY60:f:1
cell:AZ60:f:1
cell:BA60:vtf:t: :ba3:f:1
cell:BB60:f:1
cell:BC60:f:1
cell:BD60:f:1
cell:BE60:f:1
cell:BF60:f:1
cell:BG60:f:1
cell:BH60:f:1
cell:BI60:f:1
cell:BJ60:vtf:t:a:ba4:f:1
cell:BK60:f:1
cell:BL60:f:1
cell:BM60:f:1
cell:BN60:f:1
cell:BO60:vtf:t:d:ba5:f:1
cell:BP60:f:1
cell:BQ60:f:1
cell:BR60:f:1
cell:BS60:f:1
cell:BT60:f:1
cell:BU60:f:1
cell:BV60:f:1
cell:E61:f:1
cell:F61:f:1
cell:G61:f:1
cell:H61:f:1
cell:I61:f:1
cell:J61:f:1
cell:K61:f:1
cell:L61:f:1
cell:M61:f:1
cell:N61:f:1
cell:O61:f:1
cell:P61:f:1
cell:Q61:f:1
cell:R61:f:1
cell:S61:f:1
cell:T61:f:1
cell:U61:f:1
cell:V61:f:1
cell:W61:f:1
cell:X61:f:1
cell:Y61:f:1
cell:Z61:f:1
cell:AA61:f:1
cell:AB61:f:1
cell:AC61:f:1
cell:AD61:f:1
cell:AE61:f:1
cell:AF61:f:1
cell:AG61:f:1
cell:AH61:f:1
cell:AI61:f:1
cell:AJ61:f:1
cell:AK61:vtf:t:i:bb1:f:1
cell:AL61:f:1
cell:AM61:f:1
cell:AN61:f:1
cell:AO61:f:1
cell:AP61:f:1
cell:AQ61:f:1
cell:AR61:f:1
cell:AS61:f:1
cell:AT61:f:1
cell:AU61:vtf:t: :bb2:f:1
cell:AV61:f:1
cell:AW61:f:1
cell:AX61:f:1
cell:AY61:f:1
cell:AZ61:f:1
cell:BA61:f:1
cell:BB61:vtf:t:o:bb3:f:1
cell:BC61:f:1
cell:BD61:f:1
cell:BE61:f:1
cell:BF61:f:1
cell:BG61:f:1
cell:BH61:f:1
cell:BI61:f:1
cell:BJ61:vtf:t:n:bb4:f:1
cell:BK61:f:1
cell:BL61:f:1
cell:BM61:f:1
cell:BN61:f:1
cell:BO61:vtf:t: :bb5:f:1
cell:BP61:f:1
cell:BQ61:f:1
cell:BR61:f:1
cell:BS61:f:1
cell:BT61:f:1
cell:BU61:f:1
cell:BV61:f:1
cell:E62:f:1
cell:F62:f:1
cell:G62:f:1
cell:H62:f:1
cell:I62:f:1
cell:J62:f:1
cell:K62:f:1
cell:L62:f:1
cell:M62:f:1
cell:N62:f:1
cell:O62:f:1
cell:P62:f:1
cell:Q62:f:1
cell:R62:f:1
cell:S62:f:1
cell:T62:f:1
cell:U62:f:1
cell:V62:f:1
cell:W62:f:1
cell:X62:f:1
cell:Y62:f:1
cell:Z62:f:1
cell:AA62:f:1
cell:AB62:f:1
cell:AC62:f:1
cell:AD62:f:1
cell:AE62:f:1
cell:AF62:f:1
cell:AG62:f:1
cell:AH62:f:1
cell:AI62:f:1
cell:AJ62:f:1
cell:AK62:vtf:t:n:bc1:f:1
cell:AL62:f:1
cell:AM62:f:1
cell:AN62:f:1
cell:AO62:f:1
cell:AP62:f:1
cell:AQ62:f:1
cell:AR62:f:1
cell:AS62:f:1
cell:AT62:f:1
cell:AU62:f:1
cell:AV62:vtf:t:m:bc2:f:1
cell:AW62:f:1
cell:AX62:f:1
cell:AY62:f:1
cell:AZ62:f:1
cell:BA62:f:1
cell:BB62:f:1
cell:BC62:vtf:t:f:bc3:f:1
cell:BD62:f:1
cell:BE62:f:1
cell:BF62:f:1
cell:BG62:f:1
cell:BH62:f:1
cell:BI62:f:1
cell:BJ62:f:1
cell:BK62:vtf:t: :bc4:f:1
cell:BL62:f:1
cell:BM62:f:1
cell:BN62:f:1
cell:BO62:f:1
cell:BP62:vtf:t:b:bc5:f:1
cell:BQ62:f:1
cell:BR62:f:1
cell:BS62:f:1
cell:BT62:f:1
cell:BU62:f:1
cell:BV62:f:1
cell:E63:f:1
cell:F63:f:1
cell:G63:f:1
cell:H63:f:1
cell:I63:f:1
cell:J63:f:1
cell:K63:f:1
cell:L63:f:1
cell:M63:f:1
cell:N63:f:1
cell:O63:f:1
cell:P63:f:1
cell:Q63:f:1
cell:R63:f:1
cell:S63:f:1
cell:T63:f:1
cell:U63:f:1
cell:V63:f:1
cell:W63:f:1
cell:X63:f:1
cell:Y63:f:1
cell:Z63:f:1
cell:AA63:f:1
cell:AB63:f:1
cell:AC63:f:1
cell:AD63:f:1
cell:AE63:f:1
cell:AF63:f:1
cell:AG63:f:1
cell:AH63:f:1
cell:AI63:f:1
cell:AJ63:f:1
cell:AK63:f:1
cell:AL63:vtf:t: :bd1:f:1
cell:AM63:f:1
cell:AN63:f:1
cell:AO63:f:1
cell:AP63:f:1
cell:AQ63:f:1
cell:AR63:f:1
cell:AS63:f:1
cell:AT63:f:1
cell:AU63:f:1
cell:AV63:f:1
cell:AW63:vtf:t:y:bd2:f:1
cell:AX63:f:1
cell:AY63:f:1
cell:AZ63:f:1
cell:BA63:f:1
cell:BB63:f:1
cell:BC63:f:1
cell:BD63:vtf:t: :bd3:f:1
cell:BE63:f:1
cell:BF63:f:1
cell:BG63:f:1
cell:BH63:f:1
cell:BI63:f:1
cell:BJ63:f:1
cell:BK63:f:1
cell:BL63:vtf:t:a:bd4:f:1
cell:BM63:f:1
cell:BN63:f:1
cell:BO63:f:1
cell:BP63:f:1
cell:BQ63:vtf:t:e:bd5:f:1
cell:BR63:f:1
cell:BS63:f:1
cell:BT63:f:1
cell:BU63:f:1
cell:BV63:f:1
cell:E64:f:1
cell:F64:f:1
cell:G64:f:1
cell:H64:f:1
cell:I64:f:1
cell:J64:f:1
cell:K64:f:1
cell:L64:f:1
cell:M64:f:1
cell:N64:f:1
cell:O64:f:1
cell:P64:f:1
cell:Q64:f:1
cell:R64:f:1
cell:S64:f:1
cell:T64:f:1
cell:U64:f:1
cell:V64:f:1
cell:W64:f:1
cell:X64:f:1
cell:Y64:f:1
cell:Z64:f:1
cell:AA64:f:1
cell:AB64:f:1
cell:AC64:f:1
cell:AD64:f:1
cell:AE64:f:1
cell:AF64:f:1
cell:AG64:f:1
cell:AH64:f:1
cell:AI64:f:1
cell:AJ64:f:1
cell:AK64:f:1
cell:AL64:f:1
cell:AM64:vtf:t:m:be1:f:1
cell:AN64:f:1
cell:AO64:f:1
cell:AP64:f:1
cell:AQ64:f:1
cell:AR64:f:1
cell:AS64:f:1
cell:AT64:f:1
cell:AU64:f:1
cell:AV64:f:1
cell:AW64:f:1
cell:AX64:vtf:t: :be2:f:1
cell:AY64:f:1
cell:AZ64:f:1
cell:BA64:f:1
cell:BB64:f:1
cell:BC64:f:1
cell:BD64:f:1
cell:BE64:vtf:t:a:be3:f:1
cell:BF64:f:1
cell:BG64:f:1
cell:BH64:f:1
cell:BI64:f:1
cell:BJ64:f:1
cell:BK64:f:1
cell:BL64:f:1
cell:BM64:vtf:t:n:be4:f:1
cell:BN64:f:1
cell:BO64:f:1
cell:BP64:f:1
cell:BQ64:vtf:t:l:be5:f:1
cell:BR64:f:1
cell:BS64:f:1
cell:BT64:f:1
cell:BU64:f:1
cell:BV64:f:1
cell:E65:f:1
cell:F65:f:1
cell:G65:f:1
cell:H65:f:1
cell:I65:f:1
cell:J65:f:1
cell:K65:f:1
cell:L65:f:1
cell:M65:f:1
cell:N65:f:1
cell:O65:f:1
cell:P65:f:1
cell:Q65:f:1
cell:R65:f:1
cell:S65:f:1
cell:T65:f:1
cell:U65:f:1
cell:V65:f:1
cell:W65:f:1
cell:X65:f:1
cell:Y65:f:1
cell:Z65:f:1
cell:AA65:f:1
cell:AB65:f:1
cell:AC65:f:1
cell:AD65:f:1
cell:AE65:f:1
cell:AF65:f:1
cell:AG65:f:1
cell:AH65:f:1
cell:AI65:f:1
cell:AJ65:f:1
cell:AK65:f:1
cell:AL65:f:1
cell:AM65:vtf:t:e:bf1:f:1
cell:AN65:f:1
cell:AO65:f:1
cell:AP65:f:1
cell:AQ65:f:1
cell:AR65:f:1
cell:AS65:f:1
cell:AT65:f:1
cell:AU65:f:1
cell:AV65:f:1
cell:AW65:f:1
cell:AX65:vtf:t:l:bf2:f:1
cell:AY65:f:1
cell:AZ65:f:1
cell:BA65:f:1
cell:BB65:f:1
cell:BC65:f:1
cell:BD65:f:1
cell:BE65:vtf:t:u:bf3:f:1
cell:BF65:f:1
cell:BG65:f:1
cell:BH65:f:1
cell:BI65:f:1
cell:BJ65:f:1
cell:BK65:f:1
cell:BL65:f:1
cell:BM65:vtf:t:c:bf4:f:1
cell:BN65:f:1
cell:BO65:f:1
cell:BP65:f:1
cell:BQ65:f:1
cell:BR65:vtf:t:o:bf5:f:1
cell:BS65:f:1
cell:BT65:f:1
cell:BU65:f:1
cell:BV65:f:1
cell:E66:f:1
cell:F66:f:1
cell:G66:f:1
cell:H66:f:1
cell:I66:f:1
cell:J66:f:1
cell:K66:f:1
cell:L66:f:1
cell:M66:f:1
cell:N66:f:1
cell:O66:f:1
cell:P66:f:1
cell:Q66:f:1
cell:R66:f:1
cell:S66:f:1
cell:T66:f:1
cell:U66:f:1
cell:V66:f:1
cell:W66:f:1
cell:X66:f:1
cell:Y66:f:1
cell:Z66:f:1
cell:AA66:f:1
cell:AB66:f:1
cell:AC66:f:1
cell:AD66:f:1
cell:AE66:f:1
cell:AF66:f:1
cell:AG66:f:1
cell:AH66:f:1
cell:AI66:f:1
cell:AJ66:f:1
cell:AK66:f:1
cell:AL66:f:1
cell:AM66:f:1
cell:AN66:vtf:t:m:bg1:f:1
cell:AO66:f:1
cell:AP66:f:1
cell:AQ66:f:1
cell:AR66:f:1
cell:AS66:f:1
cell:AT66:f:1
cell:AU66:f:1
cell:AV66:f:1
cell:AW66:f:1
cell:AX66:f:1
cell:AY66:vtf:t:i:bg2:f:1
cell:AZ66:f:1
cell:BA66:f:1
cell:BB66:f:1
cell:BC66:f:1
cell:BD66:f:1
cell:BE66:f:1
cell:BF66:vtf:t:r:bg3:f:1
cell:BG66:f:1
cell:BH66:f:1
cell:BI66:f:1
cell:BJ66:f:1
cell:BK66:f:1
cell:BL66:f:1
cell:BM66:f:1
cell:BN66:vtf:t:i:bg4:f:1
cell:BO66:f:1
cell:BP66:f:1
cell:BQ66:f:1
cell:BR66:f:1
cell:BS66:vtf:t:w:bg5:f:1
cell:BT66:f:1
cell:BU66:f:1
cell:BV66:f:1
cell:E67:f:1
cell:F67:f:1
cell:G67:f:1
cell:H67:f:1
cell:I67:f:1
cell:J67:f:1
cell:K67:f:1
cell:L67:f:1
cell:M67:f:1
cell:N67:f:1
cell:O67:f:1
cell:P67:f:1
cell:Q67:f:1
cell:R67:f:1
cell:S67:f:1
cell:T67:f:1
cell:U67:f:1
cell:V67:f:1
cell:W67:f:1
cell:X67:f:1
cell:Y67:f:1
cell:Z67:f:1
cell:AA67:f:1
cell:AB67:f:1
cell:AC67:f:1
cell:AD67:f:1
cell:AE67:f:1
cell:AF67:f:1
cell:AG67:f:1
cell:AH67:f:1
cell:AI67:f:1
cell:AJ67:f:1
cell:AK67:f:1
cell:AL67:f:1
cell:AM67:f:1
cell:AN67:vtf:t:o:bh1:f:1
cell:AO67:f:1
cell:AP67:f:1
cell:AQ67:f:1
cell:AR67:f:1
cell:AS67:f:1
cell:AT67:f:1
cell:AU67:f:1
cell:AV67:f:1
cell:AW67:f:1
cell:AX67:f:1
cell:AY67:f:1
cell:AZ67:vtf:t:f:bh2:f:1
cell:BA67:f:1
cell:BB67:f:1
cell:BC67:f:1
cell:BD67:f:1
cell:BE67:f:1
cell:BF67:f:1
cell:BG67:vtf:t:i:bh3:f:1
cell:BH67:f:1
cell:BI67:f:1
cell:BJ67:f:1
cell:BK67:f:1
cell:BL67:f:1
cell:BM67:f:1
cell:BN67:f:1
cell:BO67:vtf:t:e:bh4:f:1
cell:BP67:f:1
cell:BQ67:f:1
cell:BR67:f:1
cell:BS67:f:1
cell:BT67:f:1
cell:BU67:f:1
cell:BV67:f:1
cell:E68:f:1
cell:F68:f:1
cell:G68:f:1
cell:H68:f:1
cell:I68:f:1
cell:J68:f:1
cell:K68:f:1
cell:L68:f:1
cell:M68:f:1
cell:N68:f:1
cell:O68:f:1
cell:P68:f:1
cell:Q68:f:1
cell:R68:f:1
cell:S68:f:1
cell:T68:f:1
cell:U68:f:1
cell:V68:f:1
cell:W68:f:1
cell:X68:f:1
cell:Y68:f:1
cell:Z68:f:1
cell:AA68:f:1
cell:AB68:f:1
cell:AC68:f:1
cell:AD68:f:1
cell:AE68:f:1
cell:AF68:f:1
cell:AG68:f:1
cell:AH68:f:1
cell:AI68:f:1
cell:AJ68:f:1
cell:AK68:f:1
cell:AL68:f:1
cell:AM68:f:1
cell:AN68:f:1
cell:AO68:vtf:t:r:bi1:f:1
cell:AP68:f:1
cell:AQ68:f:1
cell:AR68:f:1
cell:AS68:f:1
cell:AT68:f:1
cell:AU68:f:1
cell:AV68:f:1
cell:AW68:f:1
cell:AX68:f:1
cell:AY68:f:1
cell:AZ68:f:1
cell:BA68:vtf:t:e:bi2:f:1
cell:BB68:f:1
cell:BC68:f:1
cell:BD68:f:1
cell:BE68:f:1
cell:BF68:f:1
cell:BG68:f:1
cell:BH68:vtf:t:c:bi3:f:1
cell:BI68:f:1
cell:BJ68:f:1
cell:BK68:f:1
cell:BL68:f:1
cell:BM68:f:1
cell:BN68:f:1
cell:BO68:vtf:t:n:bi4:f:1
cell:BP68:f:1
cell:BQ68:f:1
cell:BR68:f:1
cell:BS68:f:1
cell:BT68:f:1
cell:BU68:f:1
cell:BV68:f:1
cell:E69:f:1
cell:F69:f:1
cell:G69:f:1
cell:H69:f:1
cell:I69:f:1
cell:J69:f:1
cell:K69:f:1
cell:L69:f:1
cell:M69:f:1
cell:N69:f:1
cell:O69:f:1
cell:P69:f:1
cell:Q69:f:1
cell:R69:f:1
cell:S69:f:1
cell:T69:f:1
cell:U69:f:1
cell:V69:f:1
cell:W69:f:1
cell:X69:f:1
cell:Y69:f:1
cell:Z69:f:1
cell:AA69:f:1
cell:AB69:f:1
cell:AC69:f:1
cell:AD69:f:1
cell:AE69:f:1
cell:AF69:f:1
cell:AG69:f:1
cell:AH69:f:1
cell:AI69:f:1
cell:AJ69:f:1
cell:AK69:f:1
cell:AL69:f:1
cell:AM69:f:1
cell:AN69:f:1
cell:AO69:vtf:t:y:bj1:f:1
cell:AP69:f:1
cell:AQ69:f:1
cell:AR69:f:1
cell:AS69:f:1
cell:AT69:f:1
cell:AU69:f:1
cell:AV69:f:1
cell:AW69:f:1
cell:AX69:f:1
cell:AY69:f:1
cell:AZ69:f:1
cell:BA69:f:1
cell:BB69:vtf:t: :bj2:f:1
cell:BC69:f:1
cell:BD69:f:1
cell:BE69:f:1
cell:BF69:f:1
cell:BG69:f:1
cell:BH69:vtf:t:u:bj3:f:1
cell:BI69:f:1
cell:BJ69:f:1
cell:BK69:f:1
cell:BL69:f:1
cell:BM69:f:1
cell:BN69:f:1
cell:BO69:f:1
cell:BP69:vtf:t:t:bj4:f:1
cell:BQ69:f:1
cell:BR69:f:1
cell:BS69:f:1
cell:BT69:f:1
cell:BU69:f:1
cell:BV69:f:1
cell:E70:f:1
cell:F70:f:1
cell:G70:f:1
cell:H70:f:1
cell:I70:f:1
cell:J70:f:1
cell:K70:f:1
cell:L70:f:1
cell:M70:f:1
cell:N70:f:1
cell:O70:f:1
cell:P70:f:1
cell:Q70:f:1
cell:R70:f:1
cell:S70:f:1
cell:T70:f:1
cell:U70:f:1
cell:V70:f:1
cell:W70:f:1
cell:X70:f:1
cell:Y70:f:1
cell:Z70:f:1
cell:AA70:f:1
cell:AB70:f:1
cell:AC70:f:1
cell:AD70:f:1
cell:AE70:f:1
cell:AF70:f:1
cell:AG70:f:1
cell:AH70:f:1
cell:AI70:f:1
cell:AJ70:f:1
cell:AK70:f:1
cell:AL70:f:1
cell:AM70:f:1
cell:AN70:f:1
cell:AO70:f:1
cell:AP70:vtf:t: :bk1:f:1
cell:AQ70:f:1
cell:AR70:f:1
cell:AS70:f:1
cell:AT70:f:1
cell:AU70:f:1
cell:AV70:f:1
cell:AW70:f:1
cell:AX70:f:1
cell:AY70:f:1
cell:AZ70:f:1
cell:BA70:f:1
cell:BB70:vtf:t:O:bk2:f:1
cell:BC70:f:1
cell:BD70:f:1
cell:BE70:f:1
cell:BF70:f:1
cell:BG70:f:1
cell:BH70:f:1
cell:BI70:vtf:t:l:bk3:f:1
cell:BJ70:f:1
cell:BK70:f:1
cell:BL70:f:1
cell:BM70:f:1
cell:BN70:f:1
cell:BO70:f:1
cell:BP70:f:1
cell:BQ70:vtf:t: :bk4:f:1
cell:BR70:f:1
cell:BS70:f:1
cell:BT70:f:1
cell:BU70:f:1
cell:BV70:f:1
cell:E71:f:1
cell:F71:f:1
cell:G71:f:1
cell:H71:f:1
cell:I71:f:1
cell:J71:f:1
cell:K71:f:1
cell:L71:f:1
cell:M71:f:1
cell:N71:f:1
cell:O71:f:1
cell:P71:f:1
cell:Q71:f:1
cell:R71:f:1
cell:S71:f:1
cell:T71:f:1
cell:U71:f:1
cell:V71:f:1
cell:W71:f:1
cell:X71:f:1
cell:Y71:f:1
cell:Z71:f:1
cell:AA71:f:1
cell:AB71:f:1
cell:AC71:f:1
cell:AD71:f:1
cell:AE71:f:1
cell:AF71:f:1
cell:AG71:f:1
cell:AH71:f:1
cell:AI71:f:1
cell:AJ71:f:1
cell:AK71:f:1
cell:AL71:f:1
cell:AM71:f:1
cell:AN71:f:1
cell:AO71:f:1
cell:AP71:vtf:t: :bl1:f:1
cell:AQ71:f:1
cell:AR71:f:1
cell:AS71:f:1
cell:AT71:f:1
cell:AU71:f:1
cell:AV71:f:1
cell:AW71:f:1
cell:AX71:f:1
cell:AY71:f:1
cell:AZ71:f:1
cell:BA71:f:1
cell:BB71:f:1
cell:BC71:vtf:t: :bl2:f:1
cell:BD71:f:1
cell:BE71:f:1
cell:BF71:f:1
cell:BG71:f:1
cell:BH71:f:1
cell:BI71:f:1
cell:BJ71:vtf:t:a:bl3:f:1
cell:BK71:f:1
cell:BL71:f:1
cell:BM71:f:1
cell:BN71:f:1
cell:BO71:f:1
cell:BP71:f:1
cell:BQ71:vtf:t:m:bl4:f:1
cell:BR71:f:1
cell:BS71:f:1
cell:BT71:f:1
cell:BU71:f:1
cell:BV71:f:1
cell:E72:f:1
cell:F72:f:1
cell:G72:f:1
cell:H72:f:1
cell:I72:f:1
cell:J72:f:1
cell:K72:f:1
cell:L72:f:1
cell:M72:f:1
cell:N72:f:1
cell:O72:f:1
cell:P72:f:1
cell:Q72:f:1
cell:R72:f:1
cell:S72:f:1
cell:T72:f:1
cell:U72:f:1
cell:V72:f:1
cell:W72:f:1
cell:X72:f:1
cell:Y72:f:1
cell:Z72:f:1
cell:AA72:f:1
cell:AB72:f:1
cell:AC72:f:1
cell:AD72:f:1
cell:AE72:f:1
cell:AF72:f:1
cell:AG72:f:1
cell:AH72:f:1
cell:AI72:f:1
cell:AJ72:f:1
cell:AK72:f:1
cell:AL72:f:1
cell:AM72:f:1
cell:AN72:f:1
cell:AO72:f:1
cell:AP72:f:1
cell:AQ72:vtf:t: :bm1:f:1
cell:AR72:f:1
cell:AS72:f:1
cell:AT72:f:1
cell:AU72:f:1
cell:AV72:f:1
cell:AW72:f:1
cell:AX72:f:1
cell:AY72:f:1
cell:AZ72:f:1
cell:BA72:f:1
cell:BB72:f:1
cell:BC72:vtf:t:l:bm2:f:1
cell:BD72:f:1
cell:BE72:f:1
cell:BF72:f:1
cell:BG72:f:1
cell:BH72:f:1
cell:BI72:f:1
cell:BJ72:f:1
cell:BK72:vtf:t:r:bm3:f:1
cell:BL72:f:1
cell:BM72:f:1
cell:BN72:f:1
cell:BO72:f:1
cell:BP72:f:1
cell:BQ72:f:1
cell:BR72:vtf:t:u:bm4:f:1
cell:BS72:f:1
cell:BT72:f:1
cell:BU72:f:1
cell:BV72:f:1
cell:E73:f:1
cell:F73:f:1
cell:G73:f:1
cell:H73:f:1
cell:I73:f:1
cell:J73:f:1
cell:K73:f:1
cell:L73:f:1
cell:M73:f:1
cell:N73:f:1
cell:O73:f:1
cell:P73:f:1
cell:Q73:f:1
cell:R73:f:1
cell:S73:f:1
cell:T73:f:1
cell:U73:f:1
cell:V73:f:1
cell:W73:f:1
cell:X73:f:1
cell:Y73:f:1
cell:Z73:f:1
cell:AA73:f:1
cell:AB73:f:1
cell:AC73:f:1
cell:AD73:f:1
cell:AE73:f:1
cell:AF73:f:1
cell:AG73:f:1
cell:AH73:f:1
cell:AI73:f:1
cell:AJ73:f:1
cell:AK73:f:1
cell:AL73:f:1
cell:AM73:f:1
cell:AN73:f:1
cell:AO73:f:1
cell:AP73:f:1
cell:AQ73:vtf:t: :bn1:f:1
cell:AR73:f:1
cell:AS73:f:1
cell:AT73:f:1
cell:AU73:f:1
cell:AV73:f:1
cell:AW73:f:1
cell:AX73:f:1
cell:AY73:f:1
cell:AZ73:f:1
cell:BA73:f:1
cell:BB73:f:1
cell:BC73:vtf:t:i:bn2:f:1
cell:BD73:f:1
cell:BE73:f:1
cell:BF73:f:1
cell:BG73:f:1
cell:BH73:f:1
cell:BI73:f:1
cell:BJ73:f:1
cell:BK73:vtf:t: :bn3:f:1
cell:BL73:f:1
cell:BM73:f:1
cell:BN73:f:1
cell:BO73:f:1
cell:BP73:f:1
cell:BQ73:f:1
cell:BR73:f:1
cell:BS73:vtf:t:s:bn4:f:1
cell:BT73:f:1
cell:BU73:f:1
cell:BV73:f:1
cell:E74:f:1
cell:F74:f:1
cell:G74:f:1
cell:H74:f:1
cell:I74:f:1
cell:J74:f:1
cell:K74:f:1
cell:L74:f:1
cell:M74:f:1
cell:N74:f:1
cell:O74:f:1
cell:P74:f:1
cell:Q74:f:1
cell:R74:f:1
cell:S74:f:1
cell:T74:f:1
cell:U74:f:1
cell:V74:f:1
cell:W74:f:1
cell:X74:f:1
cell:Y74:f:1
cell:Z74:f:1
cell:AA74:f:1
cell:AB74:f:1
cell:AC74:f:1
cell:AD74:f:1
cell:AE74:f:1
cell:AF74:f:1
cell:AG74:f:1
cell:AH74:f:1
cell:AI74:f:1
cell:AJ74:f:1
cell:AK74:f:1
cell:AL74:f:1
cell:AM74:f:1
cell:AN74:f:1
cell:AO74:f:1
cell:AP74:f:1
cell:AQ74:f:1
cell:AR74:vtf:t: :bo1:f:1
cell:AS74:f:1
cell:AT74:f:1
cell:AU74:f:1
cell:AV74:f:1
cell:AW74:f:1
cell:AX74:f:1
cell:AY74:f:1
cell:AZ74:f:1
cell:BA74:f:1
cell:BB74:f:1
cell:BC74:vtf:t:t:bo2:f:1
cell:BD74:f:1
cell:BE74:f:1
cell:BF74:f:1
cell:BG74:f:1
cell:BH74:f:1
cell:BI74:f:1
cell:BJ74:f:1
cell:BK74:f:1
cell:BL74:vtf:t:c:bo3:f:1
cell:BM74:f:1
cell:BN74:f:1
cell:BO74:f:1
cell:BP74:f:1
cell:BQ74:f:1
cell:BR74:f:1
cell:BS74:f:1
cell:BT74:vtf:t:i:bo4:f:1
cell:BU74:f:1
cell:BV74:f:1
cell:E75:f:1
cell:F75:f:1
cell:G75:f:1
cell:H75:f:1
cell:I75:f:1
cell:J75:f:1
cell:K75:f:1
cell:L75:f:1
cell:M75:f:1
cell:N75:f:1
cell:O75:f:1
cell:P75:f:1
cell:Q75:f:1
cell:R75:f:1
cell:S75:f:1
cell:T75:f:1
cell:U75:f:1
cell:V75:f:1
cell:W75:f:1
cell:X75:f:1
cell:Y75:f:1
cell:Z75:f:1
cell:AA75:f:1
cell:AB75:f:1
cell:AC75:f:1
cell:AD75:f:1
cell:AE75:f:1
cell:AF75:f:1
cell:AG75:f:1
cell:AH75:f:1
cell:AI75:f:1
cell:AJ75:f:1
cell:AK75:f:1
cell:AL75:f:1
cell:AM75:f:1
cell:AN75:f:1
cell:AO75:f:1
cell:AP75:f:1
cell:AQ75:f:1
cell:AR75:vtf:t: :bp1:f:1
cell:AS75:f:1
cell:AT75:f:1
cell:AU75:f:1
cell:AV75:f:1
cell:AW75:f:1
cell:AX75:f:1
cell:AY75:f:1
cell:AZ75:f:1
cell:BA75:f:1
cell:BB75:f:1
cell:BC75:f:1
cell:BD75:vtf:t:t:bp2:f:1
cell:BE75:f:1
cell:BF75:f:1
cell:BG75:f:1
cell:BH75:f:1
cell:BI75:f:1
cell:BJ75:f:1
cell:BK75:f:1
cell:BL75:f:1
cell:BM75:vtf:t:i:bp3:f:1
cell:BN75:f:1
cell:BO75:f:1
cell:BP75:f:1
cell:BQ75:f:1
cell:BR75:f:1
cell:BS75:f:1
cell:BT75:vtf:t:c:bp4:f:1
cell:BU75:f:1
cell:BV75:f:1
cell:E76:f:1
cell:F76:f:1
cell:G76:f:1
cell:H76:f:1
cell:I76:f:1
cell:J76:f:1
cell:K76:f:1
cell:L76:f:1
cell:M76:f:1
cell:N76:f:1
cell:O76:f:1
cell:P76:f:1
cell:Q76:f:1
cell:R76:f:1
cell:S76:f:1
cell:T76:f:1
cell:U76:f:1
cell:V76:f:1
cell:W76:f:1
cell:X76:f:1
cell:Y76:f:1
cell:Z76:f:1
cell:AA76:f:1
cell:AB76:f:1
cell:AC76:f:1
cell:AD76:f:1
cell:AE76:f:1
cell:AF76:f:1
cell:AG76:f:1
cell:AH76:f:1
cell:AI76:f:1
cell:AJ76:f:1
cell:AK76:f:1
cell:AL76:f:1
cell:AM76:f:1
cell:AN76:f:1
cell:AO76:f:1
cell:AP76:f:1
cell:AQ76:f:1
cell:AR76:f:1
cell:AS76:vtf:t: :bq1:f:1
cell:AT76:f:1
cell:AU76:f:1
cell:AV76:f:1
cell:AW76:f:1
cell:AX76:f:1
cell:AY76:f:1
cell:AZ76:f:1
cell:BA76:f:1
cell:BB76:f:1
cell:BC76:f:1
cell:BD76:f:1
cell:BE76:vtf:t:l:bq2:f:1
cell:BF76:f:1
cell:BG76:f:1
cell:BH76:f:1
cell:BI76:f:1
cell:BJ76:f:1
cell:BK76:f:1
cell:BL76:f:1
cell:BM76:f:1
cell:BN76:vtf:t:t:bq3:f:1
cell:BO76:f:1
cell:BP76:f:1
cell:BQ76:f:1
cell:BR76:f:1
cell:BS76:f:1
cell:BT76:f:1
cell:BU76:vtf:t: :bq4:f:1
cell:BV76:f:1
cell:E77:f:1
cell:F77:f:1
cell:G77:f:1
cell:H77:f:1
cell:I77:f:1
cell:J77:f:1
cell:K77:f:1
cell:L77:f:1
cell:M77:f:1
cell:N77:f:1
cell:O77:f:1
cell:P77:f:1
cell:Q77:f:1
cell:R77:f:1
cell:S77:f:1
cell:T77:f:1
cell:U77:f:1
cell:V77:f:1
cell:W77:f:1
cell:X77:f:1
cell:Y77:f:1
cell:Z77:f:1
cell:AA77:f:1
cell:AB77:f:1
cell:AC77:f:1
cell:AD77:f:1
cell:AE77:f:1
cell:AF77:f:1
cell:AG77:f:1
cell:AH77:f:1
cell:AI77:f:1
cell:AJ77:f:1
cell:AK77:f:1
cell:AL77:f:1
cell:AM77:f:1
cell:AN77:f:1
cell:AO77:f:1
cell:AP77:f:1
cell:AQ77:f:1
cell:AR77:f:1
cell:AS77:vtf:t: :br1:f:1
cell:AT77:f:1
cell:AU77:f:1
cell:AV77:f:1
cell:AW77:f:1
cell:AX77:f:1
cell:AY77:f:1
cell:AZ77:f:1
cell:BA77:f:1
cell:BB77:f:1
cell:BC77:f:1
cell:BD77:f:1
cell:BE77:f:1
cell:BF77:vtf:t:e:br2:f:1
cell:BG77:f:1
cell:BH77:f:1
cell:BI77:f:1
cell:BJ77:f:1
cell:BK77:f:1
cell:BL77:f:1
cell:BM77:f:1
cell:BN77:vtf:t:i:br3:f:1
cell:BO77:f:1
cell:BP77:f:1
cell:BQ77:f:1
cell:BR77:f:1
cell:BS77:f:1
cell:BT77:f:1
cell:BU77:f:1
cell:BV77:vtf:t: :br4:f:1
cell:E78:f:1
cell:F78:f:1
cell:G78:f:1
cell:H78:f:1
cell:I78:f:1
cell:J78:f:1
cell:K78:f:1
cell:L78:f:1
cell:M78:f:1
cell:N78:f:1
cell:O78:f:1
cell:P78:f:1
cell:Q78:f:1
cell:R78:f:1
cell:S78:f:1
cell:T78:f:1
cell:U78:f:1
cell:V78:f:1
cell:W78:f:1
cell:X78:f:1
cell:Y78:f:1
cell:Z78:f:1
cell:AA78:f:1
cell:AB78:f:1
cell:AC78:f:1
cell:AD78:f:1
cell:AE78:f:1
cell:AF78:f:1
cell:AG78:f:1
cell:AH78:f:1
cell:AI78:f:1
cell:AJ78:f:1
cell:AK78:f:1
cell:AL78:f:1
cell:AM78:f:1
cell:AN78:f:1
cell:AO78:f:1
cell:AP78:f:1
cell:AQ78:f:1
cell:AR78:f:1
cell:AS78:f:1
cell:AT78:vtf:t: :bs1:f:1
cell:AU78:f:1
cell:AV78:f:1
cell:AW78:f:1
cell:AX78:f:1
cell:AY78:f:1
cell:AZ78:f:1
cell:BA78:f:1
cell:BB78:f:1
cell:BC78:f:1
cell:BD78:f:1
cell:BE78:f:1
cell:BF78:f:1
cell:BG78:vtf:t: :bs2:f:1
cell:BH78:f:1
cell:BI78:f:1
cell:BJ78:f:1
cell:BK78:f:1
cell:BL78:f:1
cell:BM78:f:1
cell:BN78:f:1
cell:BO78:vtf:t:e:bs3:f:1
cell:BP78:f:1
cell:BQ78:f:1
cell:BR78:f:1
cell:BS78:f:1
cell:BT78:f:1
cell:BU78:f:1
cell:BV78:vtf:t: :bs4:f:1
cell:E79:f:1
cell:F79:f:1
cell:G79:f:1
cell:H79:f:1
cell:I79:f:1
cell:J79:f:1
cell:K79:f:1
cell:L79:f:1
cell:M79:f:1
cell:N79:f:1
cell:O79:f:1
cell:P79:f:1
cell:Q79:f:1
cell:R79:f:1
cell:S79:f:1
cell:T79:f:1
cell:U79:f:1
cell:V79:f:1
cell:W79:f:1
cell:X79:f:1
cell:Y79:f:1
cell:Z79:f:1
cell:AA79:f:1
cell:AB79:f:1
cell:AC79:f:1
cell:AD79:f:1
cell:AE79:f:1
cell:AF79:f:1
cell:AG79:f:1
cell:AH79:f:1
cell:AI79:f:1
cell:AJ79:f:1
cell:AK79:f:1
cell:AL79:f:1
cell:AM79:f:1
cell:AN79:f:1
cell:AO79:f:1
cell:AP79:f:1
cell:AQ79:f:1
cell:AR79:f:1
cell:AS79:f:1
cell:AT79:vtf:t: :bt1:f:1
cell:AU79:f:1
cell:AV79:f:1
cell:AW79:f:1
cell:AX79:f:1
cell:AY79:f:1
cell:AZ79:f:1
cell:BA79:f:1
cell:BB79:f:1
cell:BC79:f:1
cell:BD79:f:1
cell:BE79:f:1
cell:BF79:f:1
cell:BG79:vtf:t:d:bt2:f:1
cell:BH79:f:1
cell:BI79:f:1
cell:BJ79:f:1
cell:BK79:f:1
cell:BL79:f:1
cell:BM79:f:1
cell:BN79:f:1
cell:BO79:vtf:t:s:bt3:f:1
cell:BP79:f:1
cell:BQ79:f:1
cell:BR79:f:1
cell:BS79:f:1
cell:BT79:f:1
cell:BU79:f:1
cell:BV79:vtf:t: :bt4:f:1
cell:E80:f:1
cell:F80:f:1
cell:G80:f:1
cell:H80:f:1
cell:I80:f:1
cell:J80:f:1
cell:K80:f:1
cell:L80:f:1
cell:M80:f:1
cell:N80:f:1
cell:O80:f:1
cell:P80:f:1
cell:Q80:f:1
cell:R80:f:1
cell:S80:f:1
cell:T80:f:1
cell:U80:f:1
cell:V80:f:1
cell:W80:f:1
cell:X80:f:1
cell:Y80:f:1
cell:Z80:f:1
cell:AA80:f:1
cell:AB80:f:1
cell:AC80:f:1
cell:AD80:f:1
cell:AE80:f:1
cell:AF80:f:1
cell:AG80:f:1
cell:AH80:f:1
cell:AI80:f:1
cell:AJ80:f:1
cell:AK80:f:1
cell:AL80:f:1
cell:AM80:f:1
cell:AN80:f:1
cell:AO80:f:1
cell:AP80:f:1
cell:AQ80:f:1
cell:AR80:f:1
cell:AS80:f:1
cell:AT80:f:1
cell:AU80:vtf:t: :bu1:f:1
cell:AV80:f:1
cell:AW80:f:1
cell:AX80:f:1
cell:AY80:f:1
cell:AZ80:f:1
cell:BA80:f:1
cell:BB80:f:1
cell:BC80:f:1
cell:BD80:f:1
cell:BE80:f:1
cell:BF80:f:1
cell:BG80:f:1
cell:BH80:vtf:t:r:bu2:f:1
cell:BI80:f:1
cell:BJ80:f:1
cell:BK80:f:1
cell:BL80:f:1
cell:BM80:f:1
cell:BN80:f:1
cell:BO80:f:1
cell:BP80:vtf:t: :bu3:f:1
cell:BQ80:f:1
cell:BR80:f:1
cell:BS80:f:1
cell:BT80:f:1
cell:BU80:f:1
cell:BV80:f:1
cell:BW80:vtf:t: :bu4
cell:E81:f:1
cell:F81:f:1
cell:G81:f:1
cell:H81:f:1
cell:I81:f:1
cell:J81:f:1
cell:K81:f:1
cell:L81:f:1
cell:M81:f:1
cell:N81:f:1
cell:O81:f:1
cell:P81:f:1
cell:Q81:f:1
cell:R81:f:1
cell:S81:f:1
cell:T81:f:1
cell:U81:f:1
cell:V81:f:1
cell:W81:f:1
cell:X81:f:1
cell:Y81:f:1
cell:Z81:f:1
cell:AA81:f:1
cell:AB81:f:1
cell:AC81:f:1
cell:AD81:f:1
cell:AE81:f:1
cell:AF81:f:1
cell:AG81:f:1
cell:AH81:f:1
cell:AI81:f:1
cell:AJ81:f:1
cell:AK81:f:1
cell:AL81:f:1
cell:AM81:f:1
cell:AN81:f:1
cell:AO81:f:1
cell:AP81:f:1
cell:AQ81:f:1
cell:AR81:f:1
cell:AS81:f:1
cell:AT81:f:1
cell:AU81:vtf:t: :bv1:f:1
cell:AV81:f:1
cell:AW81:f:1
cell:AX81:f:1
cell:AY81:f:1
cell:AZ81:f:1
cell:BA81:f:1
cell:BB81:f:1
cell:BC81:f:1
cell:BD81:f:1
cell:BE81:f:1
cell:BF81:f:1
cell:BG81:f:1
cell:BH81:vtf:t:o:bv2:f:1
cell:BI81:f:1
cell:BJ81:f:1
cell:BK81:f:1
cell:BL81:f:1
cell:BM81:f:1
cell:BN81:f:1
cell:BO81:f:1
cell:BP81:f:1
cell:BQ81:vtf:t: :bv3:f:1
cell:BR81:f:1
cell:BS81:f:1
cell:BT81:f:1
cell:BU81:f:1
cell:BV81:f:1
cell:BX81:vtf:t: :bv4
cell:E82:f:1
cell:F82:f:1
cell:G82:f:1
cell:H82:f:1
cell:I82:f:1
cell:J82:f:1
cell:K82:f:1
cell:L82:f:1
cell:M82:f:1
cell:N82:f:1
cell:O82:f:1
cell:P82:f:1
cell:Q82:f:1
cell:R82:f:1
cell:S82:f:1
cell:T82:f:1
cell:U82:f:1
cell:V82:f:1
cell:W82:f:1
cell:X82:f:1
cell:Y82:f:1
cell:Z82:f:1
cell:AA82:f:1
cell:AB82:f:1
cell:AC82:f:1
cell:AD82:f:1
cell:AE82:f:1
cell:AF82:f:1
cell:AG82:f:1
cell:AH82:f:1
cell:AI82:f:1
cell:AJ82:f:1
cell:AK82:f:1
cell:AL82:f:1
cell:AM82:f:1
cell:AN82:f:1
cell:AO82:f:1
cell:AP82:f:1
cell:AQ82:f:1
cell:AR82:f:1
cell:AS82:f:1
cell:AT82:f:1
cell:AU82:f:1
cell:AV82:vtf:t: :bw1:f:1
cell:AW82:f:1
cell:AX82:f:1
cell:AY82:f:1
cell:AZ82:f:1
cell:BA82:f:1
cell:BB82:f:1
cell:BC82:f:1
cell:BD82:f:1
cell:BE82:f:1
cell:BF82:f:1
cell:BG82:f:1
cell:BH82:f:1
cell:BI82:vtf:t:p:bw2:f:1
cell:BJ82:f:1
cell:BK82:f:1
cell:BL82:f:1
cell:BM82:f:1
cell:BN82:f:1
cell:BO82:f:1
cell:BP82:f:1
cell:BQ82:f:1
cell:BR82:vtf:t: :bw3:f:1
cell:BS82:f:1
cell:BT82:f:1
cell:BU82:f:1
cell:BV82:f:1
cell:BX82:vtf:t: :bw4
cell:E83:f:1
cell:F83:f:1
cell:G83:f:1
cell:H83:f:1
cell:I83:f:1
cell:J83:f:1
cell:K83:f:1
cell:L83:f:1
cell:M83:f:1
cell:N83:f:1
cell:O83:f:1
cell:P83:f:1
cell:Q83:f:1
cell:R83:f:1
cell:S83:f:1
cell:T83:f:1
cell:U83:f:1
cell:V83:f:1
cell:W83:f:1
cell:X83:f:1
cell:Y83:f:1
cell:Z83:f:1
cell:AA83:f:1
cell:AB83:f:1
cell:AC83:f:1
cell:AD83:f:1
cell:AE83:f:1
cell:AF83:f:1
cell:AG83:f:1
cell:AH83:f:1
cell:AI83:f:1
cell:AJ83:f:1
cell:AK83:f:1
cell:AL83:f:1
cell:AM83:f:1
cell:AN83:f:1
cell:AO83:f:1
cell:AP83:f:1
cell:AQ83:f:1
cell:AR83:f:1
cell:AS83:f:1
cell:AT83:f:1
cell:AU83:f:1
cell:AV83:vtf:t: :bx1:f:1
cell:AW83:f:1
cell:AX83:f:1
cell:AY83:f:1
cell:AZ83:f:1
cell:BA83:f:1
cell:BB83:f:1
cell:BC83:f:1
cell:BD83:f:1
cell:BE83:f:1
cell:BF83:f:1
cell:BG83:f:1
cell:BH83:f:1
cell:BI83:vtf:t:s:bx2:f:1
cell:BJ83:f:1
cell:BK83:f:1
cell:BL83:f:1
cell:BM83:f:1
cell:BN83:f:1
cell:BO83:f:1
cell:BP83:f:1
cell:BQ83:f:1
cell:BR83:vtf:t: :bx3:f:1
cell:BS83:f:1
cell:BT83:f:1
cell:BU83:f:1
cell:BV83:f:1
cell:BY83:vtf:t: :bx4
cell:E84:f:1
cell:F84:f:1
cell:G84:f:1
cell:H84:f:1
cell:I84:f:1
cell:J84:f:1
cell:K84:f:1
cell:L84:f:1
cell:M84:f:1
cell:N84:f:1
cell:O84:f:1
cell:P84:f:1
cell:Q84:f:1
cell:R84:f:1
cell:S84:f:1
cell:T84:f:1
cell:U84:f:1
cell:V84:f:1
cell:W84:f:1
cell:X84:f:1
cell:Y84:f:1
cell:Z84:f:1
cell:AA84:f:1
cell:AB84:f:1
cell:AC84:f:1
cell:AD84:f:1
cell:AE84:f:1
cell:AF84:f:1
cell:AG84:f:1
cell:AH84:f:1
cell:AI84:f:1
cell:AJ84:f:1
cell:AK84:f:1
cell:AL84:f:1
cell:AM84:f:1
cell:AN84:f:1
cell:AO84:f:1
cell:AP84:f:1
cell:AQ84:f:1
cell:AR84:f:1
cell:AS84:f:1
cell:AT84:f:1
cell:AU84:f:1
cell:AV84:f:1
cell:AW84:vtf:t: :by1:f:1
cell:AX84:f:1
cell:AY84:f:1
cell:AZ84:f:1
cell:BA84:f:1
cell:BB84:f:1
cell:BC84:f:1
cell:BD84:f:1
cell:BE84:f:1
cell:BF84:f:1
cell:BG84:f:1
cell:BH84:f:1
cell:BI84:f:1
cell:BJ84:vtf:t: :by2:f:1
cell:BK84:f:1
cell:BL84:f:1
cell:BM84:f:1
cell:BN84:f:1
cell:BO84:f:1
cell:BP84:f:1
cell:BQ84:f:1
cell:BR84:f:1
cell:BS84:vtf:t: :by3:f:1
cell:BT84:f:1
cell:BU84:f:1
cell:BV84:f:1
cell:BY84:vtf:t: :by4
cell:AW85:vtf:t: :bz1
cell:BK85:vtf:t: :bz2
cell:BS85:vtf:t: :bz3
cell:BZ85:vtf:t: :bz4
cell:AX86:vtf:t: :ca1
cell:BK86:vtf:t: :ca2
cell:BT86:vtf:t: :ca3
cell:CA86:vtf:t: :ca4
cell:BT87:vtf:t: :cb3
cell:CA87:vtf:t: :cb4
cell:CB88:vtf:t: :cc4
col:A:w:14
col:B:w:14
col:C:w:14
col:D:w:14
col:E:w:14
col:F:w:14
col:G:w:14
col:H:w:14
col:I:w:14
col:J:w:14
col:K:w:14
col:L:w:14
col:M:w:14
col:N:w:14
col:O:w:14
col:P:w:14
col:Q:w:14
col:R:w:14
col:S:w:14
col:T:w:14
col:U:w:14
col:V:w:14
col:W:w:14
col:X:w:14
col:Y:w:14
col:Z:w:14
col:AA:w:14
col:AB:w:14
col:AC:w:14
col:AD:w:14
col:AE:w:14
col:AF:w:14
col:AG:w:14
col:AH:w:14
col:AI:w:14
col:AJ:w:14
col:AK:w:14
col:AL:w:14
col:AM:w:14
col:AN:w:14
col:AO:w:14
col:AP:w:14
col:AQ:w:14
col:AR:w:14
col:AS:w:14
col:AT:w:14
col:AU:w:14
col:AV:w:14
col:AW:w:14
col:AX:w:14
col:AY:w:14
col:AZ:w:14
col:BA:w:14
col:BB:w:14
col:BC:w:14
col:BD:w:14
col:BE:w:14
col:BF:w:14
col:BG:w:14
col:BH:w:14
col:BI:w:14
col:BJ:w:14
col:BK:w:14
col:BL:w:14
col:BM:w:14
col:BN:w:14
col:BO:w:14
col:BP:w:14
col:BQ:w:14
col:BR:w:14
col:BS:w:14
col:BT:w:14
col:BU:w:14
col:BV:w:14
col:BW:w:14
col:BX:w:14
col:BY:w:14
col:BZ:w:14
col:CA:w:14
col:CB:w:14
col:CC:w:14
row:1:hide:yes
row:2:hide:yes
row:3:hide:yes
row:4:hide:yes
row:5:hide:yes
sheet:c:81:r:88
font:1:normal bold * *
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.0
rowpane:0:1:24
colpane:0:1:40
ecell:A6
range:A1:1:5:1:1
sort::-1:down::::
graph:range:undefined:type::minmax:undefined,undefined,undefined,undefined
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
set 5 hide
set 4 hide
set 3 hide
set 2 hide
set 1 hide
set AY1 text t e
set A6 formula e8
set A6 empty
set 1:5 hide yes
--SocialCalcSpreadsheetControlSave--
"""
''It's raining'' by Guillaume Apollinaire. Calligrammes (1918).
Translation : Roger Shattuck.
"""
<$edit-socialcalc tiddler="SocialCalc/Demos/calligramme-in-english" mode="view" grid="no" height=500/>
socialcalc:version:1.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
# SocialCalc Spreadsheet Control Save
version:1.0
part:sheet
part:edit
part:audit
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.5
cell:A1:f:1
cell:C1:f:1
cell:E1:f:1
col:A:w:10
col:B:w:10
col:C:w:10
col:D:w:10
col:E:w:10
col:F:w:10
col:G:w:10
col:H:w:10
col:I:w:10
col:J:w:10
col:K:w:10
col:L:w:10
col:M:w:10
col:N:w:10
col:O:w:10
col:P:w:10
col:Q:w:10
col:R:w:10
col:S:w:10
col:T:w:10
col:U:w:10
col:V:w:10
col:W:w:10
col:X:w:10
col:Y:w:10
col:Z:w:10
col:AA:w:10
col:AB:w:10
col:AC:w:10
col:AD:w:10
col:AE:w:10
col:AF:w:10
col:AG:w:10
col:AH:w:10
col:AI:w:10
col:AJ:w:10
col:AK:w:10
col:AL:w:10
col:AM:w:10
col:AN:w:10
col:AO:w:10
col:AP:w:10
col:AQ:w:10
col:AR:w:10
col:AS:w:10
col:AT:w:10
col:AU:w:10
col:AV:w:10
col:AW:w:10
col:AX:w:10
col:AY:w:10
col:AZ:w:10
col:BA:w:10
col:BB:w:10
col:BC:w:10
col:BD:w:10
col:BE:w:10
col:BF:w:10
sheet:c:58:r:1
font:1:normal bold * *
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.0
rowpane:0:1:17
colpane:0:1:56
ecell:I2
sort::-1:up::::
graph:range:undefined:type::minmax:undefined,undefined,undefined,undefined
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
set B2 formula a2+b1+c2+b3
copy B2 formulas
loadclipboard
paste C2 formulas
loadclipboard
paste D2 formulas
loadclipboard
paste E2 formulas
loadclipboard
paste F2 formulas
copy B2:F2 formulas
loadclipboard
paste G2 formulas
loadclipboard
paste L2 formulas
copy B2:P2 formulas
loadclipboard
paste B3 formulas
set O width 147
set O width 10
set B2:P3 empty
set B2 formula a2+b1
set C3 formula a3+c1+d3+c4
copy C3 formulas
loadclipboard
paste D3 formulas
loadclipboard
paste E3 formulas
loadclipboard
paste F3 formulas
loadclipboard
paste G3 formulas
loadclipboard
paste H3 formulas
loadclipboard
paste I3 formulas
copy C3:I3 formulas
loadclipboard
paste C4 formulas
set C3:I4 empty
set C3 empty
set B2 formula a2+b1+d2+b4
copy B2 formulas
loadclipboard
paste C2 formulas
loadclipboard
paste D2 formulas
loadclipboard
paste E2 formulas
loadclipboard
paste F2 formulas
loadclipboard
paste G2 formulas
loadclipboard
paste H2 formulas
loadclipboard
paste I2 formulas
copy B2:I2 formulas
loadclipboard
paste B3 formulas
loadclipboard
paste B4 formulas
set B2:I4 empty
--SocialCalcSpreadsheetControlSave--
socialcalc:version:1.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
# SocialCalc Spreadsheet Control Save
version:1.0
part:sheet
part:edit
part:audit
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.5
cell:A1:v:0:bg:1
cell:B1:v:1:bg:1
cell:C1:v:1:bg:1
cell:D1:v:1:bg:1
cell:E1:v:1:bg:1
cell:F1:v:1:bg:1
cell:G1:v:1:bg:1
cell:A2:v:1:bg:1
cell:B2:vtf:n:2:a2+b1
cell:C2:vtf:n:3:B2+C1
cell:D2:vtf:n:4:C2+D1
cell:E2:vtf:n:5:D2+E1
cell:F2:vtf:n:6:E2+F1
cell:G2:vtf:n:7:F2+G1
cell:A3:v:1:bg:1
cell:B3:vtf:n:3:A3+B2
cell:C3:vtf:n:6:B3+C2
cell:D3:vtf:n:10:C3+D2
cell:E3:vtf:n:15:D3+E2
cell:F3:vtf:n:21:E3+F2
cell:G3:vtf:n:28:F3+G2
cell:A4:v:1:bg:1
cell:B4:vtf:n:4:A4+B3
cell:C4:vtf:n:10:B4+C3
cell:D4:vtf:n:20:C4+D3
cell:E4:vtf:n:35:D4+E3
cell:F4:vtf:n:56:E4+F3
cell:G4:vtf:n:84:F4+G3
cell:A5:v:1:bg:1
cell:B5:vtf:n:5:A5+B4
cell:C5:vtf:n:15:B5+C4
cell:D5:vtf:n:35:C5+D4
cell:E5:vtf:n:70:D5+E4
cell:F5:vtf:n:126:E5+F4
cell:G5:vtf:n:210:F5+G4
cell:A6:v:1:bg:1
cell:B6:vtf:n:6:A6+B5
cell:C6:vtf:n:21:B6+C5
cell:D6:vtf:n:56:C6+D5
cell:E6:vtf:n:126:D6+E5
cell:F6:vtf:n:252:E6+F5
cell:G6:vtf:n:462:F6+G5
cell:A7:v:1:bg:1
cell:B7:vtf:n:7:A7+B6
cell:C7:vtf:n:28:B7+C6
cell:D7:vtf:n:84:C7+D6
cell:E7:vtf:n:210:D7+E6
cell:F7:vtf:n:462:E7+F6
cell:G7:vtf:n:924:F7+G6
cell:A8:v:1:bg:1
cell:B8:vtf:n:8:A8+B7
cell:C8:vtf:n:36:B8+C7
cell:D8:vtf:n:120:C8+D7
cell:E8:vtf:n:330:D8+E7
cell:F8:vtf:n:792:E8+F7
cell:G8:vtf:n:1716:F8+G7
cell:A9:v:1:bg:1
cell:B9:vtf:n:9:A9+B8
cell:C9:vtf:n:45:B9+C8
cell:D9:vtf:n:165:C9+D8
cell:E9:vtf:n:495:D9+E8
cell:F9:vtf:n:1287:E9+F8
cell:G9:vtf:n:3003:F9+G8
cell:A10:v:1:bg:1
cell:B10:vtf:n:10:A10+B9
cell:C10:vtf:n:55:B10+C9
cell:D10:vtf:n:220:C10+D9
cell:E10:vtf:n:715:D10+E9
cell:F10:vtf:n:2002:E10+F9
cell:G10:vtf:n:5005:F10+G9
cell:A11:v:1:bg:1
cell:B11:vtf:n:11:A11+B10
cell:C11:vtf:n:66:B11+C10
cell:D11:vtf:n:286:C11+D10
cell:E11:vtf:n:1001:D11+E10
cell:F11:vtf:n:3003:E11+F10
cell:G11:vtf:n:8008:F11+G10
cell:A12:v:1:bg:1
cell:B12:vtf:n:12:A12+B11
cell:C12:vtf:n:78:B12+C11
cell:D12:vtf:n:364:C12+D11
cell:E12:vtf:n:1365:D12+E11
cell:F12:vtf:n:4368:E12+F11
cell:G12:vtf:n:12376:F12+G11
cell:A13:v:1:bg:1
cell:B13:vtf:n:13:A13+B12
cell:C13:vtf:n:91:B13+C12
cell:D13:vtf:n:455:C13+D12
cell:E13:vtf:n:1820:D13+E12
cell:F13:vtf:n:6188:E13+F12
cell:G13:vtf:n:18564:F13+G12
cell:A14:v:1:bg:1
cell:B14:vtf:n:14:A14+B13
cell:C14:vtf:n:105:B14+C13
cell:D14:vtf:n:560:C14+D13
cell:E14:vtf:n:2380:D14+E13
cell:F14:vtf:n:8568:E14+F13
cell:G14:vtf:n:27132:F14+G13
sheet:c:7:r:14
color:1:rgb(255, 153, 0)
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.0
rowpane:0:1:17
colpane:0:1:7
ecell:A1
sort::-1:up::::
graph:range:undefined:type::minmax:undefined,undefined,undefined,undefined
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
set D1 value n 10
set D1 value n 3
set C1 value n 1
set D1 value n 0
set E1 value n 0
set F1 value n 1
set G1 value n 1
set E1 value n 1
set D1 value n 1
set A3 value n 1
set A4 value n 1
set A5 value n 1
set A6 value n 1
set A7 value n 1
set A8 value n 1
set A9 value n 1
set A10 value n 1
set A11 value n 1
set A12 value n 1
set A13 value n 1
set A14 value n 1
--SocialCalcSpreadsheetControlSave--
''A field of numbers''
<$edit-socialcalc tiddler="SocialCalc/Demos/field" height=400/>
socialcalc:version:1.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
# SocialCalc Spreadsheet Control Save
version:1.0
part:sheet
part:edit
part:audit
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.5
cell:A1:t:Link:f:1:bg:1:cf:1
cell:B1:t:Comment:f:1:bg:1:cf:1
cell:A2:vtf:n:2:"one-plus-one"!e1:f:1
cell:B2:t:Solution of a big calculation
cell:A3:vtf:t:I:"calligramme"!e8:f:1
cell:B3:t:First letter of a beautiful poem
cell:A4:t:[field]:tvf:1
cell:B4:t:A calc sheet with a field of numbers
cell:A5:t:Plugin<tw\c$\c/plugins/rboue/SocialCalc>:tvf:1
cell:B5:t:The SocialCalc plugin
cell:A6:t:TiddlyWiki<http\c//tiddlywiki.com/>:tvf:1
cell:B6:t:A non-linear personal web notebook
col:B:w:260
sheet:c:2:r:6
cellformat:1:center
color:1:rgb(255, 153, 0)
font:1:normal bold * *
valueformat:1:text-link
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.0
rowpane:0:1:11
colpane:0:1:5
ecell:A6
sort::-1:down::::
graph:range:undefined:type::minmax:undefined,undefined,undefined,undefined
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
set A4 text t [field]
set A4 text t Page[field]
set A4 text t [field]
set A4 textvalueformat text-link
set B4 text t A calc sheet with a field of numbers
set A5 text t Plugin<tw\c$\c/plugins/rboue/SocialCalc>
set A5 text t Plugin<tw\c$/plugins/rboue/SocialCalc>
set A5 text t Plugin<tw\c$\c/plugins/rboue/SocialCalc>
set A5 textvalueformat text-link
set B5 text t The SocialCalc plugin
set A6 text t TiddlyWiki<>
set A6 text t TiddlyWiki<http\c//tiddlywiki.com/>
set A6 textvalueformat text-link
set B6 text t A
set B6 text t A non-linear personal web notebook
--SocialCalcSpreadsheetControlSave--
''Examples of links''
<$edit-socialcalc tiddler="SocialCalc/Demos/links"/>
socialcalc:version:1.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
# SocialCalc Spreadsheet Control Save
version:1.0
part:sheet
part:edit
part:audit
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.5
cell:A1:v:1:f:1:bg:2
cell:B1:t:+
cell:C1:v:1:f:1:bg:3
cell:D1:t:=
cell:E1:vtf:n:2:$a$1+$c$1:f:1:bg:1
cell:K2:vtf:t::IF($e$1=2,""," "):comment:Don't say it !
cell:G3:vtf:n:1:$a$1:bg:2
cell:H3:vtf:n:1:$A$1:bg:2
cell:X3:vtf:n:1:$c$1:bg:3
cell:Y3:vtf:n:1:$C$1:bg:3
cell:AN3:vtf:n:2:$e$1:bg:1
cell:AO3:vtf:n:2:$E$1:bg:1
cell:F4:vtf:n:1:$A$1:bg:2
cell:G4:vtf:n:1:$A$1:bg:2
cell:H4:vtf:n:1:$A$1:bg:2
cell:W4:vtf:n:1:$C$1:bg:3
cell:X4:vtf:n:1:$C$1:bg:3
cell:Y4:vtf:n:1:$C$1:bg:3
cell:AM4:vtf:n:2:$E$1:bg:1
cell:AN4:vtf:n:2:$E$1:bg:1
cell:AO4:vtf:n:2:$E$1:bg:1
cell:AP4:vtf:n:2:$E$1:bg:1
cell:E5:vtf:n:1:$A$1:bg:2
cell:F5:vtf:n:1:$A$1:bg:2
cell:G5:vtf:n:1:$A$1:bg:2
cell:H5:vtf:n:1:$A$1:bg:2
cell:V5:vtf:n:1:$C$1:bg:3
cell:W5:vtf:n:1:$C$1:bg:3
cell:X5:vtf:n:1:$C$1:bg:3
cell:Y5:vtf:n:1:$C$1:bg:3
cell:AL5:vtf:n:2:$E$1:bg:1
cell:AM5:vtf:n:2:$E$1:bg:1
cell:AP5:vtf:n:2:$E$1:bg:1
cell:AQ5:vtf:n:2:$E$1:bg:1
cell:D6:vtf:n:1:$A$1:bg:2
cell:E6:vtf:n:1:$A$1:bg:2
cell:G6:vtf:n:1:$A$1:bg:2
cell:H6:vtf:n:1:$A$1:bg:2
cell:N6:vtf:t:+:$b$1
cell:O6:vtf:t:+:$B$1
cell:U6:vtf:n:1:$C$1:bg:3
cell:V6:vtf:n:1:$C$1:bg:3
cell:X6:vtf:n:1:$C$1:bg:3
cell:Y6:vtf:n:1:$C$1:bg:3
cell:AL6:vtf:n:2:$E$1:bg:1
cell:AM6:vtf:n:2:$E$1:bg:1
cell:AP6:vtf:n:2:$E$1:bg:1
cell:AQ6:vtf:n:2:$E$1:bg:1
cell:G7:vtf:n:1:$A$1:bg:2
cell:H7:vtf:n:1:$A$1:bg:2
cell:L7:vtf:t:+:$B$1
cell:M7:vtf:t:+:$B$1
cell:N7:vtf:t:+:$B$1
cell:O7:vtf:t:+:$B$1
cell:P7:vtf:t:+:$B$1
cell:Q7:vtf:t:+:$B$1
cell:X7:vtf:n:1:$C$1:bg:3
cell:Y7:vtf:n:1:$C$1:bg:3
cell:AC7:vtf:t:=:$d$1
cell:AD7:vtf:t:=:$D$1
cell:AE7:vtf:t:=:$D$1
cell:AF7:vtf:t:=:$D$1
cell:AG7:vtf:t:=:$D$1
cell:AH7:vtf:t:=:$D$1
cell:AO7:vtf:n:2:$E$1:bg:1
cell:AP7:vtf:n:2:$E$1:bg:1
cell:G8:vtf:n:1:$A$1:bg:2
cell:H8:vtf:n:1:$A$1:bg:2
cell:L8:vtf:t:+:$B$1
cell:M8:vtf:t:+:$B$1
cell:N8:vtf:t:+:$B$1
cell:O8:vtf:t:+:$B$1
cell:P8:vtf:t:+:$B$1
cell:Q8:vtf:t:+:$B$1
cell:X8:vtf:n:1:$C$1:bg:3
cell:Y8:vtf:n:1:$C$1:bg:3
cell:AC8:vtf:t:=:$D$1
cell:AD8:vtf:t:=:$D$1
cell:AE8:vtf:t:=:$D$1
cell:AF8:vtf:t:=:$D$1
cell:AG8:vtf:t:=:$D$1
cell:AH8:vtf:t:=:$D$1
cell:AN8:vtf:n:2:$E$1:bg:1
cell:AO8:vtf:n:2:$E$1:bg:1
cell:G9:vtf:n:1:$A$1:bg:2
cell:H9:vtf:n:1:$A$1:bg:2
cell:N9:vtf:t:+:$B$1
cell:O9:vtf:t:+:$B$1
cell:X9:vtf:n:1:$C$1:bg:3
cell:Y9:vtf:n:1:$C$1:bg:3
cell:AM9:vtf:n:2:$E$1:bg:1
cell:AN9:vtf:n:2:$E$1:bg:1
cell:G10:vtf:n:1:$A$1:bg:2
cell:H10:vtf:n:1:$A$1:bg:2
cell:X10:vtf:n:1:$C$1:bg:3
cell:Y10:vtf:n:1:$C$1:bg:3
cell:AL10:vtf:n:2:$E$1:bg:1
cell:AM10:vtf:n:2:$E$1:bg:1
cell:AN10:vtf:n:2:$E$1:bg:1
cell:AO10:vtf:n:2:$E$1:bg:1
cell:AP10:vtf:n:2:$E$1:bg:1
cell:AQ10:vtf:n:2:$E$1:bg:1
cell:G11:vtf:n:1:$A$1:bg:2
cell:H11:vtf:n:1:$A$1:bg:2
cell:X11:vtf:n:1:$C$1:bg:3
cell:Y11:vtf:n:1:$C$1:bg:3
cell:AL11:vtf:n:2:$E$1:bg:1
cell:AM11:vtf:n:2:$E$1:bg:1
cell:AN11:vtf:n:2:$E$1:bg:1
cell:AO11:vtf:n:2:$E$1:bg:1
cell:AP11:vtf:n:2:$E$1:bg:1
cell:AQ11:vtf:n:2:$E$1:bg:1
col:A:w:10
col:B:w:10
col:C:w:10
col:D:w:10
col:E:w:10
col:F:w:10
col:G:w:10
col:H:w:10
col:I:w:10
col:J:w:10
col:K:w:10
col:L:w:10
col:M:w:10
col:N:w:10
col:O:w:10
col:P:w:10
col:Q:w:10
col:R:w:10
col:S:w:10
col:T:w:10
col:U:w:10
col:V:w:10
col:W:w:10
col:X:w:10
col:Y:w:10
col:Z:w:10
col:AA:w:10
col:AB:w:10
col:AC:w:10
col:AD:w:10
col:AE:w:10
col:AF:w:10
col:AG:w:10
col:AH:w:10
col:AI:w:10
col:AJ:w:10
col:AK:w:10
col:AL:w:10
col:AM:w:10
col:AN:w:10
col:AO:w:10
col:AP:w:10
col:AQ:w:10
col:AR:w:10
col:AS:w:10
col:AT:w:10
col:AU:w:10
col:AV:w:10
col:AW:w:10
col:AX:w:10
col:AY:w:10
col:AZ:w:10
col:BA:w:10
col:BB:w:10
col:BC:w:10
col:BD:w:10
col:BE:w:10
col:BF:w:10
sheet:c:58:r:11
color:1:rgb(0, 255, 255)
color:2:rgb(255, 153, 0)
color:3:rgb(255, 255, 0)
font:1:normal bold * *
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
version:1.0
rowpane:0:1:17
colpane:0:1:56
ecell:A2
sort::-1:up::::
graph:range:undefined:type::minmax:undefined,undefined,undefined,undefined
--SocialCalcSpreadsheetControlSave
Content-type: text/plain; charset=UTF-8
set K2 comment Don't say it !
--SocialCalcSpreadsheetControlSave--
''A calc sheet. Feel free to modify it !''
<$edit-socialcalc tiddler="SocialCalc/Demos/one-plus-one" height=400/>
The plugin : [[SocialCalc|$:/plugins/rboue/SocialCalc]]
!Demos
Some calc sheets to play and see what you can do with ~SocialCalc :
[[one-plus-one|SocialCalc/Demos/one-plus-one--demo]]
[[field|SocialCalc/Demos/field--demo]]
[[calligramme|SocialCalc/Demos/calligramme--demo]]
[[links|SocialCalc/Demos/links--demo]]
!What is ~SocialCalc ?
A calc sheet to do effective calculations and much more.
Links :
[[Documentation|http://sternlife.stern.nyu.edu/help-en/SocialCalc]]
[[Engine|http://www.softwaregarden.com/products/wikicalc/socialcalc/EngineDoc-8.html]]
!~SocialCalc in ~TiddlyWiki environment
"""
__''Calc sheet storage''__
~SocialCalc stores calc sheets in tiddlers of type `application/x-socialcalc`.
__''Calc sheet edition''__
There is two ways to edit a calc sheet : with the standard tiddler editor or with the `<$edit-socialcal>` widget.
For the widget way, see below.
When you click on the edit icon of an `application/x-socialcalc` tiddler, the tiddler's editor displays an `<$edit-socialcalc>` widget to edit the calc page. You can also modify tiddler's fields the usual way.
__''Data exchange''__
The "Clipboard" menu allows you to import/export data. However, supported formats are very limited. Don't expect to exchange data with EXCEL. There is simple text formats like CSV and Tab-delimited, and the "~SocialCalc-save" format. You can export a selection of a calc sheet (the clipboard) to a tiddler and you can import a data tiddler to the clipboard, nothing more.
__''Links in calc sheet''__
~SocialCalc offers a reasonable choice of link's types. See ~SocialCal documentation for details.
There is two kinds of links that the plugin manages in a different way : calc sheet references (better known as "page references") and URL links.
__Page reference__
A page reference is a reference to another calc sheet's piece of data in a formula. This type of link is essential to simplify the task of building calc sheets by splitting data between different sheets. In conventional case, calc sheets are web pages on specific servers. In ~TiddlyWiki's case, calc sheets are always stored in local tiddlers.
Then, with ~TiddlyWiki, the reference to a page is simply the title of its tiddler.
Example of a formula with page references :
`="My first tiddler with a calc sheet"!a11 * "My second tiddler with a calc sheet"!b22`
To ease the task of page referencing, the plugin offers an ambryo of filesystem and relative path handling. Let's say a main sheet is stored in the tiddler named "My directory/my main page" and a sheet with useful data in "My directory/my useful page". With relative path you can simply reference "my useful page" in a formula of the main sheet. This behaviour is configuration dependent (see below). You must define a filesystem.PATH attribute with the list of directories to search for page references.
Example of configuration and formula with relative page references :
Configuration tiddler (`$:config/rboue/SocialCalc`) :
"""
```
{
"filesystem": {
"PATH": "My directory;other directory"
},
...
}
```
"""
`="my useful page"!a11 * "my useful page"!b22`
__URL links__
Conventional ~SocialCalc offers the possibility to define clickable links, with common URLs like "http:...", "mailto:...", etc.
The plugin adds the possibility to open tiddlers the same way, with a special type of URL :
''tw:''`title of a tiddler`
Example of cell's value with a clickable link to a tiddler :
`'<tw:My tiddler>`
Filesystem and relative path applies also to URL links of type "tw:". This is the same behaviour than with page references.
When creating a link, don't forget to set the cell's format value to `Link`.
__''<$edit-socialcalc> widget''__
The widget offers quite the same UI than conventional ~SocialCalc editor.
However there is some slight differences :
"""
* A new "Save changes" icon enables you to save sheet's data in tiddler. Its colour changes as soon as a change in data occured, to inform you that a save is required.
* The "Clipboard" menu has more functionnalities. You can import clipboard data from tiddlers, with a choice of different formats. You can also export the clipboard to a data tiddler.
* The "Graph" menu has been enhanced and offers more effective data display.
"""
The full set of conventional ~SocialCalc's editor keys is available whith the "Edit" menu, especially Ctrl-c/Ctrl-x/Ctrl-v to copy/delete/paste cells or ranges of cells.
Please note that Ctrl-s has the same behaviour than a click on the "Save changes" icon.
The content of the `<$edit-socialcalc>` widget is not interpreted.
"""
|Attribute |Description |h
|width |Width of the widget in pixel |
|height |Height of the widget in pixel (300 by default) |
|mode |Type of display : "edit" to edit the data (default value), "view" to display without modification |
|grid |"yes" to display the grid (default value), "no" otherwise |
|class |An optional CSS class name to be assigned to the HTML element |
"""
__''Configuration''__
The plugin is configured via the `$:config/rboue/SocialCalc` tiddler (of type `application/json`).
Example of configuration :
"""
```
{
"filesystem": {
"PATH": "SocialCalc/Tests;SocialCalc/Tests/TestPath1;SocialCalc/Tests/TestPath2"
},
"grid": "yes",
"LANG": "fr-FR",
"heightInTiddlerEditor": 500
}
```
|Attribute |Description |h
|filesystem |Activates the pseudo filesystem behaviour. `PATH` is a list of absolute directories to search under when calc sheets are referenced in formula |
|grid |If "yes", displays the grid (default). If "no", suppress the grid |
|LANG |Language for menus, helps and tooltips translations. "en-GB" by default |
|heightInTiddlerEditor |Height in pixel of the `<$edit-socialcalc>` widget in the tiddler's editor. Default is 300 |
Default configuration is defined in the `$:/plugins/rboue/SocialCalc/config.json` tiddler.
[[three.js|http://threejs.org/]] - deferred area lights ~WebGL demo by [[redPlant|http://de.redplant.de]] - based on [[ArKano22's|http://www.gamedev.net/topic/552315-glsl-area-light-implementation/]] glsl implementation
@@float:right;
[[View source|Three.js/Demos/arealights.js]]
@@
<$view3js tiddler="Three.js/Demos/arealights.js"/>
require("./Lib/Loaders/BinaryLoader.js");
require("./Lib/Renderers/WebGLDeferredRenderer.js");
require("./Lib/ShaderDeferred.js");
require("./Lib/Shaders/CopyShader.js");
require("./Lib/Shaders/FXAAShader.js");
require("./Lib/Shaders/ConvolutionShader.js");
require("./Lib/Postprocessing/EffectComposer.js");
require("./Lib/Postprocessing/RenderPass.js");
require("./Lib/Postprocessing/ShaderPass.js");
require("./Lib/Postprocessing/MaskPass.js");
require("./Lib/Postprocessing/BloomPass.js");
var Stats = require("./Lib/stats-min.js").Stats;
var Tools = require("./Lib/tools.js").Tools;
var SCALE = 1;
var MARGIN = 0;
var WIDTH = 0;
var HEIGHT = 0;
var NEAR = 1.0, FAR = 350.0;
//var VIEW_ANGLE = 40;
var VIEW_ANGLE = 50;
// controls
var mouseX = 0;
var mouseY = 0;
var targetX = 0, targetY = 0;
var angle = 0;
var target = new THREE.Vector3( 0, 0, 0 );
var windowHalfX = 0;
var windowHalfY = 0;
// core
var renderer, camera, scene, stats, clock;
// lights
var areaLight1, areaLight2, areaLight3;
var node = null;
var flagStats = false;
// -----------------------------
function main(input) {
var func = "main";
node = input.node;
WIDTH = node.offsetWidth;
HEIGHT = node.offsetHeight - 2 * MARGIN;
windowHalfX = node.offsetWidth / 2;
windowHalfY = node.offsetHeight / 2;
// renderer
renderer = new THREE.WebGLDeferredRenderer( { width: WIDTH, height: HEIGHT, scale: SCALE, antialias: true, tonemapping: THREE.FilmicOperator, brightness: 2.5 } );
node.appendChild( renderer.domElement );
// effects
var bloomEffect = new THREE.BloomPass( 0.65 );
renderer.addEffect( bloomEffect );
// camera
camera = new THREE.PerspectiveCamera( VIEW_ANGLE, WIDTH / HEIGHT, NEAR, FAR );
camera.position.y = 40;
// scene
scene = new THREE.Scene();
scene.add( camera );
// stats
if (flagStats) stats = Tools.addStats(node);
// clock
clock = new THREE.Clock();
// add lights
initLights();
// add objects
initObjects();
// events
node.addEventListener( 'mousemove', onDocumentMouseMove, false );
var onTiddlerRefresh = onWindowResize;
onTiddlerRefresh();
// Animation
var animation = new Tools.Animation(node, function() {
animate();
}, true);
animation.start();
return {onTiddlerRefresh: onTiddlerRefresh};
}
// -----------------------------
function createAreaEmitter( light ) {
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: light.color.getHex(), vertexColors: THREE.FaceColors } );
var backColor = 0x222222;
geometry.faces[ 5 ].color.setHex( backColor );
geometry.faces[ 4 ].color.setHex( backColor );
geometry.faces[ 2 ].color.setHex( backColor );
geometry.faces[ 1 ].color.setHex( backColor );
geometry.faces[ 0 ].color.setHex( backColor );
var emitter = new THREE.Mesh( geometry, material );
emitter.scale.set( light.width * 2, 0.2, light.height * 2 );
return emitter;
}
function setupAreaLight( light ) {
var matrix = light.matrixWorld;
light.right.set( 1, 0, 0 );
light.normal.set( 0, -1, 0 );
light.right.applyMatrix4( matrix );
light.normal.applyMatrix4( matrix );
}
function initLights() {
areaLight1 = new THREE.AreaLight( 0xffffff, 1 );
areaLight1.position.set( 0.0001, 10.0001, -18.5001 );
areaLight1.rotation.set( -0.74719, 0.0001, 0.0001 );
areaLight1.width = 10;
areaLight1.height = 1;
scene.add( areaLight1 );
var meshEmitter = createAreaEmitter( areaLight1 );
areaLight1.add( meshEmitter );
//
areaLight2 = new THREE.AreaLight( 0x33ff66, 1.5 );
areaLight2.position.set( -19.0001, 3.0001, 0.0001 );
areaLight2.rotation.set( -1.5707, 0.0001, 1.5707 );
areaLight2.width = 8;
areaLight2.height = 1;
scene.add( areaLight2 );
var meshEmitter = createAreaEmitter( areaLight2 );
areaLight2.add( meshEmitter );
//
areaLight3 = new THREE.AreaLight( 0x3366ff, 1.5 );
areaLight3.position.set( 19.0001, 3.0001, 0.0001 );
areaLight3.rotation.set( 1.5707, 0.0001, -1.5707 );
areaLight3.width = 8;
areaLight3.height = 1;
scene.add( areaLight3 );
var meshEmitter = createAreaEmitter( areaLight3 );
areaLight3.add( meshEmitter );
}
// -----------------------------
function initObjects() {
var loader = new THREE.BinaryLoader();
loader.load( "tw:obj/box/box.js", function ( geometry, materials ) {
var material = new THREE.MeshPhongMaterial( { color: 0xffaa55, specular: 0x888888, shininess: 200 } );
var object = new THREE.Mesh( geometry, material );
object.scale.multiplyScalar( 2 );
scene.add( object );
} );
/*
var loader = new THREE.BinaryLoader();
loader.load( "obj/veyron/VeyronNoUv_bin.js", function ( geometry ) {
var r = "textures/cube/Bridge2/";
var urls = [
r + "posx.jpg", r + "negx.jpg",
r + "posy.jpg", r + "negy.jpg",
r + "posz.jpg", r + "negz.jpg"
];
var textureCube = THREE.ImageUtils.loadTextureCube( urls );
textureCube.format = THREE.RGBFormat;
var materials = [
// tires + inside
new THREE.MeshLambertMaterial( {
color: 0x050505
} ),
// wheels + extras chrome
new THREE.MeshLambertMaterial( {
color: 0xffffff,
envMap: textureCube
} ),
// back / top / front torso
new THREE.MeshLambertMaterial( {
color: 0x000000,
ambient: 0x000000,
envMap: textureCube,
combine: THREE.MixOperation,
reflectivity: 0.15
} ),
// glass
new THREE.MeshLambertMaterial( {
color: 0x101046,
envMap: textureCube,
opacity: 0.25,
transparent: true
} ),
// sides torso
new THREE.MeshLambertMaterial( {
color: 0xffffff,
envMap: textureCube
} ),
// engine
new THREE.MeshLambertMaterial( {
color: 0xffffff,
envMap: textureCube
} ),
// backlights
new THREE.MeshLambertMaterial( {
color: 0xff0000,
opacity: 0.5,
transparent: true
} ),
// backsignals
new THREE.MeshLambertMaterial( {
color: 0xffbb00,
opacity: 0.5,
transparent: true
} )
];
var object = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
object.position.y = 5;
object.rotation.y = Math.PI / 4;
object.scale.multiplyScalar( 0.1 );
scene.add( object );
} );
*/
}
// -----------------------------
function onWindowResize( event ) {
windowHalfX = node.offsetWidth / 2;
windowHalfY = node.offsetHeight / 2;
WIDTH = node.offsetWidth;
HEIGHT = node.offsetHeight - 2 * MARGIN;
renderer.setSize( WIDTH, HEIGHT );
camera.aspect = WIDTH / HEIGHT;
camera.updateProjectionMatrix();
}
function onDocumentMouseMove( event ) {
mouseX = ( event.clientX + window.pageXOffset - node.offsetLeft - windowHalfX ) * 1;
mouseY = ( event.clientY + window.pageYOffset - node.offsetTop - windowHalfY ) * 1;
}
// -----------------------------
function animate() {
//requestAnimationFrame( animate );
render();
if (flagStats) stats.update();
}
function render() {
// update camera
var delta = clock.getDelta();
targetX = mouseX * .001;
targetY = mouseY * .001;
angle += 0.05 * ( targetX - angle );
camera.position.x = -Math.sin( angle ) * 40;
camera.position.z = Math.cos( angle ) * 40;
camera.lookAt( target );
var time = Date.now();
areaLight1.position.x = Math.sin( Date.now() * 0.001 ) * 9;
areaLight1.position.y = Math.sin( Date.now() * 0.0013 ) * 5 + 5;
areaLight2.position.y = Math.sin( Date.now() * 0.0011 ) * 3 + 5;
areaLight2.position.z = Math.sin( Date.now() * 0.00113 ) * 10;
areaLight3.position.y = Math.sin( Date.now() * 0.00111 ) * 3 + 5;
areaLight3.position.z = Math.sin( Date.now() * 0.001113 ) * 10;
// render
renderer.render( scene, camera );
}
Skybox by [[Paul Debevec|http://ict.debevec.org/~debevec/]].
@@float:right;
[[View source|Three.js/Demos/bubbles.js]]
@@
<$view3js tiddler="Three.js/Demos/bubbles.js"/>
// A faire :
// - Ajouter un outil de gestion d'animation
//
require("./Lib/Effects/AnaglyphEffect.js");
var Tools = require("./Lib/tools.js").Tools;
var flagNoLog = true;
var camera, scene, renderer, effect, mesh, lightMesh, geometry;
var spheres = [];
var directionalLight, pointLight;
var mouseX = 0, mouseY = 0;
var nodeHalfX = 0, nodeHalfY = 0;
var node = null;
function main(input) {
var fonc = "main";
node = input.node;
hack.log("node: "+hack.logPoint(node.offsetWidth, node.offsetHeight)+"@"+hack.logPoint(node.offsetLeft, node.offsetTop), flagNoLog, fonc);
nodeHalfX = node.offsetWidth / 2;
nodeHalfY = node.offsetHeight / 2;
camera = new THREE.PerspectiveCamera(60, node.offsetWidth / node.offsetHeight, 1, 100000);
camera.position.z = 3200;
scene = new THREE.Scene();
var geometry = new THREE.SphereGeometry(100, 32, 16);
var path = "tw:textures/cube/pisa/";
var format = '.png';
var urls = [
path + 'px' + format, path + 'nx' + format,
path + 'py' + format, path + 'ny' + format,
path + 'pz' + format, path + 'nz' + format
];
var textureCube = THREE.ImageUtils.loadTextureCube( urls );
var material = new THREE.MeshBasicMaterial({color: 0xffffff, envMap: textureCube});
for (var i = 0; i < 500; i++) {
var mesh = new THREE.Mesh(geometry, material);
mesh.position.x = Math.random() * 10000 - 5000;
mesh.position.y = Math.random() * 10000 - 5000;
mesh.position.z = Math.random() * 10000 - 5000;
mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 3 + 1;
scene.add(mesh);
spheres.push(mesh);
}
// Skybox
var shader = THREE.ShaderLib["cube"];
shader.uniforms[ "tCube" ].value = textureCube;
var material = new THREE.ShaderMaterial({
fragmentShader: shader.fragmentShader,
vertexShader: shader.vertexShader,
uniforms: shader.uniforms,
side: THREE.BackSide
}),
mesh = new THREE.Mesh(new THREE.BoxGeometry(100000, 100000, 100000), material);
scene.add(mesh);
// Rendering
renderer = new THREE.WebGLRenderer();
node.appendChild( renderer.domElement );
var width = node.offsetWidth || 2;
var height = node.offsetHeight || 2;
effect = new THREE.AnaglyphEffect(renderer);
effect.setSize(width, height);
node.addEventListener("mousemove", onMouseMove, false);
var onTiddlerRefresh = function() {
var fonc = "onTiddlerRefresh";
nodeHalfX = node.offsetWidth / 2,
nodeHalfY = node.offsetHeight / 2,
camera.aspect = node.offsetWidth / node.offsetHeight;
camera.updateProjectionMatrix();
effect.setSize(node.offsetWidth, node.offsetHeight);
effect.render(scene, camera);
};
onTiddlerRefresh();
// Animation
var animation = new Tools.Animation(node, render, true);
animation.start();
return {onTiddlerRefresh: onTiddlerRefresh};
}
function onMouseMove(event) {
fonc = "onDocumentMouseMove";
var factor = 10;
// Origin (0,0) = center of the node
mouseX = event.clientX + window.pageXOffset - node.offsetLeft - nodeHalfX;
mouseY = event.clientY + window.pageYOffset - node.offsetTop - nodeHalfY;
hack.log("mouse = "+hack.logPoint(mouseX, mouseY), flagNoLog, fonc);
}
function render() {
var fonc = "render";
var timer = 0.0001 * Date.now();
var cameraDelta = 0.7;
var mouseFactor = 15;
camera.position.x += (mouseX * mouseFactor - camera.position.x) * cameraDelta;
camera.position.y += (-mouseY * mouseFactor - camera.position.y) * cameraDelta;
hack.log("camera.position = "+hack.logPoint(camera.position.x, camera.position.y), flagNoLog, fonc);
camera.lookAt(scene.position);
for (var i = 0, il = spheres.length; i < il; i++) {
var sphere = spheres[i];
sphere.position.x = 5000 * Math.cos(timer + i);
sphere.position.y = 5000 * Math.sin(timer + i * 1.1);
}
effect.render(scene, camera);
}
Model by [[mirada|http://mirada.com]] from [[rome|http://www.ro.me]].
@@float:right;
[[View source|Three.js/Demos/horse.js]]
@@
<$view3js tiddler="Three.js/Demos/horse.js" class="threejs-screen"/>
require("./Lib/Controls/OrbitControls.js");
var flagNoLog = true;
var renderer, scene, camera, animation, rootNode;
var prevTime = Date.now();
function threePointLight() {
var directionalLight = new THREE.DirectionalLight( 0xb8b8b8 );
directionalLight.position.set(1, 1, 1).normalize();
directionalLight.intensity = 1.0;
scene.add( directionalLight );
directionalLight = new THREE.DirectionalLight( 0xb8b8b8 );
directionalLight.position.set(-1, 0.6, 0.5).normalize();
directionalLight.intensity = 0.5;
scene.add(directionalLight);
directionalLight = new THREE.DirectionalLight();
directionalLight.position.set(-0.3, 0.6, -0.8).normalize( 0xb8b8b8 );
directionalLight.intensity = 0.45;
scene.add(directionalLight);
}
function objet(geometry, color, x, y, z) {
var obj = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: color}));
obj.position.set(x, y, z);
scene.add(obj);
}
function render() {
if (animation) {
var time = Date.now();
animation.update(time - prevTime);
prevTime = time;
}
renderer.render(scene, camera);
}
function main(input) {
var fonc = "main";
hack.log("input.node geometry = "+hack.logPoint(input.node.offsetWidth, input.node.offsetHeight), hack.bug, fonc);
scene = new THREE.Scene();
scene.add(new THREE.GridHelper(20, 2.5));
camera = new THREE.PerspectiveCamera(75, 1, 0.1, 1000);
camera.aspect = input.node.offsetWidth / input.node.offsetHeight;
renderer = new THREE.WebGLRenderer({antialias: true, alpha: true});
renderer.setSize(input.node.innerWidth, input.node.innerHeight);
input.node.appendChild(renderer.domElement);
var geo = new THREE.BoxGeometry(5,5,5);
objet(geo, 0xff0000, -20, 0, 20);
objet(geo, 0x0000ff, 20, 0, 20);
objet(geo, 0x0c0c0c, -20, 0, -20);
objet(geo, 0x00ff00, 20, 0, -20);
var orbit = new THREE.OrbitControls(camera, input.node);
orbit.addEventListener("change", render);
camera.position.z = 40;
camera.position.x = 40;
camera.position.y = 40;
var target = new THREE.Vector3(0, 1, 0);
camera.lookAt( target );
orbit.target = target;
camera.updateProjectionMatrix();
threePointLight();
var loader = new THREE.JSONLoader(true);
loader.load( "tw:models/animated/horse.json", function (geometry) {
var mesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({color: 0x606060, morphTargets: true, overdraw: 0.5}));
mesh.scale.set(0.1, 0.1, 0.1);
mesh.position.set(0, 0, 0);
scene.add(mesh);
animation = new THREE.MorphAnimation(mesh);
animation.play();
});
var onTiddlerRefresh = function() {
var fonc = "onTiddlerRefresh";
hack.log("input.node geometry = "+hack.logPoint(input.node.offsetWidth, input.node.offsetHeight), flagNoLog, fonc);
camera.aspect = input.node.offsetWidth / input.node.offsetHeight;
camera.updateProjectionMatrix();
renderer.setSize(input.node.offsetWidth, input.node.offsetHeight );
renderer.render(scene, camera);
}
onTiddlerRefresh();
render();
return {onTiddlerRefresh: onTiddlerRefresh};
}
[[three.js|http://threejs.org/]] - featuring lava shader by [[TheGameMaker|http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=21057]]
@@float:right;
[[View source|Three.js/Demos/lava.js]]
@@
<$view3js tiddler="Three.js/Demos/lava.js" height=400/>
require("./Lib/Shaders/ConvolutionShader.js");
require("./Lib/Shaders/CopyShader.js");
require("./Lib/Shaders/FilmShader.js");
require("./Lib/Postprocessing/EffectComposer.js");
require("./Lib/Postprocessing/ShaderPass.js");
require("./Lib/Postprocessing/MaskPass.js");
require("./Lib/Postprocessing/RenderPass.js");
require("./Lib/Postprocessing/BloomPass.js");
require("./Lib/Postprocessing/FilmPass.js");
var Stats = require("./Lib/stats-min.js").Stats;
var Tools = require("./Lib/tools.js").Tools;
var fragmentShader = ""+
"uniform float time;"+
"uniform vec2 resolution;"+
"uniform float fogDensity;"+
"uniform vec3 fogColor;"+
"uniform sampler2D texture1;"+
"uniform sampler2D texture2;"+
"varying vec2 vUv;"+
"void main( void ) {;"+
"vec2 position = -1.0 + 2.0 * vUv;"+
"vec4 noise = texture2D( texture1, vUv );"+
"vec2 T1 = vUv + vec2( 1.5, -1.5 ) * time *0.02;"+
"vec2 T2 = vUv + vec2( -0.5, 2.0 ) * time * 0.01;"+
"T1.x += noise.x * 2.0;"+
"T1.y += noise.y * 2.0;"+
"T2.x -= noise.y * 0.2;"+
"T2.y += noise.z * 0.2;"+
"float p = texture2D( texture1, T1 * 2.0 ).a;"+
"vec4 color = texture2D( texture2, T2 * 2.0 );"+
"vec4 temp = color * ( vec4( p, p, p, p ) * 2.0 ) + ( color * color - 0.1 );"+
"if( temp.r > 1.0 ){ temp.bg += clamp( temp.r - 2.0, 0.0, 100.0 ); }"+
"if( temp.g > 1.0 ){ temp.rb += temp.g - 1.0; }"+
"if( temp.b > 1.0 ){ temp.rg += temp.b - 1.0; }"+
"gl_FragColor = temp;"+
"float depth = gl_FragCoord.z / gl_FragCoord.w;"+
"const float LOG2 = 1.442695;"+
"float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );"+
"fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );"+
"gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );"+
"}";
var vertexShader = ""+
"uniform vec2 uvScale;"+
"varying vec2 vUv;"+
"void main() {"+
"vUv = uvScale * uv;"+
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );"+
"gl_Position = projectionMatrix * mvPosition;"+
"}";
var container, stats;
var clock = new THREE.Clock();
var camera, scene, renderer, composer;
var uniforms, material, mesh;
var mouseX = 0, mouseY = 0,
lat = 0, lon = 0, phy = 0, theta = 0;
var width = 0;
var height = 0;
var windowHalfX = 0;
var windowHalfY = 0;
var node = null;
var flagStats = false;
function main(input) {
var func = "main";
node = input.node;
width = node.offsetWidth || 2;
height = node.offsetHeight || 2;
windowHalfX = width / 2;
windowHalfY = height / 2;
container = document.getElementById( 'container' );
camera = new THREE.PerspectiveCamera( 35, windowHalfX / windowHalfY, 1, 3000 );
camera.position.z = 4;
scene = new THREE.Scene();
uniforms = {
fogDensity: { type: "f", value: 0.45 },
fogColor: { type: "v3", value: new THREE.Vector3( 0, 0, 0 ) },
time: { type: "f", value: 1.0 },
resolution: { type: "v2", value: new THREE.Vector2() },
uvScale: { type: "v2", value: new THREE.Vector2( 3.0, 1.0 ) },
texture1: { type: "t", value: THREE.ImageUtils.loadTexture( "tw:textures/lava/cloud.png" ) },
texture2: { type: "t", value: THREE.ImageUtils.loadTexture( "tw:textures/lava/lavatile.jpg" ) }
};
uniforms.texture1.value.wrapS = uniforms.texture1.value.wrapT = THREE.RepeatWrapping;
uniforms.texture2.value.wrapS = uniforms.texture2.value.wrapT = THREE.RepeatWrapping;
var size = 0.65;
material = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader
} );
mesh = new THREE.Mesh( new THREE.TorusGeometry( size, 0.3, 30, 30 ), material );
mesh.rotation.x = 0.3;
scene.add( mesh );
//
renderer = new THREE.WebGLRenderer( { antialias: true } );
node.appendChild( renderer.domElement );
renderer.autoClear = false;
//
var renderModel = new THREE.RenderPass( scene, camera );
var effectBloom = new THREE.BloomPass( 1.25 );
var effectFilm = new THREE.FilmPass( 0.35, 0.95, 2048, false );
effectFilm.renderToScreen = true;
composer = new THREE.EffectComposer( renderer );
composer.addPass( renderModel );
composer.addPass( effectBloom );
composer.addPass( effectFilm );
//
if (flagStats) stats = Tools.addStats(node);
var onTiddlerRefresh = onWindowResize;
onTiddlerRefresh();
// Animation
var animation = new Tools.Animation(node, function() {
animate();
}, true);
animation.start();
return {onTiddlerRefresh: onTiddlerRefresh};
}
function onWindowResize( event ) {
uniforms.resolution.value.x = node.offsetWidth;
uniforms.resolution.value.y = node.offsetHeight;
renderer.setSize( node.offsetWidth, node.offsetHeight );
camera.aspect = node.offsetWidth / node.offsetHeight;
camera.updateProjectionMatrix();
composer.reset();
}
//
function animate() {
//requestAnimationFrame( animate );
render();
if (flagStats) stats.update();
}
function render() {
var delta = 5 * clock.getDelta();
uniforms.time.value += 0.2 * delta;
mesh.rotation.y += 0.0125 * delta;
mesh.rotation.x += 0.05 * delta;
renderer.clear();
composer.render( 0.01 );
}
[[three.js|http://threejs.org/]] - based on greggman's [[blob|http://webglsamples.googlecode.com/hg/blob/blob.html]], original code by Henrik Rydgård
@@float:right;
[[View source|Three.js/Demos/marchingcubes.js]]
@@
<$view3js tiddler="Three.js/Demos/marchingcubes.js" height=400/>
require("./Lib/Controls/TrackballControls.js");
require("./Lib/Shaders/CopyShader.js");
require("./Lib/Shaders/FXAAShader.js");
require("./Lib/Shaders/HorizontalTiltShiftShader.js");
require("./Lib/Shaders/VerticalTiltShiftShader.js");
require("./Lib/Postprocessing/EffectComposer.js");
require("./Lib/Postprocessing/RenderPass.js");
require("./Lib/Postprocessing/BloomPass.js");
require("./Lib/Postprocessing/ShaderPass.js");
require("./Lib/Postprocessing/MaskPass.js");
require("./Lib/Postprocessing/SavePass.js");
require("./Lib/MarchingCubes.js");
require("./Lib/ShaderToon.js");
var Tools = require("./Lib/tools.js").Tools;
var controls, renderTarget;
var MARGIN = 0;
var container, stats;
var camera, scene, renderer;
var mesh, texture, geometry, materials, material, current_material;
var light, pointLight, ambientLight;
var effect, resolution, numBlobs;
var composer, effectFXAA, hblur, vblur;
var effectController;
var time = 0;
var clock = new THREE.Clock();
var node = null;
var flagStats = false;
var animation = null;
var menu = null;
function main(input) {
var func = "main";
node = input.node;
// CAMERA
camera = new THREE.PerspectiveCamera( 45, node.offsetWidth / node.offsetHeight, 1, 10000 );
camera.position.set( -500, 500, 1500 );
// SCENE
scene = new THREE.Scene();
// LIGHTS
light = new THREE.DirectionalLight( 0xffffff );
light.position.set( 0.5, 0.5, 1 );
scene.add( light );
pointLight = new THREE.PointLight( 0xff3300 );
pointLight.position.set( 0, 0, 100 );
scene.add( pointLight );
ambientLight = new THREE.AmbientLight( 0x080808 );
scene.add( ambientLight );
// MATERIALS
materials = generateMaterials();
current_material = "shiny";
// MARCHING CUBES
resolution = 28;
numBlobs = 10;
effect = new THREE.MarchingCubes( resolution, materials[ current_material ].m, true, true );
effect.position.set( 0, 0, 0 );
effect.scale.set( 700, 700, 700 );
effect.enableUvs = false;
effect.enableColors = false;
scene.add( effect );
// RENDERER
renderer = new THREE.WebGLRenderer();
renderer.setClearColor( 0x050505, 1 );
renderer.setSize( node.offsetWidth, node.offsetHeight );
renderer.gammaInput = true;
renderer.gammaOutput = true;
node.appendChild( renderer.domElement );
// CONTROLS
controls = new THREE.TrackballControls( camera, renderer.domElement );
// COMPOSER
renderer.autoClear = false;
var renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };
renderTarget = new THREE.WebGLRenderTarget( node.offsetWidth, node.offsetHeight, renderTargetParameters );
effectFXAA = new THREE.ShaderPass( THREE.FXAAShader );
hblur = new THREE.ShaderPass( THREE.HorizontalTiltShiftShader );
vblur = new THREE.ShaderPass( THREE.VerticalTiltShiftShader );
var bluriness = 8;
hblur.uniforms[ 'h' ].value = bluriness / node.offsetWidth;
vblur.uniforms[ 'v' ].value = bluriness / node.offsetHeight;
hblur.uniforms[ 'r' ].value = vblur.uniforms[ 'r' ].value = 0.5;
effectFXAA.uniforms[ 'resolution' ].value.set( 1 / node.offsetWidth, 1 / node.offsetHeight );
composer = new THREE.EffectComposer( renderer, renderTarget );
var renderModel = new THREE.RenderPass( scene, camera );
vblur.renderToScreen = true;
//effectFXAA.renderToScreen = true;
composer = new THREE.EffectComposer( renderer, renderTarget );
composer.addPass( renderModel );
composer.addPass( effectFXAA );
composer.addPass( hblur );
composer.addPass( vblur );
// GUI
menu = new Tools.Gui(node);
setupGui(menu.get());
//
if (flagStats) stats = Tools.addStats(node);
var onTiddlerRefresh = onWindowResize;
onTiddlerRefresh();
// Animation
animation = new Tools.Animation(node, function() {
animate();
}, false);
animation.start();
return {onTiddlerRefresh: onTiddlerRefresh};
}
//
function onWindowResize( event ) {
camera.aspect = node.offsetWidth / node.offsetHeight;
camera.updateProjectionMatrix();
renderer.setSize( node.offsetWidth, node.offsetHeight );
composer.setSize( node.offsetWidth, node.offsetHeight );
hblur.uniforms[ 'h' ].value = 4 / node.offsetWidth;
vblur.uniforms[ 'v' ].value = 4 / node.offsetHeight;
effectFXAA.uniforms[ 'resolution' ].value.set( 1 / node.offsetWidth, 1 / node.offsetHeight );
menu.onTiddlerRefresh();
}
function generateMaterials() {
// environment map
var path = "tw:textures/cube/SwedishRoyalCastle/";
var format = '.jpg';
var urls = [
path + 'px' + format, path + 'nx' + format,
path + 'py' + format, path + 'ny' + format,
path + 'pz' + format, path + 'nz' + format
];
var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
reflectionCube.format = THREE.RGBFormat;
var refractionCube = new THREE.Texture( reflectionCube.image, new THREE.CubeRefractionMapping() );
reflectionCube.format = THREE.RGBFormat;
// toons
var toonMaterial1 = createShaderMaterial( "toon1", light, ambientLight ),
toonMaterial2 = createShaderMaterial( "toon2", light, ambientLight ),
hatchingMaterial = createShaderMaterial( "hatching", light, ambientLight ),
hatchingMaterial2 = createShaderMaterial( "hatching", light, ambientLight ),
dottedMaterial = createShaderMaterial( "dotted", light, ambientLight ),
dottedMaterial2 = createShaderMaterial( "dotted", light, ambientLight );
hatchingMaterial2.uniforms.uBaseColor.value.setRGB( 0, 0, 0 );
hatchingMaterial2.uniforms.uLineColor1.value.setHSL( 0, 0.8, 0.5 );
hatchingMaterial2.uniforms.uLineColor2.value.setHSL( 0, 0.8, 0.5 );
hatchingMaterial2.uniforms.uLineColor3.value.setHSL( 0, 0.8, 0.5 );
hatchingMaterial2.uniforms.uLineColor4.value.setHSL( 0.1, 0.8, 0.5 );
dottedMaterial2.uniforms.uBaseColor.value.setRGB( 0, 0, 0 );
dottedMaterial2.uniforms.uLineColor1.value.setHSL( 0.05, 1.0, 0.5 );
var texture = THREE.ImageUtils.loadTexture( "tw:textures/UV_Grid_Sm.jpg" );
texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
var materials = {
"chrome" :
{
m: new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: reflectionCube } ),
h: 0, s: 0, l: 1
},
"liquid" :
{
m: new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: refractionCube, refractionRatio: 0.85 } ),
h: 0, s: 0, l: 1
},
"shiny" :
{
m: new THREE.MeshPhongMaterial( { color: 0x550000, specular: 0x440000, envMap: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.3, metal: true } ),
h: 0, s: 0.8, l: 0.2
},
"matte" :
{
m: new THREE.MeshPhongMaterial( { color: 0x000000, specular: 0x111111, shininess: 1 } ),
h: 0, s: 0, l: 1
},
"flat" :
{
m: new THREE.MeshPhongMaterial( { color: 0x000000, specular: 0x111111, shininess: 1, shading: THREE.FlatShading } ),
h: 0, s: 0, l: 1
},
"textured" :
{
m: new THREE.MeshPhongMaterial( { color: 0xffffff, specular: 0x111111, shininess: 1, map: texture } ),
h: 0, s: 0, l: 1
},
"colors" :
{
m: new THREE.MeshPhongMaterial( { color: 0xffffff, specular: 0xffffff, shininess: 2, vertexColors: THREE.VertexColors } ),
h: 0, s: 0, l: 1
},
"plastic" :
{
m: new THREE.MeshPhongMaterial( { color: 0x000000, specular: 0x888888, ambient: 0x000000, shininess: 250 } ),
h: 0.6, s: 0.8, l: 0.1
},
"toon1" :
{
m: toonMaterial1,
h: 0.2, s: 1, l: 0.75
},
"toon2" :
{
m: toonMaterial2,
h: 0.4, s: 1, l: 0.75
},
"hatching" :
{
m: hatchingMaterial,
h: 0.2, s: 1, l: 0.9
},
"hatching2" :
{
m: hatchingMaterial2,
h: 0.0, s: 0.8, l: 0.5
},
"dotted" :
{
m: dottedMaterial,
h: 0.2, s: 1, l: 0.9
},
"dotted2" :
{
m: dottedMaterial2,
h: 0.1, s: 1, l: 0.5
}
};
return materials;
}
function createShaderMaterial( id, light, ambientLight ) {
var shader = THREE.ShaderToon[ id ];
var u = THREE.UniformsUtils.clone( shader.uniforms );
var vs = shader.vertexShader;
var fs = shader.fragmentShader;
var material = new THREE.ShaderMaterial( { uniforms: u, vertexShader: vs, fragmentShader: fs } );
material.uniforms.uDirLightPos.value = light.position;
material.uniforms.uDirLightColor.value = light.color;
material.uniforms.uAmbientLightColor.value = ambientLight.color;
return material;
}
//
function setupGui(gui) {
var createHandler = function( id ) {
return function() {
var mat_old = materials[ current_material ];
mat_old.h = m_h.getValue();
mat_old.s = m_s.getValue();
mat_old.l = m_l.getValue();
current_material = id;
var mat = materials[ id ];
effect.material = mat.m;
m_h.setValue( mat.h );
m_s.setValue( mat.s );
m_l.setValue( mat.l );
if ( current_material === "textured" ) {
effect.enableUvs = true;
} else {
effect.enableUvs = false;
}
if ( current_material === "colors" ) {
effect.enableColors = true;
} else {
effect.enableColors = false;
}
};
};
effectController = {
material: "shiny",
speed: 1.0,
numBlobs: 10,
resolution: 28,
isolation: 80,
floor: true,
wallx: false,
wallz: false,
hue: 0.0,
saturation: 0.8,
lightness: 0.1,
lhue: 0.04,
lsaturation: 1.0,
llightness: 0.5,
lx: 0.5,
ly: 0.5,
lz: 1.0,
postprocessing: false,
"Start/Stop": function() {animation.startStop();},
dummy: function() {
}
};
var h, m_h, m_s, m_l;
// Start/Stop animation
gui.add(effectController, "Start/Stop");
// material (type)
h = gui.addFolder( "Materials" );
for ( var m in materials ) {
effectController[ m ] = createHandler( m );
h.add( effectController, m ).name( m );
}
// material (color)
h = gui.addFolder( "Material color" );
m_h = h.add( effectController, "hue", 0.0, 1.0, 0.025 );
m_s = h.add( effectController, "saturation", 0.0, 1.0, 0.025 );
m_l = h.add( effectController, "lightness", 0.0, 1.0, 0.025 );
// light (point)
h = gui.addFolder( "Point light color" );
h.add( effectController, "lhue", 0.0, 1.0, 0.025 ).name("hue");
h.add( effectController, "lsaturation", 0.0, 1.0, 0.025 ).name("saturation");
h.add( effectController, "llightness", 0.0, 1.0, 0.025 ).name("lightness");
// light (directional)
h = gui.addFolder( "Directional light orientation" );
h.add( effectController, "lx", -1.0, 1.0, 0.025 ).name("x");
h.add( effectController, "ly", -1.0, 1.0, 0.025 ).name("y");
h.add( effectController, "lz", -1.0, 1.0, 0.025 ).name("z");
// simulation
h = gui.addFolder( "Simulation" );
h.add( effectController, "speed", 0.1, 8.0, 0.05 );
h.add( effectController, "numBlobs", 1, 50, 1 );
h.add( effectController, "resolution", 14, 40, 1 );
h.add( effectController, "isolation", 10, 300, 1 );
h.add( effectController, "floor" );
h.add( effectController, "wallx" );
h.add( effectController, "wallz" );
// rendering
h = gui.addFolder( "Rendering" );
h.add( effectController, "postprocessing" );
}
// this controls content of marching cubes voxel field
function updateCubes( object, time, numblobs, floor, wallx, wallz ) {
object.reset();
// fill the field with some metaballs
var i, ballx, bally, ballz, subtract, strength;
subtract = 12;
strength = 1.2 / ( ( Math.sqrt( numblobs ) - 1 ) / 4 + 1 );
for ( i = 0; i < numblobs; i ++ ) {
ballx = Math.sin( i + 1.26 * time * ( 1.03 + 0.5 * Math.cos( 0.21 * i ) ) ) * 0.27 + 0.5;
bally = Math.abs( Math.cos( i + 1.12 * time * Math.cos( 1.22 + 0.1424 * i ) ) ) * 0.77; // dip into the floor
ballz = Math.cos( i + 1.32 * time * 0.1 * Math.sin( ( 0.92 + 0.53 * i ) ) ) * 0.27 + 0.5;
object.addBall(ballx, bally, ballz, strength, subtract);
}
if ( floor ) object.addPlaneY( 2, 12 );
if ( wallz ) object.addPlaneZ( 2, 12 );
if ( wallx ) object.addPlaneX( 2, 12 );
}
//
function animate() {
//requestAnimationFrame( animate );
render();
if (flagStats) stats.update();
}
function render() {
var delta = clock.getDelta();
time += delta * effectController.speed * 0.5;
controls.update( delta );
// marching cubes
if ( effectController.resolution !== resolution ) {
resolution = effectController.resolution;
effect.init( resolution );
}
if ( effectController.isolation !== effect.isolation ) {
effect.isolation = effectController.isolation;
}
updateCubes( effect, time, effectController.numBlobs, effectController.floor, effectController.wallx, effectController.wallz );
// materials
if ( effect.material instanceof THREE.ShaderMaterial ) {
if ( current_material === "dotted2" ) {
effect.material.uniforms.uLineColor1.value.setHSL( effectController.hue, effectController.saturation, effectController.lightness );
} else if ( current_material === "hatching2" ) {
var u = effect.material.uniforms;
u.uLineColor1.value.setHSL( effectController.hue, effectController.saturation, effectController.lightness );
u.uLineColor2.value.setHSL( effectController.hue, effectController.saturation, effectController.lightness );
u.uLineColor3.value.setHSL( effectController.hue, effectController.saturation, effectController.lightness );
u.uLineColor4.value.setHSL( ( effectController.hue + 0.2 % 1.0 ), effectController.saturation, effectController.lightness );
} else {
effect.material.uniforms.uBaseColor.value.setHSL( effectController.hue, effectController.saturation, effectController.lightness );
}
} else {
effect.material.color.setHSL( effectController.hue, effectController.saturation, effectController.lightness );
}
// lights
light.position.set( effectController.lx, effectController.ly, effectController.lz );
light.position.normalize();
pointLight.color.setHSL( effectController.lhue, effectController.lsaturation, effectController.llightness );
// render
if ( effectController.postprocessing ) {
composer.render( delta );
} else {
renderer.clear();
renderer.render( scene, camera );
}
}
[[three.js|http://threejs.org/]]
@@float:right;
[[View source|Three.js/Demos/molecules.js]]
@@
<$view3js tiddler="Three.js/Demos/molecules.js" height=500/>
require("./Lib/Controls/TrackballControls.js");
require("./Lib/Loaders/PDBLoader.js");
require("./Lib/Renderers/CSS2DRenderer.js");
var Stats = require("./Lib/stats-min.js").Stats;
var Tools = require("./Lib/tools.js").Tools;
var node = null;
var camera, scene, renderer, labelRenderer;
var controls;
var root;
var container = null, menu = null;
var MOLECULES = {
"Ethanol": "ethanol.pdb",
"Aspirin": "aspirin.pdb",
"Caffeine": "caffeine.pdb",
"Nicotine": "nicotine.pdb",
"LSD": "lsd.pdb",
"Cocaine": "cocaine.pdb",
"Cholesterol": "cholesterol.pdb",
"Lycopene": "lycopene.pdb",
"Glucose": "glucose.pdb",
"Aluminium oxide": "Al2O3.pdb",
"Cubane": "cubane.pdb",
"Copper": "cu.pdb",
"Fluorite": "caf2.pdb",
"Salt": "nacl.pdb",
"YBCO superconductor": "ybco.pdb",
"Buckyball": "buckyball.pdb",
//"Diamond": "diamond.pdb",
"Graphite": "graphite.pdb"
};
var loader = new THREE.PDBLoader();
function main(input) {
var func = "main";
node = input.node;
camera = new THREE.PerspectiveCamera( 70, node.offsetWidth / node.offsetHeight, 1, 5000 );
camera.position.z = 1500;
scene = new THREE.Scene();
var light = new THREE.HemisphereLight( 0xffffff, 0x000000 );
light.position.set( 1, 1, 1 );
scene.add( light );
root = new THREE.Object3D();
scene.add( root );
//
container = document.createElement("div");
node.appendChild(container);
menu = document.createElement("div");
menu.style = "position: relative; z-index:100; font-size: small; margin-left: 4px;";
menu.style.top = "" + (-node.offsetHeight -50) + "px";
node.appendChild(menu);
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setClearColor( 0x050505 );
renderer.setSize( node.offsetWidth, node.offsetHeight );
container.appendChild( renderer.domElement );
labelRenderer = new THREE.CSS2DRenderer();
labelRenderer.setSize( node.offsetWidth, node.offsetHeight );
/*
labelRenderer.domElement.style.position = 'absolute';
labelRenderer.domElement.style.top = '0';
labelRenderer.domElement.style.pointerEvents = 'none';
container.appendChild( labelRenderer.domElement );
*/
labelRenderer.domElement.style.position = 'relative';
labelRenderer.domElement.style.zIndex = 50;
labelRenderer.domElement.style.top = "" + (-node.offsetHeight - 8) + "px";
labelRenderer.domElement.style.left = "20px";
labelRenderer.domElement.style.pointerEvents = 'none';
labelRenderer.domElement.style.fontSize = 'x-small';
container.appendChild( labelRenderer.domElement );
//
controls = new THREE.TrackballControls( camera, renderer.domElement );
controls.rotateSpeed = 0.5;
controls.addEventListener( 'change', render );
//
loadMolecule( "tw:models/molecules/caffeine.pdb" );
createMenu();
var onTiddlerRefresh = onWindowResize;
onTiddlerRefresh();
// Animation
//var animation = new Tools.Animation(node, animate, true);
//animation.start();
animate();
return {onTiddlerRefresh: onTiddlerRefresh};
}
//
function generateButtonCallback( url ) {
return function ( event ) {
loadMolecule( url );
}
}
function createMenu() {
for ( var m in MOLECULES ) {
var button = document.createElement( 'button' );
button.innerHTML = m;
menu.appendChild( button );
var url = "tw:models/molecules/" + MOLECULES[ m ];
button.addEventListener( 'click', generateButtonCallback( url ), false );
}
}
//
function loadMolecule( url ) {
while( root.children.length > 0 ) {
var object = root.children[ 0 ];
object.parent.remove( object );
}
loader.load( url, function ( geometry, geometryBonds, json ) {
var boxGeometry = new THREE.BoxGeometry( 1, 1, 1 );
var sphereGeometry = new THREE.IcosahedronGeometry( 1, 2 );
var offset = geometry.center();
geometryBonds.applyMatrix( new THREE.Matrix4().makeTranslation( offset.x, offset.y, offset.z ) );
for ( var i = 0; i < geometry.vertices.length; i ++ ) {
var position = geometry.vertices[ i ];
var color = geometry.colors[ i ];
var element = geometry.elements[ i ];
var material = new THREE.MeshLambertMaterial( { color: color } );
var object = new THREE.Mesh( sphereGeometry, material );
object.position.copy( position );
object.position.multiplyScalar( 75 );
object.scale.multiplyScalar( 25 );
root.add( object );
var atom = json.atoms[ i ];
var text = document.createElement( 'div' );
text.className = 'label';
text.style.color = 'rgb(' + atom[ 3 ][ 0 ] + ',' + atom[ 3 ][ 1 ] + ',' + atom[ 3 ][ 2 ] + ')';
text.textContent = atom[ 4 ];
var label = new THREE.CSS2DObject( text );
label.position.copy( object.position );
root.add( label );
}
for ( var i = 0; i < geometryBonds.vertices.length; i += 2 ) {
var start = geometryBonds.vertices[ i ];
var end = geometryBonds.vertices[ i + 1 ];
start.multiplyScalar( 75 );
end.multiplyScalar( 75 );
var object = new THREE.Mesh( boxGeometry, new THREE.MeshLambertMaterial( 0xffffff ) );
object.position.copy( start );
object.position.lerp( end, 0.5 );
object.scale.set( 5, 5, start.distanceTo( end ) );
object.lookAt( end );
root.add( object );
}
render();
} );
}
//
function onWindowResize() {
camera.aspect = node.offsetWidth / node.offsetHeight;
camera.updateProjectionMatrix();
renderer.setSize( node.offsetWidth, node.offsetHeight );
labelRenderer.setSize( node.offsetWidth, node.offsetHeight );
render();
}
function animate() {
requestAnimationFrame( animate );
controls.update();
var time = Date.now() * 0.0004;
root.rotation.x = time;
root.rotation.y = time * 0.7;
render();
}
function render() {
renderer.render( scene, camera );
labelRenderer.render( scene, camera );
}
.threejs-screen {
background: #1b1c1e;
background-image: linear-gradient(#7d8fa3, #1b1c1e);
}
The base plugin : [[Three.js|$:/plugins/rboue/Three.js]]
<br>
The extra plugin : [[Three.js-plus|$:/plugins/rboue/Three.js-plus]]
The extra plugin extends base plugin with numerous modules. With both you have an almost complete Three.js system.
!Demos
A few demos to play and see what you can do with Three.js :
[[Horse|Three.js/Demos/horse]]
[[Bubbles|Three.js/Demos/bubbles]]
[[Molecules|Three.js/Demos/molecules]]
[[Lava|Three.js/Demos/lava]]
[[Marchingcubes|Three.js/Demos/marchingcubes]]
[[Arealights|Three.js/Demos/arealights]]
!What is Three.js ?
A library that makes ~WebGL - 3D in the browser.
Links :
[[threejs.org|http://threejs.org/]]
[[Computer-graphics|http://math.hws.edu/eck/cs424/notes2013/]]
[[WebGL|http://get.webgl.org/]]
[[webglsamples.org|http://webglsamples.org/]]
!Three.js in ~TiddlyWiki environment
"""
The plugin provides a `<$view3js>` widget to execute Three.js programs and display graphical results and animations. ~TiddlyWiki can be used as a development tool for 3D - ~WebGL graphics.
__''What is a Three.js program ?''__
A Three.js program is a set of javascript instructions contained in a tiddler of type "application/javascript". It is run by a `<$view3js>` widget. It accesses the Three.js library via the `THREE` javascript object.
Requirements :
"""
* A main() function must be defined at top level. It is the program's entry point.
* The main() function must define one argument, an object with a `node` property, a reference to the root node of the widget. This node is a container for the Three.js renderer created by the program (or else your 3D objects will not stay inside the widget).
* The main() function should return an object with a callback property named `onTiddlerRefresh`. This callback is called every time the widget is refreshed by the ~TiddlyWiki's core, for example to resize Three.js scene and rendering.
* Program's exceptions are intercepted and error messages displayed. The program stops after the first exception.
* The program has access to widget context, especially the include mechanism (cf. require() function).
"""
The include mechanism is a simple way to extend the `THREE` object with modules or add new functionalities to the program. See plugin content for existing modules and watch demos and examples at threejs.org. Three.js library is documented at threejs.org.
The //tools.js// module defines useful tools to manipulate Three.js in ~TiddlyWiki environment. You can add it to your program with the following instruction :
`var Tools = require("./Lib/tools.js").Tools;`
__''3D data and model loading''__
In conventional Three.js programs, 3D data and models are searched around in server files or web pages (URLs beginning with "http://"). In ~TiddlyWiki's case, data are searched in local tiddlers.
The plugin allows the loading of tiddlers with the use of a special type of URL :
''tw:''`title of a tiddler`
The plugin offers also an ambryo of filesystem and relative path handling. Let's say a Three.js program is stored in the tiddler named "My directory/my program", a 3D model in "My directory/my 3D body" and another 3D model in "My other directory/my 3D head". With relative path you can simply reference "my 3D body" and "my 3D head" in your program. This behaviour is configuration dependent (see below). You must define a `filesystem.PATH` attribute with the list of directories to search for page references.
Example of configuration and data loading with relative tiddler references :
Configuration tiddler (`$:config/rboue/Three.js`) :
"""
```
{
"filesystem": {
"PATH": "My directory;My other directory"
},
...
}
```
or
Widget definition :
```
<$view3js tiddler="My directory/my program" path="My directory;My other directory" />
```
Program :
```
...
var loader = new THREE.JSONLoader(true);
loader.load("tw:my 3D body", function(geometry) {// etc...});
loader.load("tw:my 3D head", function(geometry) {// etc...});
...
```
"""
__''<$view3js> widget''__
The widget offers an UI to Three.js rendering.
It executes a Three.js program and displays graphical results and animations.
The content of the `<$view3js>` widget is not interpreted.
"""
|Attribute |Description |h
|tiddler |The tiddler of the Three.js program |
|width |Width of the widget in pixel |
|height |Height of the widget in pixel (300 by default) |
|path |A list of directories to search under for the data tiddlers expected by Three.js loaders. It superseded the global configuration's attribute `filesystem.PATH` |
|class |An optional CSS class name to be assigned to the HTML element |
"""
__''Configuration''__
The plugin is configured via the `$:config/rboue/Three.js` tiddler (of type `application/json`).
Example of configuration :
"""
```
{
"filesystem": {
"PATH": "Three.js/Tests;Three.js/Tests1"
}
}
```
|Attribute |Description |h
|filesystem |Activates the pseudo filesystem behaviour. `PATH` is a list of absolute directories to search under when data tiddlers are loaded by the Three.js loaders |
{
"metadata" : {
"formatVersion" : 3,
"description" : "3D assets and textures for ROME - 3 Dreams of Black - at http://ro.me are licensed under a Creative CommonsAttribution-NonCommercial-ShareAlike 3.0 Unported License ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )."
},
"scale" : 10.000000,
"materials": [ {
"DbgColor" : 15658734,
"DbgIndex" : 0,
"DbgName" : "comp_horse_rig:blinn9SG",
"colorAmbient" : [0.0, 0.0, 0.0],
"colorDiffuse" : [0.41999999999999998, 0.56999999999999995, 0.45000000000000001],
"colorSpecular" : [1.0, 0.42999999999999999, 0.35999999999999999],
"illumination" : 4,
"opticalDensity" : 1.0
}],
"vertices": [0,1389,54,0,1408,116,0,1372,-298,0,1439,-555,0,1131,-976,0,1259,-956,0,1394,-842,0,808,-505,0,779,-253,0,734,9,-5,1670,554,-11,1443,895,0,971,701,0,1038,-964,0,941,-871,-1,896,647,0,816,421,-5,1756,1032,4,1712,1112,-5,1409,918,29,1343,1240,14,1574,1167,5,1353,1004,20,1246,1119,34,1287,1277,20,1210,1113,28,1172,1181,23,1254,1154,24,1180,1142,27,1180,1173,0,854,-702,23,1431,1210,33,1194,1240,0,1382,-872,0,1334,-913,0,1425,-1083,0,1319,-1080,0,1483,-1203,0,1338,-1247,-4,1364,-1607,-4,1256,-1696,34,1224,1253,0,1497,282,0,1082,707,-18,1764,797,0,902,-786,18,1502,1189,0,1197,694,0,837,553,271,1031,184,225,1236,7,272,1169,-179,261,1009,-455,277,860,-34,145,1291,207,250,1105,467,144,1336,-362,201,1402,-547,291,856,-749,173,1289,525,137,1349,-861,210,834,-270,256,950,451,209,1091,336,257,867,623,232,1036,597,221,927,678,106,1544,711,66,1646,583,78,1511,892,104,966,675,148,1018,-954,243,878,-847,248,800,583,116,1593,948,49,1736,1066,105,1622,986,35,1710,1109,112,1496,896,108,1594,1085,94,1418,907,74,1294,1128,98,1503,1113,50,1342,1237,51,1575,1161,70,1367,998,57,1254,1121,275,1140,-715,102,1133,-993,86,1255,1140,73,1299,1249,63,1209,1137,75,1196,1164,73,1201,1161,204,830,-522,93,884,632,86,880,-875,83,784,471,111,1708,1124,72,1796,1207,69,1786,1209,153,294,1278,130,291,1333,140,298,1217,82,38,-1190,64,30,-1114,63,46,-1217,58,290,1332,72,298,1213,-28,48,-1119,-6,58,-1217,77,835,-761,-34,56,-1166,59,1706,1107,85,1690,1088,90,1688,1071,64,1720,1095,52,1429,1204,82,1694,1030,42,1290,-937,96,1239,1204,82,1219,1201,200,905,352,23,1368,-879,33,1343,-893,34,1392,-1080,65,1330,-1079,46,1444,-1217,82,1358,-1250,42,1361,-1544,75,1310,-1586,96,1277,1210,75,1263,1209,109,1590,1139,71,1709,1100,100,1740,1151,112,1751,1146,83,1702,1044,67,820,603,43,294,1271,67,1485,299,80,1095,683,65,1232,1238,62,1197,1229,63,1176,1174,54,1252,1141,56,1184,1168,45,1184,1140,60,1760,1154,88,1737,1126,117,1710,1112,98,1750,1061,64,1770,1147,326,783,-599,291,1098,-503,210,1126,-904,243,674,-884,259,730,-915,216,781,-946,135,811,-958,98,716,-929,143,660,-868,78,124,-1146,0,144,-1161,-1,142,-1202,21,149,-1226,74,136,-1218,84,121,-1194,87,1657,881,44,1734,800,170,573,-1141,164,560,-1099,185,708,903,188,746,928,177,782,948,159,592,-1172,161,674,1001,152,690,1020,155,655,980,97,206,-1227,97,213,-1198,100,200,-1255,89,554,-1123,82,776,940,118,620,-1190,85,690,1015,84,691,890,88,642,962,24,229,-1212,45,209,-1265,68,742,922,79,675,997,85,574,-1153,30,230,-1239,127,459,1229,76,458,1226,62,443,1204,78,428,1183,129,430,1188,145,443,1207,80,1321,1187,168,824,-515,71,888,-741,35,1506,1186,56,1553,1165,114,1564,1068,96,1403,1063,49,872,-711,102,824,-510,94,1395,115,102,1376,59,142,808,-256,166,766,15,73,1228,667,197,1196,590,-270,1067,192,-225,1236,7,-266,1151,-201,-235,987,-609,-277,860,-34,-145,1307,225,-248,1136,510,-142,1307,-364,-202,1388,-542,-269,962,-976,-172,1288,549,-139,1355,-865,-200,821,-319,-256,1034,444,-207,1172,384,-261,877,503,-232,1022,606,-226,873,593,-124,1542,705,-78,1645,579,-105,1509,891,-106,920,652,-155,1110,-1023,-232,1037,-1056,-251,870,430,-130,1585,973,-50,1733,1076,-113,1615,1007,-26,1707,1116,-130,1488,921,-95,1587,1105,-105,1411,927,-33,1291,1139,-74,1497,1130,7,1341,1241,-22,1573,1168,-60,1362,1011,-16,1252,1128,-275,1157,-744,-110,1191,-979,-41,1251,1152,-9,1297,1257,-15,1207,1144,-22,1193,1174,-20,1198,1170,-184,859,-632,-96,848,571,-79,1073,-1085,-85,843,393,-102,1719,1140,-59,1831,1182,-55,1822,1187,-95,10,485,-77,17,541,-78,8,425,-166,462,-1813,-161,395,-1854,-142,482,-1800,-5,30,544,-10,20,425,-66,388,-1859,-71,473,-1805,-55,978,-1001,-52,427,-1835,-50,1704,1118,-78,1686,1105,-86,1682,1090,-58,1718,1106,-6,1427,1210,-86,1689,1047,-45,1304,-923,-37,1235,1217,-22,1215,1211,-199,990,336,-23,1368,-879,-33,1343,-893,-32,1391,-1080,-63,1330,-1078,-46,1443,-1215,-81,1356,-1248,-50,1360,-1543,-82,1308,-1583,-38,1273,1223,-17,1260,1219,-85,1584,1159,-63,1706,1113,-89,1758,1153,-103,1767,1146,-85,1695,1061,-70,809,521,13,29,484,-67,1485,299,-80,1078,693,0,1230,1245,3,1196,1235,-6,1174,1181,-9,1250,1148,-1,1182,1174,3,1183,1144,-51,1779,1143,-81,1748,1129,-109,1716,1129,-100,1737,1066,-56,1786,1134,-285,840,-846,-275,1059,-602,-218,1190,-907,-204,776,-1116,-227,831,-1145,-192,887,-1176,-115,927,-1191,-67,836,-1165,-102,774,-1104,-151,385,-1755,-70,386,-1750,-62,425,-1736,-80,444,-1715,-134,445,-1717,-151,430,-1737,-118,1655,882,-81,1732,803,-154,720,-1416,-153,686,-1379,-200,550,432,-203,545,478,-193,543,521,-134,747,-1435,-165,445,456,-156,440,481,-159,452,429,-142,416,-1650,-145,407,-1627,-142,431,-1669,-81,676,-1404,-98,553,513,-86,769,-1437,-90,452,479,-100,560,412,-93,468,410,-69,409,-1628,-86,433,-1670,-83,554,475,-84,459,457,-69,706,-1422,-70,426,-1648,-90,145,415,-40,155,414,-26,160,390,-42,168,362,-92,158,365,-107,147,387,-29,1317,1198,-159,840,-563,-65,928,-816,1,1505,1189,-26,1550,1174,-102,1557,1090,-75,1398,1080,-44,896,-759,-100,827,-525,-94,1395,115,-102,1376,59,-139,800,-275,-166,766,15,-73,1224,673,-197,1184,625,140,1138,642,161,991,644,151,925,695,133,796,956,124,701,1032,100,472,1241,98,289,1349,104,293,1295,105,297,1233,104,417,1172,125,642,964,128,683,884,165,761,525,208,851,451,-208,962,399,-168,854,383,-143,559,401,-130,462,410,-68,168,346,-44,16,442,-48,20,504,-46,24,559,-64,145,432,-128,440,498,-149,545,538,-155,859,618,-162,959,627,-140,1115,669,167,882,-901,174,810,-957,149,614,-1185,73,190,-1271,53,147,-1228,28,49,-1200,12,46,-1157,10,35,-1084,37,130,-1130,59,217,-1185,124,559,-1094,199,648,-867,264,761,-557,-162,1076,-1105,-154,921,-1189,-118,769,-1437,-116,437,-1680,-111,449,-1709,-110,463,-1811,-100,425,-1836,-111,363,-1874,-112,366,-1766,-109,394,-1616,-114,675,-1372,-157,755,-1101,-218,815,-813,152,366,1246,133,403,1214,104,412,1203,74,403,1208,48,366,1242,70,378,1275,99,384,1287,129,376,1279,-27,103,475,-1,94,445,-30,121,405,-61,122,387,-89,111,407,-104,76,443,-86,94,476,-58,105,493,-38,1362,1180,0,1386,1224,26,1386,1225,50,1387,1219,82,1366,1168,-32,1400,-944,-42,1356,-975,0,1342,-976,43,1357,-975,33,1400,-944,0,1413,-944,-82,1321,-1424,-1,1306,-1415,79,1323,-1426,44,1413,-1423,-2,1456,-1408,-50,1412,-1421,197,654,-1107,173,693,-1143,170,714,-1163,95,712,-1154,97,674,-1135,91,625,-1072,149,608,-1057,193,620,-1069,-65,838,-1383,-141,840,-1391,-143,815,-1375,-167,771,-1345,-163,730,-1313,-120,716,-1303,-61,736,-1315,-66,797,-1369,93,1553,1130,107,1577,1113,108,1563,1086,98,1537,1100,-68,1548,1146,-87,1571,1133,-92,1557,1106,-79,1531,1118,111,1556,1111,-90,1549,1131],
"morphTargets": [
{ "name": "horse_A_001", "vertices": [0,1389,54,0,1408,116,0,1372,-298,0,1439,-555,0,1131,-976,0,1259,-956,0,1394,-842,0,808,-505,0,779,-253,0,734,9,-5,1670,554,-11,1443,895,0,971,701,0,1038,-964,0,941,-871,-1,896,647,0,816,421,-5,1756,1032,4,1712,1112,-5,1409,918,29,1343,1240,14,1574,1167,5,1353,1004,20,1246,1119,34,1287,1277,20,1210,1113,28,1172,1181,23,1254,1154,24,1180,1142,27,1180,1173,0,854,-702,23,1431,1210,33,1194,1240,0,1382,-872,0,1334,-913,0,1425,-1083,0,1319,-1080,0,1483,-1203,0,1338,-1247,-4,1364,-1607,-4,1256,-1696,34,1224,1253,0,1497,282,0,1082,707,-18,1764,797,0,902,-786,18,1502,1189,0,1197,694,0,837,553,271,1031,184,225,1236,7,272,1169,-179,261,1009,-455,277,860,-34,145,1291,207,250,1105,467,144,1336,-362,201,1402,-547,291,856,-749,173,1289,525,137,1349,-861,210,834,-270,256,950,451,209,1091,336,257,867,623,232,1036,597,221,927,678,106,1544,711,66,1646,583,78,1511,892,104,966,675,148,1018,-954,243,878,-847,248,800,583,116,1593,948,49,1736,1066,105,1622,986,35,1710,1109,112,1496,896,108,1594,1085,94,1418,907,74,1294,1128,98,1503,1113,50,1342,1237,51,1575,1161,70,1367,998,57,1254,1121,275,1140,-715,102,1133,-993,86,1255,1140,73,1299,1249,63,1209,1137,75,1196,1164,73,1201,1161,204,830,-522,93,884,632,86,880,-875,83,784,471,111,1708,1124,72,1796,1207,69,1786,1209,153,294,1278,130,291,1333,140,298,1217,82,38,-1190,64,30,-1114,63,46,-1217,58,290,1332,72,298,1213,-28,48,-1119,-6,58,-1217,77,835,-761,-34,56,-1166,59,1706,1107,85,1690,1088,90,1688,1071,64,1720,1095,52,1429,1204,82,1694,1030,42,1290,-937,96,1239,1204,82,1219,1201,200,905,352,23,1368,-879,33,1343,-893,34,1392,-1080,65,1330,-1079,46,1444,-1217,82,1358,-1250,42,1361,-1544,75,1310,-1586,96,1277,1210,75,1263,1209,109,1590,1139,71,1709,1100,100,1740,1151,112,1751,1146,83,1702,1044,67,820,603,43,294,1271,67,1485,299,80,1095,683,65,1232,1238,62,1197,1229,63,1176,1174,54,1252,1141,56,1184,1168,45,1184,1140,60,1760,1154,88,1737,1126,117,1710,1112,98,1750,1061,64,1770,1147,326,783,-599,291,1098,-503,210,1126,-904,243,674,-884,259,730,-915,216,781,-946,135,811,-958,98,716,-929,143,660,-868,78,124,-1146,0,144,-1161,-1,142,-1202,21,149,-1226,74,136,-1218,84,121,-1194,87,1657,881,44,1734,800,170,573,-1141,164,560,-1099,185,708,903,188,746,928,177,782,948,159,592,-1172,161,674,1001,152,690,1020,155,655,980,97,206,-1227,97,213,-1198,100,200,-1255,89,554,-1123,82,776,940,118,620,-1190,85,690,1015,84,691,890,88,642,962,24,229,-1212,45,209,-1265,68,742,922,79,675,997,85,574,-1153,30,230,-1239,127,459,1229,76,458,1226,62,443,1204,78,428,1183,129,430,1188,145,443,1207,80,1321,1187,168,824,-515,71,888,-741,35,1506,1186,56,1553,1165,114,1564,1068,96,1403,1063,49,872,-711,102,824,-510,94,1395,115,102,1376,59,142,808,-256,166,766,15,73,1228,667,197,1196,590,-270,1067,192,-225,1236,7,-266,1151,-201,-235,987,-609,-277,860,-34,-145,1307,225,-248,1136,510,-142,1307,-364,-202,1388,-542,-269,962,-976,-172,1288,549,-139,1355,-865,-200,821,-319,-256,1034,444,-207,1172,384,-261,877,503,-232,1022,606,-226,873,593,-124,1542,705,-78,1645,579,-105,1509,891,-106,920,652,-155,1110,-1023,-232,1037,-1056,-251,870,430,-130,1585,973,-50,1733,1076,-113,1615,1007,-26,1707,1116,-130,1488,921,-95,1587,1105,-105,1411,927,-33,1291,1139,-74,1497,1130,7,1341,1241,-22,1573,1168,-60,1362,1011,-16,1252,1128,-275,1157,-744,-110,1191,-979,-41,1251,1152,-9,1297,1257,-15,1207,1144,-22,1193,1174,-20,1198,1170,-184,859,-632,-96,848,571,-79,1073,-1085,-85,843,393,-102,1719,1140,-59,1831,1182,-55,1822,1187,-95,10,485,-77,17,541,-78,8,425,-166,462,-1813,-161,395,-1854,-142,482,-1800,-5,30,544,-10,20,425,-66,388,-1859,-71,473,-1805,-55,978,-1001,-52,427,-1835,-50,1704,1118,-78,1686,1105,-86,1682,1090,-58,1718,1106,-6,1427,1210,-86,1689,1047,-45,1304,-923,-37,1235,1217,-22,1215,1211,-199,990,336,-23,1368,-879,-33,1343,-893,-32,1391,-1080,-63,1330,-1078,-46,1443,-1215,-81,1356,-1248,-50,1360,-1543,-82,1308,-1583,-38,1273,1223,-17,1260,1219,-85,1584,1159,-63,1706,1113,-89,1758,1153,-103,1767,1146,-85,1695,1061,-70,809,521,13,29,484,-67,1485,299,-80,1078,693,0,1230,1245,3,1196,1235,-6,1174,1181,-9,1250,1148,-1,1182,1174,3,1183,1144,-51,1779,1143,-81,1748,1129,-109,1716,1129,-100,1737,1066,-56,1786,1134,-285,840,-846,-275,1059,-602,-218,1190,-907,-204,776,-1116,-227,831,-1145,-192,887,-1176,-115,927,-1191,-67,836,-1165,-102,774,-1104,-151,385,-1755,-70,386,-1750,-62,425,-1736,-80,444,-1715,-134,445,-1717,-151,430,-1737,-118,1655,882,-81,1732,803,-154,720,-1416,-153,686,-1379,-200,550,432,-203,545,478,-193,543,521,-134,747,-1435,-165,445,456,-156,440,481,-159,452,429,-142,416,-1650,-145,407,-1627,-142,431,-1669,-81,676,-1404,-98,553,513,-86,769,-1437,-90,452,479,-100,560,412,-93,468,410,-69,409,-1628,-86,433,-1670,-83,554,475,-84,459,457,-69,706,-1422,-70,426,-1648,-90,145,415,-40,155,414,-26,160,390,-42,168,362,-92,158,365,-107,147,387,-29,1317,1198,-159,840,-563,-65,928,-816,1,1505,1189,-26,1550,1174,-102,1557,1090,-75,1398,1080,-44,896,-759,-100,827,-525,-94,1395,115,-102,1376,59,-139,800,-275,-166,766,15,-73,1224,673,-197,1184,625,140,1138,642,161,991,644,151,925,695,133,796,956,124,701,1032,100,472,1241,98,289,1349,104,293,1295,105,297,1233,104,417,1172,125,642,964,128,683,884,165,761,525,208,851,451,-208,962,399,-168,854,383,-143,559,401,-130,462,410,-68,168,346,-44,16,442,-48,20,504,-46,24,559,-64,145,432,-128,440,498,-149,545,538,-155,859,618,-162,959,627,-140,1115,669,167,882,-901,174,810,-957,149,614,-1185,73,190,-1271,53,147,-1228,28,49,-1200,12,46,-1157,10,35,-1084,37,130,-1130,59,217,-1185,124,559,-1094,199,648,-867,264,761,-557,-162,1076,-1105,-154,921,-1189,-118,769,-1437,-116,437,-1680,-111,449,-1709,-110,463,-1811,-100,425,-1836,-111,363,-1874,-112,366,-1766,-109,394,-1616,-114,675,-1372,-157,755,-1101,-218,815,-813,152,366,1246,133,403,1214,104,412,1203,74,403,1208,48,366,1242,70,378,1275,99,384,1287,129,376,1279,-27,103,475,-1,94,445,-30,121,405,-61,122,387,-89,111,407,-104,76,443,-86,94,476,-58,105,493,-38,1362,1180,0,1386,1224,26,1386,1225,50,1387,1219,82,1366,1168,-32,1400,-944,-42,1356,-975,0,1342,-976,43,1357,-975,33,1400,-944,0,1413,-944,-82,1321,-1424,-1,1306,-1415,79,1323,-1426,44,1413,-1423,-2,1456,-1408,-50,1412,-1421,197,654,-1107,173,693,-1143,170,714,-1163,95,712,-1154,97,674,-1135,91,625,-1072,149,608,-1057,193,620,-1069,-65,838,-1383,-141,840,-1391,-143,815,-1375,-167,771,-1345,-163,730,-1313,-120,716,-1303,-61,736,-1315,-66,797,-1369,93,1553,1130,107,1577,1113,108,1563,1086,98,1537,1100,-68,1548,1146,-87,1571,1133,-92,1557,1106,-79,1531,1118,111,1556,1111,-90,1549,1131] },
{ "name": "horse_A_002", "vertices": [0,1408,54,0,1425,111,0,1413,-326,0,1474,-585,0,1159,-1000,0,1286,-982,0,1422,-871,0,845,-521,0,808,-261,0,760,-5,-5,1682,553,-11,1451,892,0,967,685,0,1066,-986,0,969,-889,0,896,627,0,823,393,-5,1764,1030,3,1720,1110,-4,1417,916,28,1351,1239,13,1582,1165,5,1361,1003,20,1254,1117,34,1295,1275,20,1219,1111,28,1180,1179,23,1262,1152,24,1188,1140,27,1188,1171,0,887,-719,22,1439,1208,33,1202,1238,0,1410,-901,0,1361,-941,0,1443,-1112,1,1338,-1106,0,1493,-1227,1,1348,-1269,-5,1406,-1629,-5,1341,-1747,34,1233,1251,0,1513,278,0,1088,699,-18,1773,796,0,932,-804,18,1510,1187,0,1209,687,0,838,528,271,1058,176,224,1257,8,271,1185,-187,260,1013,-520,276,886,-44,146,1313,206,251,1119,469,142,1366,-389,199,1433,-573,308,914,-846,173,1302,527,136,1378,-888,211,857,-294,255,971,421,210,1127,336,252,849,555,231,1025,585,218,893,628,106,1554,709,66,1658,582,78,1519,889,103,947,652,156,1073,-1003,261,953,-941,242,795,504,116,1602,947,49,1744,1064,105,1631,984,35,1718,1108,112,1505,895,108,1602,1083,95,1426,905,74,1303,1126,98,1511,1111,50,1350,1235,50,1583,1159,70,1375,996,57,1263,1119,275,1181,-750,105,1176,-1021,86,1263,1138,73,1308,1247,63,1218,1135,75,1204,1163,73,1209,1159,210,857,-583,90,872,591,105,953,-975,80,798,423,111,1716,1122,71,1803,1206,68,1792,1208,141,290,1251,119,322,1297,127,255,1201,115,203,-1516,104,168,-1446,93,218,-1536,47,324,1296,58,255,1198,10,183,-1437,23,228,-1526,95,886,-870,0,207,-1477,59,1714,1105,85,1699,1086,90,1696,1069,63,1729,1093,51,1437,1202,82,1703,1028,42,1322,-963,96,1247,1202,82,1227,1199,198,933,322,23,1396,-908,33,1371,-921,34,1411,-1108,65,1349,-1105,46,1454,-1240,83,1368,-1272,42,1392,-1569,75,1350,-1618,96,1286,1208,75,1271,1208,109,1598,1137,70,1717,1098,99,1747,1150,111,1759,1145,82,1711,1042,64,814,559,31,289,1245,67,1500,294,80,1098,679,65,1240,1236,62,1206,1228,63,1184,1172,54,1260,1140,56,1192,1166,45,1192,1138,59,1767,1152,88,1745,1125,116,1717,1110,98,1758,1060,63,1777,1146,341,817,-708,288,1111,-550,213,1175,-935,274,753,-1009,288,814,-1030,244,867,-1054,161,895,-1065,129,794,-1053,174,732,-1000,114,268,-1443,36,289,-1444,30,301,-1483,51,317,-1505,104,304,-1506,116,282,-1490,87,1666,880,44,1743,799,209,695,-1300,207,669,-1262,175,617,782,179,652,811,168,687,836,194,723,-1322,152,581,883,143,598,901,145,561,863,126,373,-1491,129,370,-1462,127,377,-1520,129,669,-1282,73,683,828,152,754,-1327,76,597,897,74,602,766,78,547,846,55,387,-1463,71,387,-1521,59,651,806,70,581,880,123,698,-1303,59,397,-1490,118,378,1120,67,378,1117,54,360,1098,69,343,1076,120,345,1081,136,359,1100,79,1329,1186,171,856,-552,76,922,-786,34,1514,1184,56,1562,1164,114,1572,1067,96,1411,1061,52,905,-746,103,859,-532,94,1412,110,102,1395,60,142,835,-269,166,791,2,73,1239,663,198,1200,596,-271,1075,178,-224,1257,8,-266,1171,-200,-236,980,-601,-276,886,-44,-146,1319,214,-250,1127,479,-142,1346,-388,-201,1421,-567,-271,965,-965,-173,1299,537,-138,1381,-888,-201,846,-323,-256,1016,414,-210,1161,351,-256,849,474,-232,1011,576,-221,851,565,-124,1553,702,-78,1657,578,-105,1517,888,-104,916,629,-152,1126,-1030,-233,1041,-1044,-247,845,402,-130,1593,971,-51,1741,1074,-113,1623,1005,-27,1716,1114,-130,1496,918,-95,1595,1103,-105,1419,924,-33,1299,1137,-74,1505,1128,7,1349,1239,-23,1581,1166,-60,1370,1009,-16,1260,1126,-274,1177,-753,-108,1210,-1006,-41,1259,1150,-9,1305,1255,-15,1215,1143,-22,1201,1172,-20,1206,1168,-186,867,-644,-92,836,548,-79,1074,-1074,-82,837,373,-102,1724,1139,-58,1833,1188,-54,1824,1192,-113,0,216,-92,-34,261,-98,39,170,-180,569,-1867,-175,501,-1905,-156,590,-1855,-19,-29,266,-30,45,173,-80,493,-1910,-85,581,-1860,-57,975,-991,-66,533,-1887,-51,1712,1116,-79,1694,1103,-87,1690,1088,-58,1726,1104,-6,1435,1208,-87,1697,1045,-45,1329,-952,-37,1243,1215,-22,1224,1209,-199,983,313,-23,1396,-908,-33,1371,-921,-32,1410,-1107,-63,1349,-1104,-46,1453,-1239,-81,1366,-1270,-50,1390,-1567,-83,1347,-1616,-38,1281,1221,-17,1268,1217,-86,1592,1157,-64,1714,1111,-89,1762,1155,-102,1772,1148,-85,1703,1059,-66,802,500,-3,10,220,-67,1500,294,-80,1087,679,0,1238,1243,3,1204,1234,-6,1182,1179,-9,1258,1146,-1,1191,1172,3,1191,1142,-51,1784,1145,-81,1754,1130,-109,1722,1128,-100,1747,1066,-56,1791,1137,-289,831,-848,-275,1068,-597,-216,1208,-926,-214,816,-1140,-236,876,-1157,-200,937,-1176,-123,977,-1184,-76,881,-1179,-112,809,-1131,-165,495,-1805,-84,497,-1800,-76,536,-1788,-94,557,-1768,-148,557,-1771,-165,542,-1790,-118,1663,881,-81,1741,802,-168,813,-1441,-168,776,-1409,-183,531,406,-187,518,449,-177,510,490,-149,842,-1457,-154,427,402,-146,415,423,-147,442,378,-156,533,-1702,-159,521,-1680,-156,550,-1721,-95,769,-1434,-81,518,485,-101,864,-1457,-79,422,425,-82,541,389,-80,459,364,-83,523,-1681,-100,551,-1722,-66,525,448,-73,435,406,-83,800,-1449,-85,542,-1699,-100,150,267,-49,155,269,-35,169,247,-51,186,224,-101,179,225,-117,163,242,-29,1325,1197,-159,863,-579,-65,947,-824,1,1513,1187,-26,1559,1172,-102,1565,1088,-75,1406,1078,-44,919,-770,-100,861,-540,-94,1412,110,-102,1395,60,-139,830,-279,-166,791,2,-73,1236,665,-198,1190,606,141,1137,644,160,974,624,148,891,650,124,701,846,114,609,913,92,391,1132,87,332,1310,92,301,1265,92,265,1214,96,331,1065,115,547,848,118,594,760,160,768,451,205,873,400,-207,947,375,-164,838,358,-125,542,378,-117,455,363,-76,192,209,-63,31,185,-64,-8,233,-60,-42,276,-75,143,284,-118,407,439,-133,507,507,-150,844,591,-161,952,600,-140,1121,651,187,964,-996,200,895,-1063,183,747,-1327,98,372,-1536,82,316,-1510,60,215,-1517,47,196,-1476,52,160,-1412,75,266,-1423,93,368,-1445,168,666,-1254,231,723,-997,279,785,-673,-162,1080,-1094,-161,971,-1182,-132,864,-1457,-130,556,-1733,-125,562,-1762,-124,571,-1866,-114,531,-1888,-125,468,-1924,-127,476,-1815,-123,507,-1670,-128,765,-1403,-167,791,-1130,-222,800,-818,142,326,1181,123,335,1134,94,332,1116,64,334,1128,37,326,1178,60,355,1197,90,366,1201,120,355,1201,-38,72,270,-14,85,237,-42,133,230,-73,143,222,-102,125,229,-118,76,232,-97,65,266,-69,66,289,-39,1370,1178,0,1394,1222,25,1394,1223,50,1396,1217,82,1375,1166,-32,1425,-974,-42,1380,-1004,0,1366,-1004,43,1381,-1004,34,1425,-974,0,1437,-974,-81,1329,-1451,0,1314,-1444,79,1332,-1454,44,1420,-1443,-2,1460,-1425,-50,1419,-1441,238,765,-1237,211,809,-1265,208,835,-1280,133,827,-1272,136,786,-1260,134,724,-1208,193,706,-1197,235,722,-1207,-78,928,-1392,-154,933,-1400,-157,906,-1388,-181,857,-1366,-177,812,-1341,-134,795,-1334,-75,816,-1343,-80,885,-1386,93,1561,1128,106,1585,1112,107,1572,1084,98,1545,1098,-69,1556,1144,-87,1579,1131,-93,1565,1104,-79,1539,1115,111,1564,1109,-91,1557,1129] },
{ "name": "horse_A_003", "vertices": [0,1442,55,0,1456,105,0,1470,-324,0,1530,-584,0,1213,-996,0,1340,-979,0,1476,-869,0,901,-515,0,856,-270,0,803,-17,-4,1712,537,-9,1482,879,0,968,659,0,1119,-982,0,1023,-884,1,897,600,0,849,357,-3,1805,1011,5,1764,1092,-2,1455,908,32,1400,1233,16,1628,1152,8,1402,997,23,1299,1115,37,1345,1271,24,1263,1111,32,1227,1180,26,1308,1150,28,1234,1140,31,1235,1171,0,941,-713,25,1487,1200,37,1252,1238,0,1464,-899,0,1414,-938,0,1486,-1105,1,1380,-1098,0,1522,-1210,1,1377,-1251,-6,1482,-1598,-9,1485,-1736,37,1282,1250,0,1541,273,0,1101,685,-16,1803,780,0,987,-799,21,1557,1177,0,1231,676,0,854,493,271,1104,171,224,1293,10,270,1226,-188,257,1068,-531,274,930,-50,147,1348,206,252,1150,473,142,1422,-388,199,1488,-572,301,977,-861,174,1322,529,136,1432,-886,209,907,-302,255,1028,395,213,1184,346,249,875,474,231,1035,566,214,891,560,107,1582,692,67,1688,566,80,1547,873,101,948,618,155,1132,-1006,256,1019,-954,239,844,408,118,1641,933,50,1787,1045,107,1671,969,37,1762,1090,114,1542,884,110,1646,1069,97,1464,897,77,1348,1122,100,1556,1100,53,1399,1230,53,1630,1146,73,1416,990,61,1308,1116,274,1239,-755,105,1233,-1020,89,1309,1136,76,1357,1243,66,1263,1134,79,1251,1162,77,1255,1159,206,914,-589,88,884,539,100,1023,-988,79,849,366,113,1760,1105,73,1848,1187,70,1837,1189,110,94,882,87,114,934,96,74,824,166,410,-1732,156,339,-1698,144,433,-1740,15,119,932,28,78,819,61,339,-1690,73,431,-1733,88,953,-886,50,382,-1709,61,1758,1088,87,1742,1069,92,1739,1052,65,1773,1075,54,1485,1194,83,1744,1011,43,1376,-961,99,1295,1200,86,1275,1198,198,995,296,23,1450,-906,33,1425,-918,34,1453,-1101,65,1392,-1097,46,1483,-1224,83,1397,-1255,41,1454,-1546,73,1427,-1603,99,1334,1205,79,1319,1205,111,1644,1124,72,1761,1081,101,1791,1132,113,1803,1127,84,1753,1024,62,836,500,0,99,874,67,1528,290,80,1109,669,68,1289,1235,66,1255,1227,66,1231,1172,57,1306,1137,60,1239,1166,49,1238,1138,61,1811,1134,90,1789,1107,118,1761,1093,100,1801,1042,65,1821,1128,333,875,-726,286,1165,-557,213,1233,-936,264,822,-1029,279,884,-1048,236,939,-1071,154,968,-1081,120,868,-1072,164,803,-1020,156,417,-1635,76,429,-1630,70,462,-1654,90,489,-1660,144,483,-1664,158,457,-1664,90,1695,864,46,1773,783,206,794,-1337,207,757,-1306,163,567,569,167,586,612,156,607,649,189,825,-1352,136,491,647,127,500,670,130,482,620,158,528,-1609,162,516,-1582,159,542,-1634,130,756,-1328,61,609,638,144,852,-1349,60,502,664,63,563,547,63,478,597,86,525,-1581,102,547,-1634,47,590,604,54,495,642,121,789,-1342,88,543,-1602,93,211,779,42,213,774,29,204,750,45,198,722,96,196,729,111,200,753,83,1377,1181,169,913,-552,74,981,-788,37,1562,1173,58,1608,1151,116,1616,1054,98,1455,1053,50,962,-745,103,916,-528,94,1443,103,102,1429,60,141,885,-277,164,834,-8,73,1258,656,199,1213,599,-271,1097,165,-224,1293,10,-267,1214,-195,-243,1026,-573,-274,930,-50,-146,1344,204,-252,1119,449,-142,1405,-384,-201,1478,-564,-280,1001,-931,-174,1316,525,-138,1433,-884,-203,896,-321,-256,998,397,-213,1156,323,-250,808,427,-231,988,546,-214,801,516,-123,1581,686,-77,1687,562,-103,1545,872,-101,898,597,-151,1165,-1016,-238,1072,-1013,-242,838,365,-128,1633,958,-49,1784,1055,-111,1664,991,-25,1760,1096,-127,1534,909,-93,1639,1090,-102,1457,917,-30,1344,1133,-71,1550,1118,10,1398,1234,-20,1627,1153,-57,1411,1004,-13,1305,1124,-274,1228,-742,-106,1255,-1005,-37,1305,1148,-6,1354,1251,-12,1261,1142,-18,1248,1172,-17,1253,1168,-192,912,-627,-87,801,503,-83,1097,-1043,-81,850,349,-99,1766,1123,-54,1873,1175,-50,1863,1179,-139,153,-188,-118,99,-175,-122,213,-201,-194,474,-1735,-189,396,-1741,-170,498,-1733,-45,97,-172,-54,214,-199,-94,387,-1742,-99,488,-1733,-65,1001,-957,-80,433,-1738,-49,1756,1099,-77,1738,1086,-85,1733,1071,-56,1769,1086,-3,1483,1200,-85,1739,1028,-44,1381,-951,-33,1291,1214,-19,1272,1209,-199,989,304,-23,1450,-906,-33,1425,-918,-32,1453,-1101,-63,1391,-1097,-46,1482,-1222,-81,1394,-1252,-51,1452,-1545,-84,1424,-1600,-35,1329,1219,-14,1316,1214,-83,1637,1143,-62,1758,1094,-86,1803,1140,-99,1813,1134,-83,1746,1042,-63,793,455,-28,157,-185,-67,1528,290,-80,1099,662,4,1287,1241,7,1253,1233,-2,1229,1179,-5,1304,1144,1,1237,1172,7,1237,1143,-48,1825,1130,-78,1795,1114,-106,1764,1112,-99,1791,1051,-53,1833,1123,-303,870,-814,-279,1121,-575,-214,1254,-921,-229,860,-1112,-249,922,-1126,-211,982,-1143,-132,1019,-1149,-89,921,-1149,-128,848,-1104,-179,432,-1648,-98,436,-1644,-90,476,-1649,-108,504,-1640,-162,503,-1642,-179,481,-1653,-116,1692,865,-79,1771,786,-182,850,-1393,-182,824,-1356,-168,577,196,-172,548,232,-162,523,267,-163,873,-1417,-146,478,158,-138,459,175,-138,498,139,-170,510,-1570,-173,505,-1545,-171,521,-1594,-109,809,-1375,-66,532,262,-115,895,-1423,-71,462,176,-68,593,182,-70,514,127,-97,507,-1546,-114,522,-1596,-52,554,230,-64,479,161,-97,835,-1397,-99,520,-1570,-114,243,-48,-63,245,-47,-49,265,-64,-64,287,-80,-115,283,-79,-131,265,-66,-26,1373,1192,-162,914,-569,-68,992,-809,4,1560,1176,-23,1605,1160,-100,1608,1076,-72,1449,1071,-46,968,-759,-101,916,-533,-94,1443,103,-102,1429,60,-139,880,-284,-164,834,-8,-73,1255,654,-199,1198,588,141,1145,641,158,979,592,144,885,586,112,616,663,98,506,685,66,218,794,55,122,948,60,103,897,61,82,838,71,191,709,101,477,600,106,557,539,158,829,362,205,943,349,-206,946,373,-162,855,331,-111,599,173,-108,513,127,-89,298,-92,-88,196,-196,-90,136,-182,-86,82,-170,-89,230,-34,-110,446,187,-118,513,280,-144,801,544,-159,935,568,-141,1125,631,182,1033,-1009,193,968,-1078,175,849,-1350,131,543,-1652,122,494,-1662,110,417,-1730,98,376,-1710,105,309,-1680,117,401,-1623,126,505,-1568,168,748,-1298,220,792,-1019,270,843,-693,-166,1105,-1063,-170,1015,-1147,-146,895,-1423,-144,523,-1609,-139,510,-1636,-138,476,-1734,-129,431,-1738,-140,358,-1744,-141,410,-1649,-138,494,-1531,-143,814,-1349,-184,833,-1104,-237,836,-785,113,147,824,96,169,780,68,171,760,37,171,773,9,152,818,32,173,845,62,181,853,91,171,850,-57,176,-104,-34,205,-126,-59,249,-100,-89,259,-96,-119,245,-101,-138,205,-128,-117,175,-108,-88,163,-89,-35,1417,1172,3,1442,1216,29,1442,1216,53,1444,1211,85,1421,1160,-32,1474,-972,-42,1429,-1001,0,1415,-1001,43,1429,-1001,34,1474,-972,0,1487,-972,-82,1363,-1441,-1,1349,-1437,78,1366,-1444,44,1448,-1424,-3,1484,-1402,-50,1447,-1422,228,844,-1258,201,891,-1281,197,918,-1293,122,909,-1285,126,866,-1278,124,798,-1234,184,780,-1225,227,798,-1233,-91,976,-1365,-167,983,-1373,-170,957,-1360,-195,910,-1335,-193,868,-1308,-150,851,-1299,-90,869,-1310,-94,934,-1356,95,1606,1116,109,1630,1098,110,1615,1071,101,1589,1086,-66,1601,1132,-85,1623,1118,-90,1609,1091,-76,1583,1104,113,1609,1097,-88,1602,1117] },
{ "name": "horse_A_004", "vertices": [0,1480,55,0,1490,99,0,1530,-319,0,1590,-578,0,1272,-991,0,1399,-974,0,1536,-863,0,961,-509,0,906,-278,0,849,-26,-3,1742,513,-7,1519,857,0,995,640,0,1179,-976,0,1082,-879,0,909,586,0,881,339,-2,1858,986,7,1820,1069,0,1505,894,34,1460,1221,18,1686,1133,10,1455,985,26,1356,1106,40,1407,1261,27,1320,1102,35,1285,1173,29,1365,1140,31,1291,1132,34,1293,1164,0,1001,-707,28,1546,1185,40,1312,1230,0,1524,-893,0,1474,-933,1,1532,-1094,1,1427,-1086,0,1554,-1186,1,1409,-1227,-8,1526,-1573,-12,1540,-1714,40,1343,1241,0,1572,269,0,1125,671,-15,1836,757,0,1046,-793,23,1615,1159,0,1254,663,0,879,477,270,1129,159,223,1333,13,269,1275,-185,251,1137,-522,273,976,-53,147,1377,193,252,1166,446,142,1485,-383,200,1550,-567,289,1035,-847,174,1348,514,137,1492,-881,205,963,-303,255,1044,395,213,1192,316,248,876,481,231,1055,556,213,891,570,108,1611,665,68,1718,541,82,1577,848,101,966,614,152,1185,-999,245,1075,-942,239,869,407,120,1692,913,52,1841,1021,108,1723,948,38,1817,1066,116,1592,867,112,1701,1049,99,1514,883,80,1405,1111,102,1612,1083,56,1459,1217,54,1687,1126,75,1468,977,63,1364,1107,274,1301,-751,105,1292,-1016,92,1366,1126,79,1417,1232,69,1320,1126,82,1309,1154,80,1313,1150,199,978,-578,87,876,542,89,1085,-975,79,876,357,114,1815,1082,74,1904,1162,71,1894,1165,86,-8,439,62,-18,494,73,5,380,208,570,-1783,203,491,-1785,184,594,-1782,-9,-10,493,5,13,377,108,483,-1785,113,584,-1783,75,1020,-871,94,529,-1784,62,1814,1064,88,1797,1046,93,1794,1029,66,1828,1051,57,1544,1179,85,1798,988,43,1436,-956,102,1355,1191,88,1334,1189,198,1021,296,23,1510,-900,33,1484,-913,34,1500,-1089,66,1439,-1086,46,1516,-1200,83,1430,-1231,39,1496,-1523,71,1472,-1580,102,1393,1194,82,1379,1195,113,1701,1104,74,1816,1057,102,1847,1108,114,1859,1103,86,1807,1001,61,842,488,-23,4,434,67,1558,285,80,1135,654,71,1349,1226,69,1314,1219,69,1289,1165,60,1363,1128,63,1297,1159,52,1295,1131,62,1867,1110,91,1844,1083,120,1816,1069,101,1855,1018,66,1877,1103,317,936,-710,283,1232,-551,213,1292,-932,245,877,-1011,262,937,-1032,222,994,-1056,141,1027,-1066,102,928,-1055,144,863,-1002,193,533,-1694,112,537,-1691,104,577,-1698,122,605,-1690,176,604,-1692,193,581,-1702,91,1727,840,47,1807,759,196,858,-1323,196,816,-1294,163,555,421,166,551,467,155,551,509,176,888,-1335,132,451,448,123,447,472,126,457,420,184,618,-1622,187,603,-1598,184,636,-1643,123,813,-1322,60,560,499,128,911,-1332,56,455,468,63,565,398,60,469,398,111,606,-1599,128,638,-1645,47,561,460,51,461,445,111,846,-1332,113,627,-1618,76,146,414,25,152,412,12,157,386,29,165,359,79,159,364,94,149,387,85,1435,1169,165,974,-543,70,1043,-779,39,1620,1155,60,1665,1132,118,1670,1035,101,1509,1039,48,1024,-737,102,976,-522,94,1477,97,102,1467,61,140,938,-282,164,879,-15,73,1281,644,199,1239,579,-271,1141,161,-223,1333,13,-268,1264,-187,-250,1091,-526,-273,976,-53,-146,1380,200,-252,1162,444,-142,1471,-376,-200,1541,-559,-289,1034,-871,-174,1342,520,-137,1491,-877,-205,952,-312,-256,1054,380,-213,1210,323,-251,872,380,-231,1026,526,-215,850,468,-121,1610,661,-77,1717,538,-101,1576,848,-101,931,567,-152,1198,-994,-245,1093,-958,-244,908,325,-126,1684,939,-47,1838,1031,-110,1716,971,-24,1815,1073,-125,1584,892,-91,1694,1070,-100,1507,903,-28,1401,1123,-69,1606,1101,13,1458,1221,-18,1684,1134,-55,1464,991,-10,1362,1114,-274,1285,-725,-105,1302,-1001,-34,1362,1139,-3,1415,1240,-9,1318,1134,-15,1306,1164,-14,1311,1160,-199,965,-594,-88,847,461,-90,1108,-990,-81,904,322,-96,1818,1101,-51,1923,1156,-47,1913,1160,-154,348,-346,-134,292,-349,-137,409,-342,-208,369,-1477,-203,296,-1446,-184,390,-1486,-62,289,-349,-69,409,-341,-108,288,-1442,-113,381,-1482,-75,1023,-896,-94,331,-1461,-47,1811,1076,-75,1792,1063,-83,1788,1048,-55,1824,1063,-1,1542,1185,-84,1792,1006,-43,1438,-948,-30,1350,1204,-16,1331,1200,-199,1042,292,-23,1510,-900,-33,1484,-913,-32,1499,-1089,-63,1438,-1085,-46,1514,-1197,-80,1426,-1227,-53,1494,-1521,-86,1468,-1576,-32,1389,1208,-11,1376,1204,-81,1694,1124,-60,1813,1071,-83,1855,1119,-97,1865,1114,-82,1800,1019,-63,841,418,-44,349,-345,-67,1558,285,-80,1122,649,7,1347,1232,10,1312,1225,0,1287,1172,-3,1361,1134,4,1295,1165,10,1294,1135,-45,1877,1110,-76,1848,1093,-104,1817,1090,-98,1846,1030,-50,1885,1103,-317,915,-746,-283,1190,-541,-213,1300,-914,-245,889,-1048,-262,951,-1063,-222,1009,-1082,-141,1043,-1089,-102,944,-1086,-144,874,-1039,-193,373,-1381,-112,378,-1379,-104,411,-1403,-122,439,-1407,-176,438,-1409,-193,413,-1408,-114,1725,842,-77,1805,762,-196,859,-1304,-196,848,-1263,-171,679,117,-175,644,147,-165,613,177,-177,872,-1334,-150,588,62,-143,567,76,-143,611,47,-184,478,-1350,-187,483,-1323,-184,479,-1377,-123,828,-1272,-69,622,173,-129,890,-1347,-75,567,76,-71,695,104,-74,628,37,-111,484,-1326,-128,479,-1379,-55,649,145,-68,587,64,-111,843,-1302,-113,488,-1353,-126,395,-184,-75,396,-185,-60,418,-197,-75,443,-208,-126,441,-207,-143,420,-198,-23,1431,1180,-165,969,-551,-70,1041,-786,6,1618,1159,-22,1662,1141,-98,1663,1057,-70,1503,1057,-48,1022,-742,-102,974,-524,-94,1477,97,-102,1467,61,-140,933,-285,-164,879,-15,-73,1278,645,-199,1223,581,141,1171,624,158,1000,584,143,889,593,111,553,526,94,446,488,49,145,431,30,-18,510,36,-7,456,38,6,395,55,166,344,98,465,400,107,563,388,159,868,355,205,978,363,-207,1003,351,-163,921,299,-114,704,97,-112,628,37,-100,457,-217,-103,391,-342,-106,329,-346,-103,274,-350,-101,380,-174,-115,551,84,-121,601,189,-145,845,497,-159,971,541,-141,1149,620,172,1090,-997,180,1025,-1064,160,910,-1332,158,641,-1660,153,612,-1687,152,572,-1783,142,527,-1784,153,454,-1786,154,511,-1694,151,587,-1588,157,804,-1289,200,850,-1000,253,908,-675,-172,1117,-1011,-180,1041,-1087,-160,890,-1347,-158,475,-1391,-153,447,-1407,-152,371,-1478,-143,329,-1460,-153,262,-1431,-155,353,-1371,-152,478,-1306,-157,841,-1254,-200,861,-1039,-253,882,-714,93,66,418,78,109,393,50,123,377,19,117,388,-10,78,415,12,80,449,42,80,461,71,73,453,-71,346,-261,-48,379,-274,-71,414,-236,-101,422,-228,-131,411,-237,-152,381,-274,-131,346,-264,-102,329,-250,-33,1475,1159,6,1502,1202,31,1502,1202,56,1503,1197,87,1479,1147,-32,1528,-966,-42,1483,-994,0,1469,-994,43,1483,-994,34,1528,-966,0,1541,-966,-82,1399,-1418,-1,1385,-1415,78,1403,-1422,43,1484,-1401,-4,1519,-1378,-51,1482,-1398,209,896,-1240,182,943,-1263,179,970,-1275,103,961,-1267,107,919,-1261,105,849,-1218,166,831,-1209,208,850,-1216,-103,990,-1308,-179,998,-1317,-183,974,-1301,-210,934,-1272,-208,897,-1241,-166,881,-1230,-106,895,-1242,-107,951,-1295,97,1663,1097,111,1686,1079,111,1671,1052,102,1645,1068,-64,1657,1114,-83,1679,1099,-88,1664,1073,-75,1639,1086,115,1665,1078,-86,1658,1099] },
{ "name": "horse_A_005", "vertices": [0,1515,56,0,1520,92,0,1582,-313,0,1641,-573,0,1323,-985,0,1451,-968,0,1587,-858,0,1012,-504,0,948,-283,0,886,-28,-3,1765,478,-7,1561,829,0,1026,626,0,1230,-971,0,1134,-873,0,928,576,0,905,327,-4,1925,954,5,1889,1038,-1,1569,874,33,1535,1202,16,1758,1106,9,1522,966,25,1427,1091,39,1483,1244,26,1391,1088,34,1359,1160,28,1438,1125,30,1363,1120,33,1366,1151,0,1053,-702,26,1620,1163,39,1387,1216,0,1575,-887,0,1526,-927,1,1573,-1082,1,1468,-1074,0,1580,-1159,2,1435,-1202,-10,1559,-1550,-14,1574,-1691,39,1419,1226,0,1599,262,0,1150,657,-15,1873,722,0,1098,-787,21,1688,1135,0,1276,650,0,903,465,270,1154,149,224,1369,15,269,1320,-181,254,1210,-499,274,1013,-53,146,1403,181,251,1186,420,142,1540,-377,200,1604,-562,297,1092,-815,174,1373,500,137,1544,-876,207,1010,-299,255,1062,387,212,1206,288,250,888,472,231,1076,538,215,901,558,109,1635,630,68,1741,506,82,1609,815,101,986,600,154,1226,-982,253,1125,-912,241,899,399,118,1757,887,50,1910,989,107,1789,921,36,1887,1035,115,1655,844,110,1771,1022,98,1578,862,79,1476,1095,101,1682,1059,54,1535,1198,53,1759,1100,74,1535,958,62,1436,1091,274,1360,-739,105,1341,-1008,91,1438,1110,78,1493,1214,68,1393,1112,81,1382,1141,79,1386,1137,203,1037,-557,87,880,528,97,1128,-947,80,903,348,112,1885,1051,72,1977,1129,69,1966,1131,89,32,217,63,5,264,78,66,166,221,452,-1607,217,375,-1590,198,475,-1612,-8,13,264,10,75,163,121,367,-1588,127,465,-1610,84,1070,-838,108,412,-1598,60,1883,1034,86,1866,1016,92,1862,999,64,1897,1020,55,1618,1157,83,1865,958,43,1487,-951,101,1429,1176,88,1409,1175,198,1044,294,23,1561,-894,33,1536,-907,35,1540,-1078,66,1480,-1074,46,1542,-1174,83,1457,-1206,38,1530,-1500,70,1505,-1557,101,1468,1178,81,1453,1179,112,1772,1077,72,1886,1026,100,1918,1076,112,1929,1071,84,1874,970,62,858,470,-20,47,212,67,1586,279,80,1159,638,70,1425,1211,68,1390,1205,69,1363,1152,59,1436,1112,62,1370,1146,51,1368,1118,60,1938,1077,89,1914,1052,118,1886,1038,99,1924,986,64,1947,1071,327,1004,-671,285,1302,-534,213,1343,-923,258,922,-968,274,981,-993,232,1035,-1021,151,1065,-1034,114,966,-1015,157,906,-958,207,438,-1512,126,443,-1510,118,480,-1526,136,509,-1526,190,507,-1527,207,483,-1531,91,1762,806,47,1845,725,209,864,-1261,210,834,-1223,170,600,304,172,586,348,160,577,390,190,888,-1283,138,491,315,128,485,339,132,500,288,198,538,-1463,201,531,-1436,198,548,-1489,136,822,-1246,65,588,380,142,911,-1288,61,494,335,70,615,282,66,515,267,125,533,-1438,141,549,-1491,52,597,342,56,502,312,125,849,-1266,126,547,-1462,79,191,248,29,197,245,16,207,220,33,217,195,84,210,200,98,198,222,84,1509,1151,167,1029,-531,73,1095,-766,38,1693,1131,59,1738,1106,116,1739,1009,100,1578,1019,49,1076,-727,102,1028,-514,94,1507,90,102,1502,61,140,981,-283,164,915,-17,73,1304,633,199,1264,559,-271,1172,153,-224,1369,15,-269,1316,-177,-255,1181,-461,-274,1013,-53,-146,1410,189,-251,1201,428,-142,1535,-370,-199,1600,-555,-299,1061,-774,-173,1370,509,-137,1542,-872,-208,1004,-293,-256,1094,367,-212,1246,305,-253,917,376,-231,1070,514,-217,898,464,-121,1634,626,-76,1740,503,-101,1607,815,-102,971,557,-154,1213,-961,-254,1097,-871,-245,949,318,-127,1749,912,-49,1906,999,-111,1782,943,-25,1885,1042,-126,1647,869,-93,1764,1043,-101,1571,883,-29,1473,1106,-71,1677,1077,12,1533,1203,-20,1756,1107,-56,1531,972,-11,1433,1099,-274,1338,-704,-105,1336,-995,-35,1434,1123,-4,1491,1223,-10,1390,1120,-16,1379,1151,-15,1384,1146,-204,1023,-538,-90,886,455,-98,1099,-906,-82,936,310,-98,1886,1071,-51,1989,1128,-47,1979,1131,-159,460,-375,-139,406,-392,-142,517,-356,-224,292,-1120,-219,239,-1061,-200,307,-1137,-67,403,-392,-74,517,-356,-124,234,-1054,-129,301,-1130,-85,1038,-797,-110,264,-1089,-49,1881,1045,-77,1862,1033,-85,1857,1018,-57,1893,1032,-2,1616,1163,-85,1859,975,-43,1485,-946,-31,1425,1189,-17,1405,1186,-199,1077,282,-23,1561,-894,-33,1536,-907,-32,1540,-1077,-62,1478,-1073,-46,1540,-1171,-80,1452,-1202,-54,1527,-1498,-87,1501,-1553,-33,1464,1192,-12,1450,1188,-83,1766,1097,-62,1882,1040,-84,1922,1089,-98,1932,1085,-84,1868,988,-64,876,409,-49,460,-374,-67,1586,279,-80,1150,637,5,1423,1217,9,1388,1211,0,1361,1159,-4,1433,1119,4,1369,1151,9,1366,1122,-46,1944,1081,-77,1916,1064,-105,1884,1060,-99,1916,1000,-51,1952,1073,-329,972,-630,-285,1276,-498,-213,1332,-902,-260,889,-925,-276,948,-950,-234,1001,-979,-152,1030,-992,-117,932,-972,-160,872,-914,-209,336,-1035,-128,341,-1035,-120,361,-1070,-138,385,-1087,-192,383,-1087,-209,361,-1076,-114,1759,808,-78,1843,728,-212,814,-1154,-213,820,-1115,-175,709,127,-179,673,155,-169,643,184,-193,815,-1187,-154,626,65,-147,603,76,-146,651,53,-200,445,-1051,-203,459,-1028,-200,435,-1077,-139,797,-1114,-73,650,180,-144,827,-1206,-79,604,76,-74,726,115,-78,668,45,-127,460,-1031,-144,434,-1078,-58,678,153,-72,625,66,-127,801,-1146,-129,452,-1058,-131,466,-204,-80,467,-205,-65,491,-213,-79,517,-222,-131,514,-221,-147,493,-214,-25,1505,1163,-168,1023,-523,-73,1085,-752,4,1692,1135,-23,1735,1115,-99,1732,1031,-71,1573,1037,-50,1069,-718,-102,1026,-512,-94,1507,90,-102,1502,61,-141,979,-282,-164,915,-17,-73,1302,635,-198,1256,568,141,1195,606,159,1023,567,145,901,581,116,575,405,99,482,354,52,189,264,30,0,278,38,28,232,42,61,179,60,219,181,104,510,268,113,615,273,161,906,348,206,1006,370,-207,1041,338,-163,958,289,-117,734,109,-116,668,45,-105,532,-229,-108,501,-362,-111,441,-380,-108,389,-397,-105,449,-196,-119,586,82,-125,630,194,-147,891,493,-160,1013,531,-140,1182,607,179,1135,-969,189,1064,-1031,174,910,-1287,171,548,-1505,167,516,-1524,165,454,-1608,156,410,-1598,167,338,-1582,168,417,-1506,165,520,-1422,171,824,-1215,214,895,-955,264,976,-635,-180,1106,-928,-191,1030,-990,-176,827,-1206,-174,425,-1088,-169,392,-1090,-168,293,-1121,-158,263,-1087,-169,214,-1033,-171,322,-1018,-167,461,-1011,-174,817,-1105,-216,861,-911,-266,944,-593,96,110,223,82,159,213,55,177,202,23,169,208,-7,123,220,14,114,254,43,110,267,73,105,257,-76,437,-293,-52,472,-298,-76,497,-253,-106,502,-243,-136,495,-254,-157,474,-297,-136,438,-296,-107,419,-287,-34,1548,1140,4,1576,1181,30,1576,1182,54,1578,1176,86,1552,1127,-32,1574,-959,-42,1529,-987,0,1515,-987,43,1530,-988,34,1575,-959,0,1587,-960,-83,1430,-1394,-2,1416,-1391,77,1434,-1398,42,1515,-1376,-4,1550,-1353,-51,1512,-1374,223,926,-1197,195,968,-1227,191,993,-1242,116,984,-1234,121,943,-1221,120,881,-1167,180,866,-1155,222,884,-1165,-118,937,-1201,-193,944,-1210,-198,925,-1190,-226,894,-1154,-225,867,-1116,-183,855,-1103,-122,863,-1118,-123,903,-1180,96,1734,1071,109,1756,1052,110,1740,1026,101,1715,1043,-66,1729,1088,-85,1750,1072,-90,1734,1047,-76,1709,1061,114,1735,1052,-88,1729,1073] },
{ "name": "horse_A_006", "vertices": [0,1542,55,0,1542,87,0,1618,-307,0,1674,-567,0,1351,-974,0,1478,-960,0,1617,-851,0,1046,-490,0,969,-279,0,903,-16,-3,1786,443,-8,1602,802,0,1055,615,0,1258,-959,0,1163,-861,0,960,567,0,931,316,-6,1984,921,3,1951,1006,-2,1626,851,31,1601,1179,14,1821,1078,7,1581,944,23,1490,1071,37,1550,1222,24,1454,1070,32,1424,1142,26,1502,1105,28,1427,1102,31,1431,1133,0,1084,-689,24,1685,1138,37,1454,1197,0,1604,-881,0,1554,-920,1,1592,-1068,1,1488,-1062,0,1586,-1131,2,1442,-1176,-11,1581,-1518,-16,1613,-1660,37,1485,1206,0,1621,257,0,1175,650,-16,1908,687,0,1128,-775,19,1752,1109,0,1298,643,0,930,453,272,1182,144,225,1395,17,270,1350,-177,254,1258,-469,278,1033,-43,146,1428,174,251,1219,395,142,1578,-368,199,1639,-555,299,1124,-777,173,1396,492,137,1574,-868,209,1035,-289,255,1099,351,211,1243,265,252,925,411,231,1105,503,217,932,500,108,1659,599,68,1762,472,81,1641,785,102,1011,565,154,1246,-958,254,1152,-876,243,940,343,117,1814,858,48,1969,957,105,1847,891,34,1948,1003,114,1711,819,108,1831,993,97,1634,839,76,1539,1074,99,1744,1033,52,1600,1176,51,1822,1071,72,1595,936,60,1499,1072,274,1395,-718,105,1367,-994,89,1502,1091,75,1559,1193,66,1456,1093,79,1447,1122,77,1450,1119,204,1076,-530,89,909,483,99,1152,-911,81,936,316,110,1947,1019,70,2041,1094,66,2030,1097,106,92,73,79,53,110,96,139,32,225,329,-1302,220,268,-1253,201,348,-1317,7,60,109,28,147,29,125,261,-1248,131,340,-1311,86,1099,-799,112,297,-1276,58,1944,1002,84,1927,984,90,1923,968,62,1958,988,53,1682,1132,81,1924,927,43,1515,-942,99,1494,1156,85,1474,1156,199,1078,273,23,1590,-888,33,1564,-900,35,1560,-1064,66,1499,-1061,46,1548,-1146,83,1463,-1180,37,1550,-1472,69,1529,-1529,99,1533,1157,78,1519,1159,109,1834,1048,70,1947,994,98,1980,1043,110,1992,1037,82,1934,939,64,888,432,-3,106,68,67,1607,274,80,1181,627,68,1491,1191,66,1456,1187,66,1427,1134,57,1499,1092,60,1435,1128,49,1431,1100,58,2000,1044,87,1976,1019,116,1947,1007,97,1984,953,62,2010,1037,329,1044,-627,285,1347,-510,213,1371,-907,261,943,-917,277,1000,-946,235,1051,-977,153,1079,-993,118,982,-967,161,926,-905,211,359,-1211,129,364,-1211,122,390,-1242,140,416,-1254,194,414,-1255,210,391,-1248,90,1797,773,46,1881,691,213,852,-1175,214,842,-1132,175,649,223,177,633,266,165,621,307,194,864,-1206,145,540,229,135,532,252,139,549,202,202,470,-1210,205,476,-1183,202,468,-1238,140,821,-1143,71,632,298,146,882,-1220,68,540,248,75,664,201,73,564,181,129,477,-1186,145,468,-1240,57,643,260,63,549,226,129,836,-1173,130,479,-1214,91,240,149,41,246,146,29,258,121,46,269,97,96,262,103,110,250,124,82,1573,1130,168,1065,-511,73,1127,-745,35,1756,1104,56,1801,1079,114,1800,981,98,1639,995,50,1107,-708,102,1063,-499,94,1529,85,102,1529,60,142,1003,-277,167,933,-5,73,1326,627,198,1288,547,-272,1193,150,-225,1395,17,-270,1356,-169,-254,1269,-406,-278,1033,-43,-146,1432,180,-251,1235,417,-141,1581,-365,-199,1640,-553,-303,1086,-678,-173,1397,500,-136,1571,-867,-210,1039,-272,-256,1125,364,-211,1271,290,-253,953,398,-231,1113,514,-218,945,487,-121,1658,594,-76,1761,469,-102,1640,785,-102,1012,565,-156,1213,-923,-259,1097,-781,-245,977,335,-129,1807,883,-51,1966,967,-113,1841,914,-27,1947,1010,-128,1704,843,-95,1825,1014,-103,1628,859,-31,1536,1085,-73,1739,1050,9,1599,1180,-22,1820,1079,-57,1591,949,-13,1496,1079,-274,1373,-681,-106,1348,-980,-38,1498,1103,-7,1557,1202,-12,1454,1101,-18,1444,1132,-17,1448,1127,-205,1077,-480,-90,922,472,-103,1089,-817,-82,959,314,-99,1945,1039,-52,2047,1098,-47,2037,1101,-160,538,-335,-141,490,-365,-143,589,-303,-235,293,-737,-230,270,-661,-211,300,-759,-68,487,-366,-75,589,-303,-134,267,-653,-140,297,-750,-90,1055,-697,-121,281,-697,-51,1942,1013,-79,1922,1001,-87,1917,986,-59,1954,1000,-4,1681,1138,-87,1919,944,-43,1509,-939,-34,1490,1170,-19,1471,1166,-200,1100,283,-23,1590,-888,-33,1564,-900,-31,1559,-1063,-62,1498,-1060,-46,1545,-1144,-80,1458,-1175,-55,1547,-1469,-89,1524,-1525,-35,1529,1171,-14,1516,1168,-85,1829,1068,-64,1943,1008,-85,1981,1058,-99,1991,1054,-86,1928,956,-65,905,422,-50,538,-334,-67,1607,274,-80,1179,632,3,1489,1198,6,1454,1193,-2,1425,1141,-6,1497,1099,1,1433,1133,7,1430,1104,-47,2003,1050,-78,1975,1032,-107,1944,1028,-101,1976,969,-53,2012,1043,-332,1034,-516,-284,1351,-465,-214,1346,-884,-268,882,-783,-283,934,-822,-241,977,-863,-159,1002,-883,-125,911,-841,-168,867,-770,-220,368,-678,-139,373,-681,-131,376,-721,-149,391,-746,-203,389,-745,-220,374,-726,-115,1794,775,-79,1879,694,-222,760,-978,-224,781,-946,-175,714,182,-179,680,210,-169,651,238,-203,748,-1008,-155,637,118,-147,613,127,-147,663,108,-211,461,-739,-214,483,-723,-211,441,-758,-150,760,-934,-74,658,235,-155,752,-1031,-80,614,127,-74,730,170,-79,681,102,-138,482,-726,-155,440,-760,-59,684,208,-73,636,120,-138,751,-965,-139,465,-748,-132,503,-165,-81,503,-165,-66,528,-171,-80,554,-177,-131,551,-177,-148,529,-171,-27,1570,1141,-168,1065,-488,-74,1114,-714,2,1755,1108,-25,1798,1087,-101,1793,1003,-73,1634,1013,-50,1101,-688,-103,1063,-493,-94,1529,85,-102,1529,60,-142,1004,-273,-167,933,-5,-73,1326,629,-198,1288,559,141,1218,591,159,1050,531,146,929,527,121,618,322,105,528,267,64,237,165,46,44,120,55,84,84,60,130,42,72,272,83,111,560,183,119,665,192,162,945,303,206,1042,332,-207,1069,340,-163,980,299,-117,738,164,-117,681,102,-106,569,-183,-109,574,-312,-112,521,-345,-109,475,-374,-106,485,-158,-119,596,132,-126,638,249,-147,937,515,-160,1055,536,-140,1217,601,181,1157,-933,192,1079,-990,178,882,-1219,175,460,-1253,170,424,-1256,169,331,-1304,160,296,-1275,171,239,-1230,172,342,-1196,169,472,-1166,175,835,-1122,217,916,-902,266,1019,-588,-186,1092,-839,-198,1002,-880,-187,752,-1030,-184,427,-765,-180,396,-752,-178,293,-739,-169,280,-695,-180,259,-625,-181,363,-657,-178,492,-708,-185,782,-936,-224,858,-764,-269,1015,-474,111,166,100,96,216,102,68,234,98,37,225,98,7,177,96,28,160,128,56,152,142,87,152,130,-77,495,-261,-53,531,-257,-77,544,-208,-107,545,-197,-137,542,-210,-158,532,-256,-137,497,-264,-107,477,-259,-36,1612,1117,2,1641,1158,27,1641,1158,52,1643,1153,84,1616,1104,-32,1599,-951,-42,1555,-979,0,1540,-979,44,1555,-980,34,1600,-951,1,1612,-951,-83,1441,-1370,-2,1428,-1367,77,1446,-1374,42,1525,-1349,-5,1558,-1325,-52,1522,-1347,227,931,-1145,199,967,-1182,195,988,-1201,119,980,-1192,125,943,-1172,124,895,-1108,184,884,-1093,226,899,-1107,-128,858,-1064,-204,863,-1074,-208,851,-1051,-236,832,-1009,-236,818,-966,-194,810,-950,-133,813,-967,-134,833,-1036,93,1796,1044,107,1818,1024,108,1801,998,99,1776,1016,-68,1791,1060,-87,1812,1044,-92,1795,1019,-78,1771,1034,111,1797,1025,-90,1791,1045] },
{ "name": "horse_A_007", "vertices": [0,1555,54,0,1550,87,0,1633,-295,0,1676,-558,0,1333,-949,0,1461,-941,0,1605,-839,0,1052,-452,0,962,-259,0,899,19,-4,1801,429,-9,1620,789,0,1088,626,0,1241,-929,0,1152,-828,0,994,585,0,949,334,-6,1993,903,3,1959,988,-3,1635,832,29,1609,1160,13,1829,1059,6,1590,925,21,1498,1052,35,1558,1203,22,1462,1050,30,1432,1123,24,1510,1086,26,1435,1082,29,1439,1113,0,1081,-652,23,1693,1120,35,1462,1178,0,1591,-868,0,1539,-905,1,1567,-1048,2,1462,-1040,0,1545,-1097,2,1400,-1140,-12,1547,-1478,-18,1594,-1620,35,1493,1187,0,1634,254,0,1203,658,-17,1926,669,0,1121,-740,18,1761,1090,0,1321,649,0,955,469,274,1197,155,227,1407,22,272,1360,-165,254,1278,-401,285,1031,-16,146,1440,176,251,1247,389,141,1593,-354,199,1643,-543,302,1120,-680,173,1417,494,136,1561,-851,212,1035,-258,256,1130,340,211,1271,260,253,961,387,231,1135,492,217,965,478,107,1679,589,67,1778,459,80,1664,775,102,1039,558,155,1218,-893,258,1135,-780,244,976,323,116,1823,840,48,1978,939,105,1856,874,34,1957,986,113,1720,801,108,1840,975,96,1643,820,75,1548,1055,98,1752,1015,50,1608,1157,50,1830,1053,71,1603,917,59,1507,1053,274,1390,-674,106,1340,-963,87,1510,1072,74,1567,1174,64,1464,1074,77,1455,1103,75,1459,1099,205,1083,-467,90,939,472,103,1129,-814,81,962,314,110,1957,1001,70,2053,1073,66,2043,1076,148,229,-129,126,175,-115,134,288,-143,232,299,-1021,227,253,-957,208,312,-1041,53,175,-115,65,291,-144,132,248,-950,137,306,-1033,89,1090,-700,118,275,-987,58,1953,984,84,1936,967,89,1931,950,62,1966,970,52,1691,1114,81,1933,909,43,1497,-924,97,1502,1137,83,1482,1137,201,1103,277,23,1577,-874,33,1551,-885,35,1535,-1043,66,1474,-1039,46,1508,-1112,84,1422,-1144,36,1514,-1434,67,1496,-1492,97,1541,1139,76,1527,1140,109,1843,1030,70,1955,977,98,1991,1024,110,2002,1018,82,1942,921,64,917,426,38,235,-130,67,1620,272,80,1206,633,66,1499,1172,64,1464,1168,64,1436,1115,55,1507,1073,58,1443,1108,47,1439,1080,58,2011,1024,87,1986,1000,116,1957,988,97,1992,934,62,2020,1017,333,1054,-528,284,1363,-457,214,1349,-869,267,935,-815,282,992,-846,239,1041,-880,158,1068,-896,123,972,-867,166,918,-803,217,352,-942,136,357,-943,128,373,-980,146,395,-999,200,393,-1000,217,372,-986,89,1818,758,45,1899,674,220,834,-1049,221,838,-1008,175,693,199,178,670,239,167,651,278,201,837,-1082,152,588,179,143,573,198,145,605,156,208,459,-972,211,473,-948,209,449,-998,147,815,-1010,72,659,270,153,850,-1101,76,577,196,74,706,181,78,620,140,135,473,-951,152,448,-1000,58,676,235,70,591,178,135,820,-1043,137,467,-978,121,324,10,70,327,8,57,344,-10,72,363,-29,123,359,-26,139,343,-9,80,1581,1111,169,1071,-462,74,1121,-690,34,1765,1086,56,1809,1060,114,1808,963,97,1648,977,50,1103,-660,103,1069,-458,94,1537,86,102,1542,60,144,998,-253,171,931,28,73,1350,632,198,1312,548,-274,1199,163,-227,1407,22,-271,1373,-160,-251,1322,-350,-285,1031,-16,-146,1441,180,-250,1260,421,-141,1600,-356,-199,1645,-546,-301,1091,-567,-173,1420,500,-136,1558,-853,-212,1047,-240,-256,1145,383,-210,1281,290,-254,984,452,-231,1153,534,-219,990,540,-123,1678,583,-77,1777,455,-104,1663,774,-103,1054,595,-156,1178,-857,-257,1078,-669,-245,995,382,-129,1816,865,-51,1975,949,-113,1850,895,-28,1955,992,-128,1713,824,-96,1834,995,-104,1638,840,-32,1545,1066,-74,1748,1032,7,1607,1161,-23,1828,1060,-58,1600,930,-15,1505,1060,-274,1371,-645,-106,1317,-947,-39,1507,1084,-9,1565,1182,-14,1462,1082,-20,1452,1113,-19,1457,1108,-203,1104,-410,-91,955,517,-102,1064,-703,-82,971,346,-99,1953,1021,-51,2053,1083,-47,2043,1085,-164,562,-228,-144,517,-264,-147,609,-190,-233,415,-364,-228,432,-287,-209,410,-387,-72,515,-265,-78,609,-190,-133,434,-279,-138,413,-378,-87,1058,-580,-119,424,-324,-51,1950,995,-79,1931,983,-87,1926,968,-59,1963,982,-6,1689,1120,-87,1928,925,-43,1489,-922,-36,1499,1150,-21,1479,1147,-201,1112,305,-23,1577,-874,-33,1551,-885,-31,1534,-1043,-62,1473,-1038,-46,1504,-1109,-80,1417,-1139,-56,1510,-1431,-90,1491,-1487,-37,1537,1152,-16,1524,1149,-86,1837,1049,-64,1952,990,-85,1988,1041,-99,1999,1037,-86,1938,938,-65,929,464,-53,562,-228,-67,1620,272,-80,1210,642,1,1497,1179,4,1462,1173,-4,1434,1122,-7,1505,1080,0,1442,1114,5,1438,1085,-47,2010,1033,-78,1983,1015,-107,1952,1010,-101,1986,952,-52,2019,1027,-329,1074,-399,-282,1389,-426,-214,1319,-847,-265,872,-633,-281,916,-681,-239,951,-729,-158,972,-755,-122,890,-697,-165,860,-618,-218,510,-349,-137,513,-354,-129,496,-391,-147,497,-420,-201,496,-419,-218,491,-394,-116,1816,760,-79,1897,677,-221,733,-790,-222,764,-772,-177,709,286,-181,678,315,-171,652,344,-202,709,-813,-157,634,225,-150,610,233,-149,660,215,-209,561,-448,-212,588,-444,-209,535,-457,-148,751,-751,-76,658,340,-154,703,-835,-82,611,233,-76,723,273,-81,679,210,-136,586,-445,-153,533,-457,-61,682,313,-75,633,226,-136,729,-775,-138,561,-458,-135,506,-61,-84,507,-62,-69,531,-66,-84,557,-72,-135,554,-72,-151,532,-66,-28,1578,1122,-168,1080,-435,-74,1114,-656,1,1764,1089,-26,1807,1069,-102,1802,984,-74,1643,994,-50,1101,-638,-102,1071,-451,-94,1537,86,-102,1542,60,-144,1001,-249,-171,931,28,-73,1351,634,-198,1319,562,141,1243,592,160,1079,522,147,961,509,123,644,292,114,562,211,95,314,24,93,159,-111,99,212,-124,99,273,-140,99,372,-41,115,619,140,118,711,172,163,977,290,207,1073,323,-207,1087,364,-163,991,338,-119,730,266,-119,679,209,-109,573,-78,-113,595,-201,-115,547,-240,-113,504,-275,-109,488,-55,-122,593,238,-128,641,355,-148,983,565,-160,1096,562,-140,1252,608,185,1133,-836,196,1068,-893,185,851,-1100,182,438,-1010,177,402,-1003,176,300,-1023,167,274,-986,178,232,-926,179,340,-923,176,474,-930,182,834,-998,223,908,-799,269,1031,-489,-185,1061,-724,-197,973,-752,-185,703,-835,-183,519,-456,-178,499,-427,-177,415,-366,-168,425,-322,-178,440,-250,-180,516,-328,-177,603,-433,-183,768,-765,-221,852,-610,-265,1064,-355,147,282,-70,127,323,-45,98,337,-40,68,328,-46,42,285,-71,65,256,-49,94,244,-39,124,253,-51,-80,510,-160,-57,546,-152,-80,553,-102,-110,551,-90,-140,551,-103,-161,547,-151,-140,513,-163,-110,492,-162,-38,1621,1098,0,1650,1139,26,1650,1140,51,1651,1134,83,1624,1086,-32,1581,-936,-42,1536,-964,1,1522,-964,44,1536,-964,34,1581,-936,1,1594,-937,-84,1400,-1335,-2,1387,-1333,77,1405,-1340,42,1482,-1314,-5,1514,-1290,-52,1479,-1311,234,917,-1044,206,946,-1083,201,965,-1104,126,957,-1094,131,924,-1071,131,886,-1005,191,877,-989,233,890,-1003,-127,794,-904,-203,795,-914,-207,790,-890,-235,782,-847,-234,780,-806,-192,777,-790,-131,775,-806,-132,777,-873,93,1804,1026,106,1826,1006,107,1810,980,98,1785,997,-69,1800,1041,-87,1821,1025,-93,1804,1000,-79,1780,1015,111,1805,1006,-91,1800,1026] },
{ "name": "horse_A_008", "vertices": [0,1558,52,0,1550,92,0,1628,-285,0,1653,-549,0,1282,-915,0,1412,-916,0,1563,-825,0,1037,-402,0,938,-225,0,885,71,-5,1816,422,-11,1640,786,0,1133,660,0,1193,-889,0,1112,-783,0,1040,628,0,974,380,-5,1995,891,3,1961,976,-3,1637,819,28,1611,1148,13,1831,1047,5,1593,912,20,1500,1039,33,1560,1191,20,1464,1037,28,1434,1110,23,1512,1073,24,1437,1069,27,1441,1100,0,1052,-603,22,1695,1107,33,1463,1165,0,1548,-853,0,1493,-886,1,1511,-1028,2,1407,-1015,0,1481,-1070,2,1334,-1105,-13,1468,-1447,-19,1519,-1590,33,1495,1174,0,1641,255,0,1237,681,-17,1945,657,0,1086,-694,17,1762,1078,0,1349,665,0,990,512,276,1213,183,228,1407,29,273,1354,-151,254,1279,-322,291,1018,21,146,1450,189,251,1298,418,140,1586,-340,198,1621,-531,306,1099,-561,173,1443,509,136,1518,-830,215,1019,-216,256,1191,371,211,1320,289,254,1037,415,231,1194,523,218,1037,506,106,1702,589,66,1794,453,78,1692,774,103,1092,588,158,1164,-809,262,1099,-657,245,1049,352,117,1825,829,49,1980,927,105,1858,862,35,1959,974,113,1722,789,108,1842,964,96,1645,808,73,1549,1042,98,1754,1003,49,1610,1144,50,1832,1041,71,1605,905,57,1509,1040,274,1357,-619,107,1280,-920,86,1511,1059,72,1569,1162,62,1466,1061,75,1456,1090,73,1460,1087,207,1072,-389,90,997,502,108,1086,-691,82,1008,347,111,1962,988,71,2062,1056,68,2052,1059,166,487,-241,146,433,-259,149,544,-222,241,305,-725,236,278,-651,217,313,-747,74,431,-260,80,544,-222,141,275,-642,146,309,-738,94,1064,-577,127,291,-686,59,1955,972,85,1938,955,90,1933,939,63,1968,958,51,1692,1101,82,1935,897,43,1445,-901,95,1504,1125,81,1483,1124,202,1147,312,23,1533,-858,33,1506,-868,35,1479,-1022,66,1419,-1015,46,1443,-1083,84,1356,-1111,36,1436,-1403,67,1418,-1460,95,1542,1126,75,1528,1127,109,1844,1018,70,1958,965,99,1998,1010,111,2008,1003,83,1944,910,65,968,457,55,488,-241,67,1629,274,80,1240,656,64,1500,1159,61,1465,1155,62,1437,1102,54,1509,1061,56,1445,1096,45,1441,1067,59,2017,1009,88,1991,986,117,1961,976,98,1993,920,63,2026,1001,336,1049,-409,283,1358,-395,215,1295,-818,274,912,-692,289,968,-725,245,1015,-760,163,1040,-777,130,944,-746,174,893,-680,226,377,-662,145,382,-664,137,387,-704,155,404,-728,209,402,-728,226,385,-710,88,1842,750,45,1917,663,229,809,-903,230,824,-867,176,774,228,180,745,261,170,720,295,210,802,-935,157,684,180,149,663,193,149,708,164,217,472,-719,220,492,-700,217,456,-741,156,801,-860,75,727,289,162,809,-956,82,664,192,75,788,213,81,724,154,144,492,-702,161,454,-742,60,748,259,75,683,180,144,797,-892,146,478,-727,136,492,-68,85,493,-69,70,515,-80,84,539,-91,136,537,-90,152,517,-80,79,1583,1098,169,1057,-400,75,1092,-621,34,1767,1074,55,1811,1048,114,1810,951,96,1649,965,51,1076,-599,103,1054,-406,94,1537,91,102,1545,58,146,976,-217,175,919,76,73,1378,647,198,1348,570,-276,1197,190,-228,1407,29,-273,1372,-150,-250,1346,-304,-291,1018,21,-146,1443,188,-250,1279,443,-141,1595,-348,-199,1624,-540,-295,1082,-464,-173,1443,508,-137,1515,-836,-214,1036,-203,-256,1162,427,-210,1282,310,-255,1019,540,-232,1194,575,-220,1043,623,-124,1701,582,-78,1793,449,-105,1691,772,-104,1102,647,-153,1122,-782,-252,1049,-560,-246,1014,465,-129,1819,852,-50,1978,937,-113,1853,883,-27,1958,980,-128,1716,812,-96,1837,983,-104,1641,827,-34,1547,1053,-74,1750,1019,6,1609,1149,-23,1830,1048,-59,1602,917,-16,1507,1047,-274,1339,-608,-106,1258,-905,-41,1509,1071,-10,1567,1170,-16,1464,1069,-22,1454,1100,-21,1459,1095,-201,1110,-342,-92,995,591,-97,1031,-591,-82,983,404,-99,1958,1008,-52,2060,1067,-48,2050,1070,-168,530,-56,-148,484,-89,-151,579,-21,-222,522,-117,-217,564,-51,-198,510,-137,-76,482,-91,-82,579,-20,-122,568,-43,-128,515,-129,-82,1051,-472,-108,544,-82,-51,1953,983,-79,1934,971,-87,1929,956,-58,1966,969,-7,1691,1107,-87,1931,913,-43,1438,-899,-37,1501,1137,-23,1481,1134,-202,1118,350,-23,1533,-858,-33,1506,-868,-31,1478,-1021,-62,1417,-1013,-46,1440,-1080,-80,1350,-1105,-56,1433,-1399,-90,1413,-1454,-39,1539,1139,-18,1526,1136,-86,1840,1037,-64,1955,978,-85,1994,1027,-99,2004,1023,-85,1940,926,-66,956,534,-57,531,-55,-67,1629,274,-80,1245,664,0,1499,1166,2,1464,1160,-6,1436,1109,-9,1507,1067,-2,1443,1101,3,1440,1072,-47,2015,1019,-78,1988,1002,-107,1957,997,-101,1988,938,-52,2024,1012,-323,1096,-298,-282,1396,-394,-214,1266,-802,-256,856,-494,-273,890,-548,-231,918,-602,-151,935,-631,-113,865,-560,-155,849,-477,-208,616,-136,-126,617,-141,-118,589,-170,-136,580,-198,-191,579,-196,-207,583,-172,-118,1840,751,-80,1915,665,-210,702,-623,-211,736,-615,-180,713,440,-184,688,473,-174,667,505,-191,673,-638,-160,635,389,-152,612,399,-152,660,377,-198,630,-246,-202,657,-250,-199,602,-247,-137,730,-590,-78,673,500,-143,661,-657,-85,613,398,-79,724,426,-84,678,370,-125,655,-251,-142,600,-247,-63,691,470,-78,634,390,-125,703,-607,-127,627,-256,-139,483,114,-87,484,113,-73,508,106,-87,533,98,-139,530,99,-155,509,106,-30,1580,1109,-166,1075,-377,-72,1091,-593,0,1766,1077,-27,1809,1056,-102,1805,972,-75,1646,981,-49,1078,-581,-102,1059,-400,-94,1537,91,-102,1545,58,-145,981,-214,-175,919,76,-73,1379,647,-198,1350,575,140,1283,616,160,1135,553,148,1027,537,127,709,307,121,647,202,110,476,-58,115,416,-265,117,469,-247,115,528,-228,110,554,-100,118,724,154,119,795,205,163,1040,321,207,1130,354,-207,1101,416,-164,1001,409,-122,731,419,-122,678,370,-113,548,91,-117,565,-31,-119,514,-67,-117,470,-99,-113,466,121,-124,595,405,-130,658,517,-149,1037,643,-160,1140,610,-140,1289,628,190,1089,-711,202,1041,-775,193,809,-956,191,442,-749,186,409,-734,185,305,-727,176,290,-684,186,265,-615,188,371,-641,185,499,-683,191,823,-857,231,885,-675,273,1029,-370,-179,1022,-611,-189,936,-628,-175,661,-657,-172,586,-241,-167,579,-205,-166,521,-119,-157,545,-81,-168,584,-19,-169,629,-118,-166,674,-244,-172,742,-609,-212,841,-468,-259,1096,-254,163,500,-163,141,520,-120,111,527,-109,82,523,-120,58,499,-165,82,463,-160,112,447,-156,142,464,-163,-84,482,14,-61,518,20,-84,528,70,-114,527,82,-144,525,68,-165,519,21,-144,485,11,-114,466,11,-39,1623,1085,0,1652,1126,25,1651,1127,49,1653,1122,81,1626,1073,-32,1533,-919,-42,1486,-945,1,1472,-944,44,1486,-945,34,1533,-919,1,1545,-921,-84,1324,-1301,-2,1311,-1298,76,1330,-1306,41,1406,-1284,-5,1439,-1261,-52,1403,-1280,243,886,-921,214,910,-961,209,925,-982,134,918,-973,140,889,-948,140,860,-881,201,856,-865,243,867,-880,-117,733,-747,-192,732,-756,-197,731,-732,-224,731,-690,-223,737,-651,-180,738,-636,-120,734,-650,-121,723,-713,93,1806,1014,106,1828,994,107,1811,968,98,1787,985,-69,1802,1029,-87,1824,1013,-93,1807,988,-79,1783,1002,111,1807,995,-91,1803,1014] },
{ "name": "horse_A_009", "vertices": [0,1555,50,0,1552,104,0,1614,-274,0,1623,-540,0,1230,-880,0,1360,-891,0,1517,-809,0,1018,-355,0,914,-192,0,873,115,-5,1834,429,-12,1665,795,0,1173,698,0,1143,-849,0,1069,-741,0,1079,671,0,1006,424,-3,2005,900,5,1969,984,-3,1649,820,27,1615,1148,13,1838,1052,5,1602,912,18,1507,1037,32,1563,1190,19,1471,1034,26,1439,1106,21,1518,1071,22,1443,1066,25,1446,1097,0,1021,-557,21,1700,1109,31,1467,1162,0,1500,-836,0,1444,-866,1,1457,-1011,2,1353,-990,-1,1427,-1058,2,1278,-1078,-12,1375,-1429,-19,1411,-1577,31,1498,1172,0,1652,263,0,1272,711,-18,1970,661,0,1049,-649,18,1768,1081,0,1379,688,0,1026,555,278,1216,211,230,1402,34,274,1343,-138,252,1279,-254,296,1005,55,146,1457,204,250,1330,445,138,1571,-326,196,1592,-518,316,1084,-455,173,1471,524,135,1471,-809,218,1002,-179,256,1221,416,210,1335,313,254,1085,498,231,1245,566,219,1100,585,105,1729,602,66,1815,462,77,1724,785,103,1147,642,164,1113,-731,274,1071,-548,245,1083,429,118,1835,834,50,1989,935,106,1868,868,36,1967,982,114,1733,791,109,1849,969,96,1656,809,73,1555,1041,98,1761,1006,48,1614,1145,50,1838,1046,70,1615,905,56,1515,1038,273,1322,-565,110,1219,-875,85,1517,1057,71,1572,1161,61,1472,1058,74,1461,1087,71,1465,1084,211,1060,-318,91,1045,574,120,1046,-580,82,1030,406,113,1972,996,73,2075,1059,70,2064,1063,150,580,-111,129,535,-145,134,628,-74,268,414,-397,263,411,-318,245,415,-420,57,533,-145,66,628,-72,167,409,-311,174,413,-412,106,1037,-469,154,410,-357,60,1964,980,86,1946,963,91,1941,946,64,1977,966,51,1697,1103,83,1944,905,43,1391,-875,94,1508,1122,80,1488,1121,203,1163,355,23,1485,-840,33,1458,-848,35,1425,-1003,66,1365,-991,46,1388,-1067,84,1299,-1086,36,1348,-1382,67,1325,-1438,94,1547,1125,73,1532,1125,109,1851,1024,72,1966,973,101,2008,1016,112,2019,1008,84,1953,917,65,1005,526,40,581,-108,67,1641,282,80,1279,684,62,1504,1157,60,1469,1152,61,1442,1099,53,1515,1059,54,1450,1092,44,1447,1064,61,2028,1015,89,2001,992,118,1971,983,99,2000,926,64,2036,1006,346,1051,-304,279,1350,-340,217,1242,-766,295,890,-577,306,945,-613,261,988,-651,178,1008,-671,150,912,-634,196,868,-565,252,502,-359,170,504,-363,163,497,-404,181,506,-431,236,505,-430,252,495,-407,87,1871,757,44,1941,668,254,793,-756,255,822,-736,178,791,367,182,765,401,172,743,435,235,772,-782,156,706,319,148,684,332,148,730,305,242,576,-441,245,602,-432,243,552,-454,180,805,-716,77,749,431,187,768,-805,81,685,333,76,803,354,79,747,298,169,599,-435,187,549,-455,62,768,400,74,705,322,169,786,-743,171,576,-451,126,528,60,75,529,61,60,552,53,74,576,42,126,574,42,143,553,50,78,1588,1098,172,1040,-343,78,1060,-557,34,1772,1077,56,1817,1053,114,1818,956,96,1657,966,53,1045,-542,103,1035,-357,94,1539,104,102,1542,56,147,954,-183,178,909,117,73,1410,667,198,1385,590,-278,1220,223,-230,1402,34,-275,1364,-145,-252,1357,-283,-296,1005,55,-145,1459,212,-250,1329,491,-143,1580,-340,-201,1594,-533,-288,1063,-386,-173,1469,535,-137,1466,-820,-216,1023,-170,-256,1216,444,-209,1341,359,-257,1088,547,-232,1241,607,-222,1109,633,-125,1727,594,-79,1813,457,-107,1722,783,-104,1144,673,-148,1063,-717,-243,1013,-474,-248,1057,476,-128,1831,857,-49,1987,945,-112,1863,888,-26,1966,987,-128,1729,814,-95,1845,988,-104,1653,828,-35,1553,1051,-74,1758,1022,5,1613,1149,-23,1837,1053,-60,1612,917,-17,1514,1045,-274,1298,-577,-104,1200,-864,-42,1515,1069,-12,1571,1169,-17,1470,1066,-24,1460,1096,-22,1464,1092,-199,1114,-290,-93,1064,609,-87,993,-501,-83,1014,428,-99,1971,1014,-53,2078,1065,-49,2068,1069,-173,505,182,-153,461,147,-156,552,220,-203,388,17,-198,420,88,-179,378,-4,-80,459,145,-87,552,220,-103,424,96,-108,382,4,-74,1037,-387,-89,405,54,-50,1962,990,-77,1943,978,-86,1938,963,-57,1974,977,-7,1696,1109,-85,1941,920,-43,1384,-875,-39,1505,1135,-25,1486,1131,-203,1155,370,-23,1485,-840,-33,1458,-848,-31,1425,-1002,-62,1364,-989,-46,1385,-1063,-79,1294,-1080,-56,1345,-1379,-90,1319,-1432,-40,1544,1137,-19,1531,1134,-85,1847,1042,-62,1963,985,-86,2009,1030,-99,2018,1025,-84,1949,933,-67,1008,564,-62,506,183,-67,1641,282,-80,1275,697,-1,1503,1163,1,1468,1157,-8,1441,1105,-10,1514,1065,-3,1449,1097,1,1446,1068,-47,2029,1021,-78,2000,1005,-107,1969,1003,-99,1995,942,-52,2037,1013,-317,1112,-225,-285,1388,-379,-212,1210,-761,-242,837,-363,-259,858,-423,-219,874,-482,-138,887,-514,-99,836,-429,-141,837,-345,-188,484,11,-107,486,6,-99,462,-26,-117,457,-54,-171,455,-52,-188,456,-28,-119,1868,757,-80,1939,670,-191,633,-459,-191,667,-443,-184,770,595,-188,760,633,-178,753,669,-172,606,-478,-165,682,573,-157,664,589,-157,703,553,-179,513,-95,-182,540,-95,-179,485,-100,-118,657,-423,-83,755,662,-124,596,-499,-90,664,588,-83,775,578,-89,717,540,-106,538,-97,-123,483,-100,-68,761,630,-83,682,573,-106,631,-444,-108,511,-105,-143,452,358,-92,453,357,-78,473,345,-92,493,329,-143,491,331,-160,474,344,-31,1586,1108,-165,1067,-327,-70,1064,-539,0,1772,1081,-26,1815,1061,-101,1814,976,-75,1654,982,-48,1052,-530,-102,1042,-353,-94,1539,104,-102,1542,56,-147,958,-183,-178,909,117,-73,1409,670,-197,1381,612,140,1326,642,160,1188,602,148,1091,613,129,734,448,121,668,340,101,512,70,98,521,-155,101,565,-122,100,614,-84,100,591,33,117,747,297,120,809,345,163,1063,389,207,1158,406,-208,1135,415,-165,1027,426,-126,778,569,-127,717,540,-118,506,318,-121,539,209,-124,490,170,-121,447,136,-118,438,371,-129,650,600,-135,749,683,-151,1097,658,-161,1181,640,-140,1321,664,203,1051,-599,217,1011,-668,219,769,-805,217,536,-456,212,510,-438,212,413,-400,203,411,-354,213,408,-281,213,501,-337,209,614,-421,216,824,-728,253,862,-559,283,1032,-265,-170,978,-518,-177,887,-511,-155,597,-498,-153,469,-96,-148,456,-62,-147,387,15,-138,406,56,-148,436,123,-150,494,31,-147,556,-87,-152,673,-436,-197,830,-334,-253,1124,-182,150,567,-34,130,572,13,101,571,28,71,574,17,45,566,-32,69,530,-39,99,513,-39,128,533,-44,-89,454,251,-65,489,258,-89,497,309,-119,492,322,-149,495,307,-170,490,260,-149,457,247,-119,438,249,-40,1629,1085,0,1656,1127,24,1656,1128,49,1657,1123,81,1631,1074,-32,1483,-901,-42,1435,-924,1,1421,-922,44,1435,-924,34,1483,-902,1,1496,-904,-83,1247,-1271,-2,1235,-1268,77,1252,-1277,42,1331,-1262,-5,1365,-1243,-52,1328,-1259,267,851,-807,238,866,-845,232,876,-867,158,867,-858,164,845,-832,165,830,-770,226,832,-754,267,840,-768,-98,669,-586,-174,664,-596,-178,667,-570,-205,674,-524,-203,686,-480,-161,689,-463,-101,684,-479,-102,663,-548,93,1813,1018,107,1835,999,108,1819,973,98,1794,990,-69,1810,1033,-87,1831,1017,-92,1815,992,-79,1790,1006,111,1814,999,-90,1810,1018] },
{ "name": "horse_A_010", "vertices": [0,1521,48,0,1527,118,0,1574,-265,0,1574,-531,1,1169,-856,0,1300,-873,0,1461,-797,0,975,-327,0,869,-175,0,836,139,-6,1819,448,-12,1650,813,0,1178,731,1,1084,-823,0,1015,-714,0,1086,717,0,987,470,-2,1975,924,5,1936,1007,-4,1623,829,25,1575,1156,13,1801,1070,4,1572,919,17,1471,1040,30,1521,1195,17,1435,1036,24,1400,1106,20,1481,1074,20,1406,1066,23,1408,1097,0,972,-530,21,1661,1120,29,1426,1163,0,1442,-823,0,1385,-851,1,1401,-1002,2,1298,-974,-1,1376,-1061,3,1225,-1066,-12,1272,-1428,-18,1275,-1574,29,1457,1175,0,1630,274,0,1268,732,-18,1956,679,0,998,-623,17,1730,1096,0,1369,706,0,1020,601,279,1192,233,230,1367,37,273,1311,-131,245,1273,-209,298,967,73,146,1434,220,250,1324,470,136,1531,-319,195,1544,-509,317,1058,-364,173,1459,539,135,1413,-793,218,968,-155,256,1216,452,210,1320,338,255,1094,553,232,1251,599,220,1116,638,104,1718,623,65,1800,481,75,1714,805,103,1154,679,168,1049,-669,278,1028,-451,246,1084,482,118,1808,851,51,1957,960,107,1839,886,37,1933,1005,113,1708,805,109,1816,987,95,1630,819,71,1519,1047,97,1726,1020,47,1574,1152,50,1802,1064,69,1584,913,54,1479,1041,272,1271,-528,112,1148,-839,83,1480,1061,69,1531,1167,59,1435,1060,72,1424,1088,69,1428,1085,210,1037,-264,91,1051,622,126,994,-481,82,1020,447,114,1941,1018,74,2044,1080,71,2034,1085,142,615,-19,120,577,-60,127,655,26,287,506,-166,280,523,-89,263,501,-189,48,576,-59,59,655,30,185,520,-82,193,499,-181,109,1004,-374,172,510,-127,61,1930,1003,87,1913,985,92,1909,969,65,1944,989,50,1658,1115,84,1913,927,44,1327,-856,92,1468,1126,78,1448,1124,204,1149,386,23,1427,-827,33,1400,-834,35,1370,-992,66,1310,-976,46,1336,-1066,84,1245,-1076,36,1253,-1376,68,1220,-1427,93,1507,1130,72,1493,1130,109,1815,1042,73,1933,996,102,1977,1038,114,1988,1030,85,1921,940,66,1004,572,32,615,-12,67,1619,293,80,1274,706,61,1463,1160,58,1428,1153,59,1404,1099,51,1478,1062,52,1412,1093,42,1410,1064,62,1997,1036,90,1969,1014,119,1939,1005,99,1968,948,65,2005,1028,345,1049,-213,272,1330,-307,219,1175,-726,304,850,-461,315,900,-504,269,936,-548,186,950,-571,159,860,-523,205,826,-448,267,600,-151,186,599,-157,180,583,-194,198,585,-223,252,585,-221,269,582,-196,86,1859,776,44,1928,687,269,746,-620,269,779,-613,179,788,452,184,764,487,174,744,520,251,717,-637,156,705,406,149,683,418,148,729,392,257,652,-249,259,678,-250,259,625,-253,194,769,-587,79,750,517,204,703,-658,82,684,420,78,799,440,79,746,386,183,673,-252,202,621,-254,64,767,487,74,704,410,184,741,-606,186,646,-259,121,532,144,70,533,146,55,556,139,69,579,128,120,577,127,138,556,135,77,1549,1105,172,1006,-303,79,1016,-511,34,1735,1092,56,1780,1069,114,1785,973,95,1624,976,53,1000,-503,103,994,-327,94,1513,118,102,1508,56,147,913,-165,179,872,140,73,1400,684,198,1380,608,-279,1185,244,-230,1367,37,-277,1325,-140,-257,1318,-260,-298,967,73,-145,1431,224,-249,1309,509,-145,1537,-331,-202,1544,-524,-280,1019,-339,-172,1456,545,-138,1408,-805,-217,981,-153,-256,1188,489,-209,1301,376,-258,1082,635,-232,1241,644,-223,1121,712,-126,1715,615,-79,1799,476,-108,1712,803,-104,1153,720,-142,1003,-672,-233,965,-422,-249,1038,565,-128,1803,874,-48,1955,969,-112,1835,906,-25,1932,1010,-128,1703,827,-95,1812,1006,-105,1627,837,-36,1518,1056,-74,1723,1036,4,1573,1156,-23,1801,1070,-61,1582,925,-19,1478,1048,-274,1239,-552,-102,1137,-835,-44,1478,1072,-13,1530,1174,-19,1434,1067,-26,1422,1097,-24,1427,1093,-198,1076,-257,-94,1063,676,-76,950,-446,-84,989,488,-100,1942,1035,-55,2052,1080,-51,2043,1085,-176,368,504,-156,316,483,-159,424,527,-177,188,-27,-173,200,50,-153,184,-50,-84,313,482,-91,424,527,-77,202,59,-83,186,-40,-65,1003,-338,-63,194,13,-49,1929,1013,-77,1910,1000,-85,1906,985,-56,1942,1000,-8,1657,1120,-85,1910,942,-43,1324,-857,-41,1466,1138,-26,1446,1133,-204,1120,410,-23,1427,-827,-33,1400,-834,-31,1369,-991,-62,1309,-974,-46,1333,-1062,-79,1240,-1069,-55,1250,-1372,-89,1215,-1421,-42,1504,1142,-21,1491,1138,-85,1811,1060,-62,1931,1008,-87,1981,1049,-100,1990,1043,-83,1918,956,-68,999,630,-66,369,505,-67,1619,293,-79,1272,717,-3,1462,1166,0,1427,1159,-10,1403,1105,-12,1477,1068,-5,1411,1098,0,1410,1068,-48,2001,1039,-78,1971,1025,-107,1939,1024,-98,1962,961,-53,2008,1031,-313,1076,-184,-290,1342,-360,-210,1148,-731,-225,797,-308,-243,815,-369,-202,830,-428,-122,845,-461,-82,799,-373,-124,802,-290,-163,282,-7,-81,285,-11,-73,270,-49,-92,273,-78,-146,271,-77,-162,265,-53,-120,1856,775,-81,1926,688,-165,567,-410,-166,597,-381,-188,775,732,-192,779,775,-182,786,814,-146,548,-436,-168,680,757,-160,672,781,-160,687,730,-154,337,-103,-157,364,-94,-154,312,-116,-92,579,-367,-86,786,807,-98,546,-459,-93,672,780,-87,773,713,-92,693,712,-81,362,-97,-97,310,-117,-71,779,771,-86,679,758,-81,561,-396,-82,339,-113,-147,372,692,-96,372,690,-81,383,671,-96,392,646,-147,391,649,-163,383,670,-32,1547,1115,-165,1026,-297,-68,1018,-506,0,1734,1095,-26,1779,1077,-102,1781,992,-76,1621,991,-47,1006,-499,-102,1000,-325,-94,1513,118,-102,1508,56,-148,915,-165,-179,872,140,-73,1399,686,-197,1375,624,140,1323,664,160,1195,639,149,1105,663,131,735,534,121,667,426,96,515,155,88,566,-72,93,602,-31,93,643,15,94,594,119,117,746,385,121,805,431,164,1057,437,207,1152,445,-208,1105,474,-167,1000,506,-130,772,703,-130,693,712,-121,396,630,-125,408,520,-128,350,497,-125,299,476,-121,366,710,-132,666,798,-138,787,831,-152,1111,732,-161,1187,684,-140,1319,681,209,998,-499,224,955,-568,236,705,-657,233,610,-252,229,587,-230,231,503,-169,221,512,-124,230,528,-53,228,604,-130,223,693,-243,230,782,-608,262,823,-441,282,1034,-173,-157,931,-463,-161,843,-458,-130,546,-459,-127,296,-117,-123,275,-85,-121,187,-29,-112,195,15,-123,206,87,-124,286,14,-121,377,-82,-126,602,-370,-180,793,-278,-249,1093,-141,143,587,54,125,583,102,95,578,118,65,585,108,39,586,58,62,552,44,91,535,42,121,556,37,-93,340,586,-69,375,582,-93,396,628,-122,394,644,-152,394,627,-173,376,583,-152,340,581,-123,326,587,-41,1591,1093,-1,1617,1137,23,1616,1138,48,1618,1132,80,1594,1082,-32,1427,-888,-42,1377,-908,1,1364,-906,44,1378,-909,34,1427,-888,1,1440,-891,-83,1172,-1252,-1,1160,-1247,77,1176,-1258,42,1258,-1254,-5,1295,-1239,-52,1255,-1250,282,780,-686,252,787,-723,247,792,-745,173,783,-737,180,767,-709,180,764,-651,240,771,-637,282,777,-650,-73,631,-526,-149,625,-537,-152,626,-509,-179,629,-459,-178,638,-411,-136,641,-392,-76,640,-410,-77,622,-486,93,1777,1035,107,1800,1017,108,1785,990,98,1760,1005,-69,1775,1049,-87,1797,1034,-92,1782,1008,-79,1756,1021,111,1779,1016,-90,1776,1034] },
{ "name": "horse_A_011", "vertices": [0,1452,49,0,1462,124,0,1502,-263,0,1505,-528,0,1104,-856,0,1235,-872,0,1396,-795,0,904,-332,0,799,-178,0,763,139,-6,1755,480,-14,1575,837,0,1113,740,0,1019,-824,0,949,-718,-2,1021,728,-2,920,481,-4,1886,968,3,1840,1047,-8,1542,846,22,1469,1168,11,1701,1100,0,1484,932,13,1375,1045,26,1412,1203,13,1339,1038,20,1299,1105,16,1382,1080,16,1308,1065,19,1307,1097,0,903,-534,17,1558,1139,25,1320,1164,0,1378,-821,0,1321,-850,1,1347,-1009,2,1243,-978,-1,1330,-1084,3,1179,-1079,-10,1170,-1448,-14,1118,-1576,25,1350,1178,0,1565,281,0,1200,738,-19,1887,717,0,930,-627,14,1629,1120,0,1300,714,-2,954,612,279,1120,238,231,1298,35,273,1255,-136,242,1260,-215,299,895,71,146,1366,225,250,1254,480,138,1466,-324,197,1477,-514,305,1002,-309,173,1391,543,136,1347,-797,217,912,-153,256,1145,471,210,1244,348,256,1031,593,232,1189,616,220,1060,674,103,1650,653,65,1735,513,74,1642,835,104,1095,698,163,964,-650,265,951,-391,246,1014,520,115,1724,882,49,1865,1002,104,1752,920,35,1838,1045,110,1628,828,106,1722,1018,91,1550,836,67,1422,1055,94,1630,1044,43,1468,1164,47,1702,1093,65,1497,927,50,1383,1046,272,1196,-525,110,1073,-827,79,1382,1066,65,1424,1176,55,1337,1061,67,1323,1089,65,1328,1086,203,1005,-244,92,990,650,112,918,-416,82,949,467,112,1847,1058,73,1949,1123,70,1938,1127,137,642,50,113,619,0,123,667,106,262,353,3,255,378,77,239,345,-19,41,617,2,55,667,110,159,375,84,168,344,-11,93,957,-311,147,360,40,59,1835,1043,84,1819,1024,90,1816,1007,63,1850,1030,46,1555,1133,82,1824,966,44,1258,-854,88,1365,1130,74,1345,1126,204,1075,400,23,1363,-825,33,1335,-833,35,1316,-997,66,1255,-980,46,1290,-1086,84,1199,-1090,38,1163,-1390,70,1118,-1434,89,1403,1137,68,1389,1135,107,1717,1073,70,1838,1036,100,1883,1078,112,1894,1071,82,1830,979,66,938,598,26,642,58,67,1554,300,80,1208,712,56,1357,1164,53,1323,1154,54,1303,1098,47,1380,1067,48,1311,1093,37,1312,1064,60,1902,1078,88,1876,1055,117,1846,1045,97,1875,988,63,1911,1070,329,1035,-156,273,1292,-321,217,1095,-715,281,774,-336,295,808,-391,253,831,-446,171,842,-476,138,772,-402,180,761,-319,242,448,7,161,446,0,155,425,-34,174,424,-63,228,425,-60,244,425,-35,84,1787,810,43,1858,724,245,601,-462,244,635,-449,181,715,526,186,692,557,176,672,588,228,573,-481,157,644,471,149,620,480,148,670,462,233,487,-96,235,515,-96,235,460,-101,170,622,-428,81,677,586,181,561,-502,82,621,484,80,726,516,80,688,460,159,508,-99,179,455,-102,66,694,558,75,643,477,160,596,-448,162,482,-107,116,515,186,65,517,189,51,540,187,65,565,179,116,562,176,133,540,181,73,1447,1115,168,953,-294,75,957,-498,31,1633,1117,53,1680,1098,111,1692,1001,91,1532,992,50,940,-496,102,928,-328,94,1449,124,102,1440,56,148,846,-168,180,799,139,73,1332,689,198,1313,613,-279,1122,248,-231,1298,35,-276,1237,-133,-252,1160,-220,-299,895,71,-145,1367,231,-248,1252,521,-144,1457,-316,-202,1471,-508,-280,916,-378,-171,1390,553,-138,1346,-795,-217,889,-158,-258,1125,491,-208,1246,388,-266,1032,638,-232,1182,650,-228,1072,712,-127,1648,645,-80,1734,507,-109,1639,832,-107,1090,723,-145,954,-679,-235,892,-468,-257,974,578,-131,1719,904,-50,1863,1011,-114,1748,939,-27,1837,1050,-132,1623,850,-98,1718,1037,-108,1546,854,-40,1420,1064,-77,1626,1060,0,1467,1168,-26,1701,1100,-64,1494,938,-23,1381,1053,-274,1161,-536,-103,1078,-844,-48,1380,1077,-17,1423,1183,-23,1335,1069,-30,1321,1098,-29,1326,1094,-195,948,-270,-98,1013,674,-79,886,-496,-88,919,496,-103,1850,1074,-59,1961,1118,-55,1951,1123,-178,242,901,-156,197,933,-162,292,866,-146,58,-399,-139,68,-321,-122,57,-423,-84,196,934,-94,295,865,-44,75,-315,-52,62,-415,-65,900,-385,-31,70,-361,-51,1834,1053,-79,1816,1039,-87,1813,1024,-58,1848,1040,-11,1554,1139,-87,1820,981,-43,1262,-857,-45,1362,1142,-31,1343,1136,-207,1051,412,-23,1363,-825,-33,1335,-833,-31,1315,-996,-62,1254,-979,-46,1287,-1082,-79,1194,-1084,-54,1161,-1387,-87,1113,-1428,-46,1400,1149,-25,1387,1144,-88,1713,1090,-64,1836,1048,-90,1889,1088,-103,1898,1081,-85,1826,995,-73,942,636,-67,246,899,-67,1554,300,-79,1204,724,-7,1356,1169,-5,1322,1159,-15,1301,1104,-16,1378,1073,-10,1310,1098,-4,1311,1068,-52,1909,1078,-82,1878,1064,-110,1847,1063,-100,1868,1000,-56,1916,1070,-309,908,-222,-286,1216,-317,-211,1090,-734,-227,707,-458,-246,750,-504,-207,791,-551,-128,819,-575,-86,739,-519,-126,702,-442,-136,152,-376,-55,160,-382,-47,147,-421,-66,150,-449,-120,145,-447,-136,137,-422,-121,1784,809,-82,1856,725,-168,548,-653,-169,563,-614,-205,762,820,-209,785,859,-198,809,893,-150,543,-686,-183,687,893,-175,694,917,-175,680,866,-133,211,-473,-136,233,-454,-132,191,-494,-94,545,-611,-103,805,886,-103,553,-708,-108,696,915,-104,752,803,-107,677,846,-60,237,-459,-76,192,-496,-88,783,855,-101,690,893,-83,541,-645,-62,221,-483,-152,393,1001,-101,394,1000,-86,392,976,-101,387,950,-152,386,953,-169,390,975,-36,1445,1125,-164,928,-307,-68,937,-518,-2,1632,1120,-29,1678,1105,-104,1688,1021,-80,1528,1007,-46,927,-509,-101,922,-331,-94,1449,124,-102,1440,56,-148,839,-168,-180,799,139,-73,1331,692,-196,1309,634,140,1258,670,160,1134,657,150,1050,696,133,663,601,122,603,486,91,497,194,81,611,-13,87,634,35,88,660,92,90,581,172,118,688,458,123,732,507,164,984,468,207,1081,466,-213,1028,474,-174,926,522,-148,747,793,-145,676,847,-127,382,934,-128,279,876,-129,228,911,-124,183,943,-126,399,1019,-147,698,934,-154,817,908,-157,1059,732,-163,1125,691,-139,1253,689,195,913,-432,209,845,-473,212,563,-501,209,443,-99,205,426,-70,206,350,0,196,363,43,204,387,112,203,454,26,198,529,-89,205,638,-442,237,757,-309,265,1036,-115,-160,874,-515,-166,817,-572,-134,551,-707,-105,175,-499,-97,150,-456,-90,61,-402,-80,67,-357,-89,75,-285,-97,158,-355,-101,243,-438,-130,564,-604,-182,689,-435,-245,907,-180,138,594,112,120,577,158,91,567,172,60,578,164,34,594,118,56,565,95,85,549,91,115,569,88,-95,297,968,-72,314,936,-97,364,944,-127,374,951,-157,360,946,-177,313,937,-155,292,966,-125,292,978,-44,1490,1107,-5,1512,1152,20,1512,1153,44,1513,1148,76,1493,1096,-32,1368,-888,-42,1318,-908,1,1304,-905,44,1318,-908,34,1368,-888,1,1380,-891,-82,1110,-1256,0,1099,-1248,78,1115,-1262,42,1200,-1270,-5,1240,-1260,-51,1197,-1266,258,641,-527,231,639,-571,227,640,-596,151,636,-586,157,626,-552,154,637,-485,214,645,-469,256,647,-485,-83,659,-732,-158,657,-743,-161,646,-718,-187,626,-671,-185,613,-625,-142,608,-608,-83,616,-626,-85,634,-701,90,1680,1063,104,1704,1046,105,1691,1019,95,1665,1032,-72,1677,1077,-90,1700,1064,-95,1687,1037,-82,1661,1048,108,1683,1044,-93,1679,1062] },
{ "name": "horse_A_012", "vertices": [0,1386,51,0,1398,128,0,1430,-262,0,1447,-527,0,1061,-874,0,1194,-884,0,1350,-799,0,836,-361,0,738,-196,0,693,116,-6,1682,514,-16,1487,862,-1,1027,738,0,975,-846,0,900,-744,-4,950,716,-4,844,471,-6,1788,1009,1,1738,1086,-11,1452,866,19,1359,1182,9,1596,1129,-2,1389,948,10,1273,1053,24,1300,1214,10,1238,1044,17,1193,1109,13,1278,1089,13,1205,1070,16,1202,1101,0,846,-563,15,1450,1160,22,1211,1169,0,1334,-826,0,1278,-858,1,1319,-1022,2,1214,-994,-1,1314,-1112,3,1163,-1108,-8,1116,-1475,-9,1019,-1568,22,1240,1185,0,1496,288,0,1117,736,-20,1804,757,0,877,-654,12,1522,1145,0,1220,714,-4,876,602,279,1051,231,231,1232,30,276,1196,-145,250,1201,-240,299,826,52,145,1299,227,250,1177,486,142,1399,-329,200,1417,-519,292,915,-317,173,1314,547,137,1299,-807,217,851,-169,256,1059,457,210,1172,353,256,955,592,232,1109,614,221,992,670,103,1571,683,65,1661,546,74,1554,863,104,1017,692,153,901,-682,248,860,-399,247,912,523,113,1632,913,47,1765,1042,102,1658,953,33,1735,1083,108,1539,853,104,1621,1049,89,1461,857,64,1319,1067,92,1528,1069,41,1358,1179,45,1597,1123,63,1402,943,47,1281,1056,274,1126,-541,105,1027,-844,76,1279,1075,63,1314,1187,52,1234,1068,64,1219,1095,62,1223,1092,199,947,-263,93,930,644,92,837,-424,83,858,460,110,1744,1096,71,1843,1166,68,1832,1169,130,610,210,107,584,161,118,638,264,216,140,21,207,166,95,193,131,-1,34,583,164,50,638,270,111,164,99,122,131,4,78,886,-316,100,148,56,57,1733,1081,82,1718,1061,88,1716,1044,61,1748,1069,44,1448,1153,79,1726,1003,43,1215,-864,85,1258,1138,71,1238,1133,204,988,383,23,1319,-831,33,1292,-840,35,1287,-1011,66,1226,-996,46,1274,-1114,84,1183,-1119,40,1122,-1414,73,1067,-1448,86,1295,1147,65,1281,1145,105,1612,1103,68,1736,1074,99,1779,1118,110,1790,1111,80,1731,1017,67,865,599,20,611,219,67,1484,306,80,1126,710,54,1248,1171,51,1214,1160,51,1198,1102,44,1276,1076,45,1206,1097,34,1209,1069,58,1798,1119,87,1773,1095,115,1744,1083,95,1776,1028,62,1807,1111,320,967,-162,283,1226,-344,213,1037,-732,249,689,-301,266,711,-361,225,728,-420,145,740,-452,107,687,-368,148,687,-284,196,235,23,115,233,15,109,212,-19,128,210,-47,183,211,-44,198,211,-18,84,1700,844,42,1775,763,201,473,-408,199,504,-384,183,644,697,188,631,724,179,621,750,184,450,-434,158,590,645,151,565,651,149,617,639,188,272,-82,190,300,-76,191,246,-92,126,484,-370,83,624,750,137,443,-458,83,566,656,82,650,690,81,636,640,114,294,-80,134,240,-94,68,633,727,76,589,652,117,463,-397,118,269,-94,112,491,349,61,492,352,47,516,352,61,542,347,112,539,344,129,517,346,70,1341,1128,166,891,-318,71,897,-520,28,1526,1142,51,1575,1126,109,1592,1030,89,1433,1011,48,882,-520,102,862,-355,94,1385,127,102,1374,58,148,783,-185,180,729,118,73,1251,689,198,1233,616,-278,1055,240,-231,1232,30,-275,1143,-144,-249,948,-298,-299,826,52,-143,1301,233,-245,1180,524,-143,1366,-303,-201,1401,-495,-286,796,-581,-169,1313,557,-137,1299,-799,-216,787,-199,-261,1048,485,-205,1178,390,-276,961,628,-233,1103,647,-236,998,698,-127,1568,674,-80,1660,540,-110,1552,860,-110,1007,714,-151,932,-779,-242,822,-678,-270,896,577,-133,1626,935,-52,1763,1051,-117,1652,972,-29,1734,1089,-134,1533,875,-100,1616,1067,-111,1456,875,-43,1317,1076,-80,1523,1085,-1,1357,1183,-28,1595,1130,-67,1399,955,-26,1279,1062,-274,1088,-570,-105,1067,-883,-51,1276,1086,-19,1312,1195,-26,1232,1075,-33,1216,1103,-31,1221,1100,-197,810,-378,-104,938,657,-86,828,-711,-95,838,489,-106,1750,1111,-63,1862,1152,-59,1853,1157,-173,307,1248,-150,311,1303,-159,305,1187,-115,14,-897,-110,15,-818,-92,18,-921,-78,316,1303,-90,309,1183,-16,28,-810,-22,28,-911,-71,780,-601,-2,30,-856,-53,1731,1090,-81,1715,1076,-89,1711,1061,-61,1745,1079,-14,1446,1159,-89,1722,1018,-43,1231,-866,-47,1254,1150,-33,1235,1142,-210,972,403,-23,1319,-831,-33,1292,-840,-31,1286,-1010,-62,1225,-994,-46,1271,-1111,-79,1178,-1113,-52,1119,-1411,-85,1062,-1443,-48,1292,1159,-28,1279,1153,-90,1607,1121,-66,1733,1086,-93,1789,1123,-106,1798,1116,-87,1726,1033,-79,867,626,-63,313,1242,-67,1484,306,-79,1121,722,-10,1246,1177,-8,1213,1165,-17,1196,1109,-19,1275,1082,-13,1205,1102,-7,1208,1073,-55,1809,1114,-84,1778,1100,-113,1747,1100,-102,1766,1036,-59,1816,1105,-313,714,-437,-283,1046,-353,-212,1069,-780,-240,630,-735,-258,688,-760,-218,743,-788,-138,776,-800,-98,679,-782,-138,617,-724,-113,105,-863,-33,120,-867,-24,113,-906,-43,117,-935,-96,108,-934,-112,96,-911,-122,1697,843,-83,1773,764,-179,554,-980,-180,552,-939,-227,729,865,-229,764,895,-218,798,920,-161,564,-1012,-201,684,962,-193,700,982,-193,667,941,-114,177,-954,-119,190,-928,-113,164,-980,-103,539,-944,-123,791,912,-115,586,-1029,-126,703,978,-127,712,849,-126,658,922,-44,201,-931,-56,170,-982,-109,759,890,-119,690,959,-93,551,-976,-44,195,-959,-156,463,1181,-105,465,1178,-90,451,1157,-105,436,1134,-156,435,1139,-173,446,1159,-39,1338,1138,-164,830,-374,-69,856,-598,-4,1525,1145,-31,1572,1133,-107,1587,1050,-82,1429,1026,-47,851,-570,-102,846,-369,-94,1385,127,-102,1374,58,-148,763,-191,-180,729,118,-72,1250,692,-193,1231,636,140,1177,670,161,1053,656,150,980,693,135,617,762,123,548,656,87,472,355,74,576,148,81,602,196,82,630,252,86,558,341,119,636,637,125,653,682,165,873,469,207,977,442,-220,940,466,-186,841,523,-171,705,843,-163,656,924,-131,424,1123,-124,308,1203,-123,311,1265,-118,314,1320,-130,476,1194,-165,712,995,-174,810,931,-164,981,719,-166,1043,686,-137,1171,688,175,823,-440,184,741,-449,169,445,-456,165,227,-91,159,212,-54,160,137,16,148,151,59,155,176,128,156,241,42,153,312,-66,160,507,-375,205,680,-273,255,978,-120,-169,830,-733,-176,774,-798,-147,581,-1028,-84,151,-990,-74,116,-942,-60,22,-899,-50,24,-854,-61,22,-781,-75,112,-841,-84,196,-909,-141,552,-929,-195,604,-722,-249,691,-400,133,566,274,115,550,321,87,543,336,56,551,328,29,565,281,51,536,260,80,520,256,110,540,251,-95,395,1236,-72,380,1204,-99,412,1166,-130,417,1158,-158,408,1172,-176,375,1207,-154,389,1240,-124,402,1245,-47,1385,1123,-7,1404,1170,17,1403,1170,42,1405,1165,74,1388,1112,-32,1330,-894,-42,1280,-916,0,1266,-914,44,1281,-917,34,1330,-895,1,1342,-897,-81,1093,-1278,0,1082,-1268,79,1097,-1284,43,1184,-1300,-5,1227,-1294,-51,1182,-1297,215,529,-464,188,525,-513,185,524,-540,109,525,-530,113,516,-491,110,533,-418,169,538,-399,212,537,-417,-100,691,-1008,-175,693,-1018,-178,672,-999,-204,636,-964,-202,605,-926,-159,594,-913,-100,609,-928,-102,655,-989,88,1576,1091,102,1602,1076,103,1590,1047,93,1563,1059,-74,1572,1105,-92,1597,1094,-97,1585,1066,-84,1558,1075,106,1581,1072,-96,1576,1090] },
{ "name": "horse_A_013", "vertices": [0,1349,53,0,1361,129,0,1375,-264,0,1413,-526,0,1059,-906,0,1192,-904,0,1340,-805,0,791,-412,0,709,-224,0,655,78,-6,1630,545,-15,1412,881,-1,963,730,0,971,-885,0,887,-789,-5,896,690,-4,789,456,-6,1706,1043,1,1652,1117,-10,1376,886,21,1270,1198,9,1509,1154,-1,1310,965,11,1189,1066,25,1210,1227,11,1155,1055,19,1108,1118,14,1193,1101,15,1121,1080,18,1117,1111,0,817,-612,16,1362,1179,24,1123,1179,0,1326,-834,0,1273,-870,1,1334,-1036,1,1227,-1018,-1,1349,-1139,2,1198,-1150,-5,1147,-1509,-4,1022,-1570,24,1151,1196,0,1454,293,0,1058,728,-20,1735,794,0,856,-701,13,1434,1167,0,1163,709,-4,819,586,278,1004,217,230,1194,21,276,1148,-151,252,1085,-248,298,790,20,145,1256,225,250,1113,485,144,1344,-326,201,1381,-513,283,841,-401,172,1261,545,137,1291,-813,216,802,-199,256,973,449,209,1109,353,257,887,596,232,1040,607,222,935,663,103,1508,706,65,1607,575,74,1479,885,104,955,682,149,902,-746,238,814,-492,248,821,549,113,1554,940,47,1682,1074,102,1578,980,33,1650,1114,108,1464,876,104,1538,1075,89,1385,877,66,1235,1081,93,1444,1092,42,1270,1195,46,1510,1148,64,1323,961,49,1197,1068,274,1088,-566,103,1028,-885,78,1194,1088,65,1225,1201,54,1150,1079,66,1134,1105,64,1138,1102,196,857,-319,93,883,627,82,806,-520,83,781,465,110,1656,1128,71,1749,1205,68,1738,1208,149,437,458,127,390,428,133,486,493,137,29,-314,125,50,-238,115,24,-339,55,387,430,65,486,497,29,55,-240,44,29,-336,68,822,-407,20,44,-285,57,1648,1112,82,1634,1091,88,1633,1074,61,1663,1100,45,1360,1173,79,1644,1033,43,1214,-882,87,1171,1149,73,1151,1144,204,907,371,23,1311,-840,33,1285,-851,34,1301,-1029,66,1239,-1018,46,1309,-1145,84,1219,-1158,41,1160,-1448,75,1100,-1477,88,1208,1160,67,1194,1158,105,1527,1129,68,1651,1105,98,1690,1153,110,1701,1147,80,1649,1048,67,813,599,38,437,465,67,1442,310,80,1068,704,56,1160,1182,53,1127,1169,53,1112,1112,46,1192,1089,47,1121,1107,36,1125,1079,58,1709,1155,86,1686,1129,115,1657,1115,95,1694,1062,62,1718,1148,311,838,-243,286,1139,-345,211,1028,-772,232,628,-472,251,670,-520,211,708,-568,131,734,-593,90,656,-534,131,623,-456,124,125,-305,44,130,-318,39,112,-354,60,111,-381,114,108,-375,128,104,-349,84,1626,875,42,1705,798,173,468,-646,171,489,-613,184,701,866,189,705,893,180,710,918,156,456,-679,162,631,847,156,612,864,154,650,828,127,170,-409,129,195,-394,128,147,-425,96,471,-610,85,710,916,111,461,-706,88,613,867,83,699,856,85,665,818,54,196,-404,72,146,-432,69,705,894,81,630,852,87,461,-643,57,177,-425,129,396,638,78,397,640,63,417,628,77,437,611,128,435,610,145,418,623,72,1254,1143,164,825,-372,69,859,-576,29,1439,1164,51,1488,1150,109,1510,1055,89,1351,1030,47,845,-574,101,813,-406,94,1348,128,102,1336,59,148,750,-213,179,691,81,73,1196,686,197,1175,613,-277,1014,225,-230,1194,21,-274,1103,-164,-242,887,-398,-298,790,20,-143,1260,232,-245,1125,521,-143,1307,-310,-201,1362,-498,-276,786,-728,-169,1261,556,-138,1291,-814,-213,747,-246,-261,995,474,-204,1131,387,-277,897,610,-233,1041,639,-237,930,683,-126,1506,697,-80,1606,570,-109,1477,882,-110,942,702,-151,952,-865,-234,837,-821,-271,837,555,-133,1546,962,-52,1679,1083,-116,1571,1000,-29,1648,1120,-134,1456,898,-99,1531,1094,-111,1379,895,-41,1232,1091,-79,1438,1107,0,1268,1198,-27,1508,1155,-66,1319,973,-24,1195,1075,-273,1066,-622,-105,1085,-917,-49,1191,1099,-18,1223,1209,-24,1148,1086,-31,1130,1114,-30,1136,1110,-190,771,-472,-105,875,641,-79,856,-854,-95,786,468,-106,1666,1142,-65,1778,1182,-60,1769,1187,-167,286,1279,-146,314,1328,-151,259,1225,-100,21,-1178,-96,6,-1101,-77,29,-1201,-73,320,1326,-83,264,1220,-1,17,-1090,-7,37,-1189,-61,783,-752,11,28,-1135,-53,1646,1121,-81,1630,1107,-89,1627,1091,-60,1660,1110,-12,1358,1178,-89,1639,1049,-44,1233,-880,-46,1167,1161,-32,1148,1153,-209,924,384,-23,1311,-840,-33,1285,-851,-32,1301,-1028,-62,1238,-1017,-46,1306,-1142,-80,1214,-1153,-50,1157,-1446,-82,1096,-1472,-47,1204,1172,-26,1191,1166,-90,1521,1147,-66,1648,1117,-94,1705,1154,-107,1714,1146,-87,1642,1064,-80,806,607,-57,293,1272,-67,1442,310,-79,1062,714,-8,1158,1188,-6,1125,1175,-16,1110,1118,-17,1190,1095,-11,1120,1112,-5,1124,1083,-55,1725,1145,-85,1694,1131,-113,1662,1130,-102,1681,1067,-60,1732,1136,-299,680,-591,-279,986,-426,-213,1080,-823,-224,625,-888,-244,684,-910,-206,741,-935,-127,778,-946,-84,682,-932,-122,615,-878,-98,103,-1126,-18,119,-1127,-9,120,-1167,-28,130,-1194,-82,120,-1195,-97,104,-1175,-121,1623,875,-83,1703,799,-164,566,-1150,-165,555,-1108,-231,643,827,-233,677,858,-222,711,884,-146,583,-1180,-203,600,928,-196,617,946,-196,581,907,-99,192,-1201,-104,200,-1173,-98,185,-1229,-88,545,-1117,-127,704,875,-100,608,-1191,-128,621,941,-131,626,811,-128,573,889,-29,211,-1174,-41,191,-1229,-113,673,852,-122,606,923,-78,563,-1146,-30,211,-1202,-153,394,1159,-102,397,1155,-87,381,1136,-102,363,1113,-153,362,1119,-169,374,1139,-37,1251,1153,-161,789,-443,-66,838,-677,-3,1438,1167,-31,1485,1158,-106,1503,1075,-81,1346,1045,-45,827,-638,-101,802,-424,-94,1348,128,-102,1336,59,-147,729,-227,-179,691,81,-72,1194,689,-193,1174,634,140,1117,664,161,987,651,151,925,685,137,711,930,128,598,877,105,382,653,95,375,419,100,421,450,99,472,485,101,449,598,123,665,816,126,699,849,166,775,498,208,870,438,-220,890,449,-187,786,499,-174,619,804,-165,570,891,-128,351,1103,-117,270,1238,-118,298,1293,-114,324,1342,-127,408,1171,-168,630,958,-177,723,894,-165,912,704,-166,979,676,-137,1112,684,164,794,-539,170,733,-590,142,460,-702,101,130,-430,92,111,-386,81,31,-321,68,43,-278,72,61,-207,84,133,-288,93,207,-382,131,491,-606,187,611,-448,247,837,-201,-162,859,-876,-166,774,-944,-132,603,-1192,-69,174,-1241,-59,130,-1201,-45,30,-1179,-36,21,-1134,-47,5,-1063,-60,105,-1103,-69,202,-1153,-126,553,-1098,-178,600,-876,-233,653,-556,150,428,537,132,435,585,103,434,601,72,438,590,46,427,541,69,391,537,99,374,540,129,393,529,-91,363,1233,-67,338,1209,-95,350,1162,-126,348,1150,-154,347,1168,-171,331,1214,-150,358,1238,-121,373,1240,-46,1298,1140,-6,1315,1187,18,1315,1188,43,1317,1183,75,1302,1129,-32,1330,-904,-42,1283,-930,0,1269,-929,43,1283,-930,34,1330,-904,0,1343,-905,-81,1144,-1319,0,1133,-1308,79,1148,-1323,43,1236,-1341,-4,1280,-1335,-51,1234,-1338,193,539,-681,168,554,-728,166,564,-753,90,565,-745,92,543,-712,88,532,-638,147,527,-619,190,531,-635,-86,706,-1156,-162,708,-1166,-164,685,-1149,-189,643,-1117,-186,608,-1082,-143,596,-1069,-83,615,-1082,-88,667,-1140,88,1491,1115,102,1517,1102,103,1507,1073,93,1479,1083,-73,1486,1130,-91,1511,1119,-97,1501,1091,-84,1473,1099,107,1497,1097,-95,1490,1115] },
{ "name": "horse_A_014", "vertices": [0,1338,54,0,1352,127,0,1342,-270,0,1401,-529,0,1080,-939,0,1210,-924,0,1349,-814,0,772,-463,0,710,-246,0,653,41,-6,1607,567,-14,1369,893,-1,942,722,0,989,-925,0,896,-832,-4,865,691,-3,753,465,-6,1660,1063,2,1606,1136,-8,1333,902,23,1222,1212,11,1461,1172,0,1265,980,14,1143,1079,28,1162,1240,14,1109,1068,22,1061,1130,17,1146,1114,18,1075,1092,21,1070,1123,0,813,-661,18,1314,1194,27,1075,1191,0,1337,-844,0,1287,-884,0,1366,-1050,1,1259,-1041,0,1403,-1161,2,1254,-1189,-3,1219,-1543,-1,1079,-1587,28,1103,1208,0,1440,294,0,1034,716,-20,1696,820,0,859,-746,14,1387,1184,0,1139,703,-3,790,593,277,964,207,229,1184,13,274,1117,-164,247,957,-333,293,786,-11,145,1228,217,250,1046,475,143,1303,-327,201,1362,-512,280,787,-588,172,1231,530,137,1301,-825,212,770,-242,257,897,487,210,1017,350,258,848,685,232,1001,614,222,917,727,104,1476,721,65,1582,596,75,1437,899,104,939,697,149,940,-852,236,802,-685,249,774,649,114,1510,958,47,1636,1094,102,1534,999,33,1604,1133,109,1421,893,105,1492,1093,91,1342,892,68,1190,1094,94,1398,1108,45,1222,1208,47,1463,1166,65,1279,976,51,1151,1081,274,1074,-621,104,1068,-939,80,1149,1100,67,1178,1214,57,1104,1091,69,1087,1117,67,1092,1114,193,783,-432,93,855,674,80,807,-718,84,739,514,110,1606,1148,71,1692,1233,68,1681,1235,171,282,808,151,225,809,154,342,807,82,12,-770,71,22,-693,61,13,-796,79,222,810,86,342,808,-22,37,-693,-9,25,-793,65,774,-606,-32,34,-740,57,1601,1131,83,1588,1110,88,1587,1093,62,1617,1120,47,1313,1188,80,1599,1053,43,1238,-902,90,1124,1162,76,1105,1156,204,844,395,23,1323,-851,33,1297,-864,34,1333,-1045,65,1271,-1041,46,1363,-1171,83,1275,-1195,43,1232,-1482,77,1172,-1509,90,1161,1173,70,1147,1170,106,1480,1146,69,1604,1124,99,1637,1176,110,1649,1170,81,1605,1067,68,786,644,61,282,809,67,1428,311,79,1045,690,59,1112,1195,56,1080,1181,56,1066,1123,48,1146,1102,50,1075,1119,39,1079,1091,59,1656,1179,87,1635,1151,116,1608,1135,96,1649,1086,62,1666,1173,306,720,-441,282,1046,-398,212,1058,-833,229,613,-732,249,670,-761,210,724,-792,130,758,-806,88,663,-781,128,604,-720,79,106,-747,0,121,-759,-5,110,-798,15,111,-825,68,101,-818,81,92,-793,85,1583,896,42,1666,822,165,526,-954,165,534,-915,185,739,990,190,757,1018,180,775,1043,150,528,-988,166,664,1019,158,658,1043,158,669,992,89,167,-844,92,185,-821,89,149,-867,87,521,-920,85,772,1038,106,546,-1012,91,658,1043,84,730,978,90,674,974,18,196,-832,33,155,-874,69,755,1016,84,664,1021,79,525,-954,20,184,-858,144,352,976,93,352,976,78,361,954,92,369,929,143,368,931,160,362,952,74,1208,1157,163,782,-452,68,840,-664,31,1392,1181,53,1441,1167,111,1465,1073,91,1306,1045,46,828,-648,101,787,-463,94,1339,126,102,1325,60,146,740,-241,176,688,45,73,1172,676,197,1144,592,-276,995,206,-229,1184,13,-271,1098,-185,-237,908,-504,-293,786,-11,-144,1245,226,-246,1088,508,-142,1277,-328,-202,1350,-510,-268,835,-858,-170,1238,549,-139,1306,-833,-208,748,-289,-260,956,466,-205,1093,374,-274,846,608,-233,1002,630,-235,882,683,-126,1474,713,-80,1581,591,-108,1434,896,-109,907,694,-152,1006,-954,-230,899,-948,-267,792,547,-132,1501,981,-52,1632,1103,-116,1526,1019,-28,1601,1139,-133,1412,915,-98,1484,1112,-109,1335,911,-39,1186,1104,-77,1391,1124,2,1220,1212,-26,1460,1172,-64,1274,988,-22,1148,1088,-274,1083,-681,-108,1122,-946,-46,1144,1112,-15,1175,1222,-21,1101,1098,-28,1084,1126,-26,1089,1122,-185,787,-553,-103,832,638,-76,928,-981,-93,756,456,-105,1617,1162,-64,1728,1207,-60,1719,1212,-155,183,1208,-135,216,1254,-138,150,1157,-102,31,-1377,-97,4,-1303,-78,41,-1398,-63,225,1252,-70,156,1153,-2,11,-1291,-8,45,-1386,-54,844,-884,10,28,-1334,-53,1599,1141,-81,1583,1126,-89,1580,1110,-60,1613,1130,-10,1310,1193,-89,1593,1068,-45,1252,-895,-43,1119,1174,-28,1101,1166,-207,895,367,-23,1323,-851,-33,1297,-864,-32,1332,-1045,-63,1270,-1040,-46,1361,-1169,-80,1271,-1192,-49,1230,-1480,-81,1169,-1506,-44,1156,1185,-23,1144,1179,-88,1473,1164,-66,1601,1136,-93,1656,1176,-106,1665,1169,-87,1596,1083,-78,768,597,-45,192,1201,-67,1428,311,-79,1036,704,-5,1110,1201,-2,1077,1187,-12,1063,1130,-14,1144,1107,-8,1073,1124,-2,1077,1095,-55,1676,1167,-84,1646,1152,-112,1614,1151,-101,1636,1088,-59,1684,1158,-287,725,-718,-276,992,-513,-216,1114,-864,-207,650,-995,-229,705,-1025,-193,760,-1057,-116,798,-1072,-69,706,-1045,-105,646,-983,-97,104,-1313,-16,117,-1313,-7,124,-1353,-26,138,-1378,-80,130,-1379,-96,112,-1362,-121,1580,896,-83,1664,823,-148,568,-1270,-149,550,-1227,-226,568,793,-229,597,828,-218,627,859,-130,587,-1297,-198,510,886,-190,524,906,-190,495,862,-95,203,-1375,-100,206,-1346,-94,200,-1404,-73,539,-1241,-123,623,849,-84,612,-1306,-123,530,901,-126,555,774,-123,491,841,-24,215,-1346,-38,204,-1404,-109,595,822,-116,518,881,-62,561,-1268,-25,219,-1374,-142,271,1080,-91,275,1076,-77,262,1054,-92,248,1029,-142,245,1035,-158,254,1057,-35,1203,1167,-159,787,-505,-64,857,-751,-2,1390,1184,-29,1438,1175,-105,1456,1093,-79,1300,1060,-44,837,-702,-100,787,-478,-94,1339,126,-102,1325,60,-144,728,-258,-176,688,45,-72,1170,682,-194,1146,623,140,1091,645,161,963,665,151,915,738,136,781,1054,131,653,1061,119,348,995,120,207,810,122,262,809,120,324,807,117,373,912,127,674,973,128,727,971,167,726,585,209,806,499,-218,858,442,-183,750,487,-170,548,767,-160,487,844,-117,237,1017,-104,163,1170,-107,198,1221,-104,229,1267,-116,283,1093,-162,536,920,-174,638,871,-163,867,702,-165,942,667,-138,1083,673,163,804,-739,169,755,-804,137,542,-1009,60,135,-876,47,108,-829,27,20,-778,15,27,-733,20,33,-660,40,115,-729,56,196,-807,125,536,-908,184,589,-717,241,703,-402,-159,930,-1002,-154,793,-1070,-115,609,-1306,-66,190,-1417,-57,140,-1384,-46,37,-1377,-37,22,-1334,-48,-3,-1265,-59,102,-1291,-65,205,-1326,-109,545,-1216,-161,628,-980,-221,701,-683,169,320,877,148,353,911,119,361,923,89,356,911,65,318,877,89,287,895,119,274,906,148,286,889,-81,255,1154,-56,229,1134,-84,235,1085,-114,230,1071,-143,231,1091,-160,219,1139,-140,250,1159,-111,264,1163,-43,1251,1155,-4,1267,1202,21,1267,1203,46,1269,1197,77,1255,1144,-32,1349,-915,-42,1304,-944,0,1290,-944,43,1304,-945,34,1349,-915,0,1362,-915,-80,1219,-1359,0,1207,-1349,80,1223,-1362,44,1312,-1376,-3,1356,-1369,-50,1310,-1374,193,607,-959,169,639,-998,167,657,-1018,91,657,-1011,92,624,-988,87,587,-924,146,574,-907,189,582,-919,-69,703,-1267,-145,703,-1278,-147,681,-1259,-171,640,-1224,-167,605,-1187,-123,593,-1174,-64,612,-1187,-70,665,-1249,90,1445,1132,104,1471,1119,104,1462,1090,95,1433,1100,-72,1439,1147,-90,1464,1137,-95,1454,1108,-82,1427,1116,108,1451,1114,-94,1443,1133] },
{ "name": "horse_A_015", "vertices": [0,1342,54,0,1360,122,0,1335,-283,0,1400,-541,0,1089,-958,0,1218,-940,0,1354,-827,0,770,-488,0,724,-253,0,672,21,-6,1616,564,-12,1380,896,0,931,709,0,997,-946,0,901,-854,-2,856,657,-1,768,436,-5,1681,1052,3,1631,1128,-7,1345,910,26,1253,1227,12,1489,1172,3,1282,993,17,1167,1099,31,1195,1259,17,1131,1090,25,1087,1154,20,1171,1134,21,1099,1116,24,1096,1147,0,815,-685,21,1344,1204,30,1105,1215,0,1342,-857,0,1294,-898,0,1381,-1067,1,1275,-1062,0,1432,-1183,1,1286,-1222,-3,1276,-1578,-2,1141,-1635,31,1134,1230,0,1448,289,0,1034,712,-19,1705,812,0,863,-769,17,1416,1189,0,1145,698,-1,792,565,274,976,194,227,1189,9,271,1124,-172,246,966,-379,285,802,-26,145,1238,212,250,1052,471,144,1300,-345,201,1362,-529,277,801,-641,172,1238,527,138,1307,-841,209,785,-256,256,895,470,210,1030,343,258,833,655,232,994,605,222,899,701,105,1486,718,65,1591,593,77,1448,897,104,929,685,147,959,-891,233,818,-738,249,761,623,115,1526,956,48,1659,1084,104,1552,995,35,1629,1126,111,1433,896,107,1516,1092,93,1354,900,71,1214,1111,96,1422,1113,47,1253,1223,49,1491,1166,68,1296,987,54,1175,1101,273,1084,-662,104,1079,-965,83,1173,1120,70,1209,1232,60,1128,1113,72,1113,1140,70,1118,1137,192,787,-469,93,847,649,78,825,-770,83,737,496,111,1629,1140,72,1713,1226,68,1703,1228,172,232,1064,151,189,1101,156,278,1025,82,1,-1010,72,-7,-932,60,7,-1034,79,186,1101,87,278,1024,-21,6,-928,-9,18,-1028,62,790,-659,-32,14,-974,58,1626,1123,84,1612,1103,89,1610,1086,63,1641,1112,50,1342,1197,81,1620,1045,43,1246,-920,93,1153,1182,79,1133,1178,202,847,375,23,1329,-864,33,1304,-878,34,1348,-1063,65,1286,-1061,46,1393,-1196,83,1307,-1226,43,1284,-1515,76,1226,-1547,93,1190,1191,73,1176,1190,108,1507,1146,70,1629,1116,99,1659,1168,111,1671,1163,82,1627,1059,68,782,624,61,232,1062,67,1435,306,79,1048,686,62,1143,1216,59,1109,1205,59,1092,1148,51,1171,1121,53,1101,1142,42,1103,1114,60,1679,1172,88,1658,1144,116,1630,1128,97,1672,1079,63,1689,1166,302,733,-495,282,1054,-441,211,1068,-864,225,631,-787,244,687,-815,206,742,-846,127,777,-860,84,682,-836,123,622,-776,79,86,-965,0,104,-972,-5,102,-1013,15,109,-1039,68,98,-1036,81,84,-1014,86,1595,892,43,1676,815,161,544,-1038,160,539,-995,185,737,960,189,768,986,178,797,1008,146,557,-1070,165,680,1031,156,687,1055,157,671,1004,88,168,-1046,91,179,-1019,87,158,-1073,84,529,-1007,83,792,1001,102,582,-1087,89,687,1052,84,724,948,90,665,984,16,192,-1025,31,166,-1078,69,765,982,82,680,1030,75,543,-1038,19,189,-1054,141,389,1150,90,388,1148,76,385,1124,91,379,1098,142,380,1102,158,385,1125,77,1235,1173,162,783,-482,67,847,-697,33,1421,1185,55,1469,1169,112,1487,1073,94,1327,1055,45,833,-677,101,786,-489,94,1346,121,102,1329,60,143,755,-250,171,706,27,73,1177,672,197,1147,591,-273,1019,200,-227,1189,9,-269,1104,-197,-239,937,-577,-285,802,-26,-144,1259,230,-247,1099,517,-142,1268,-347,-201,1348,-525,-274,904,-941,-171,1241,555,-139,1314,-849,-205,765,-313,-256,984,436,-205,1131,389,-265,856,520,-232,991,609,-228,868,604,-125,1484,711,-79,1590,588,-107,1446,895,-107,892,656,-155,1054,-995,-235,976,-1023,-256,812,459,-131,1517,980,-51,1655,1094,-114,1544,1016,-27,1627,1132,-131,1424,920,-97,1508,1111,-107,1347,919,-36,1210,1121,-75,1416,1129,5,1251,1227,-24,1488,1173,-62,1291,1000,-19,1172,1108,-275,1108,-718,-108,1146,-961,-43,1169,1132,-12,1206,1240,-18,1126,1121,-25,1109,1149,-23,1115,1145,-188,813,-606,-97,839,578,-82,1007,-1053,-87,781,407,-103,1640,1155,-61,1751,1200,-57,1742,1205,-120,83,936,-101,108,987,-103,62,879,-139,202,-1684,-132,127,-1660,-116,225,-1691,-29,119,986,-35,71,876,-36,124,-1654,-46,220,-1685,-60,914,-967,-24,168,-1668,-51,1624,1134,-79,1607,1119,-87,1604,1104,-59,1638,1122,-8,1340,1203,-87,1614,1061,-45,1262,-907,-40,1148,1195,-25,1129,1188,-202,928,337,-23,1329,-864,-33,1304,-878,-32,1348,-1063,-63,1285,-1060,-46,1392,-1195,-81,1304,-1224,-49,1282,-1514,-81,1224,-1545,-41,1185,1204,-20,1173,1199,-87,1500,1165,-64,1626,1129,-91,1679,1169,-104,1688,1162,-86,1619,1076,-72,780,542,-11,98,930,-67,1435,306,-79,1031,699,-2,1140,1222,0,1107,1210,-9,1089,1154,-12,1168,1127,-4,1099,1148,0,1101,1118,-53,1700,1160,-82,1669,1145,-110,1637,1144,-100,1660,1081,-58,1707,1152,-293,786,-808,-277,1011,-573,-217,1143,-886,-214,713,-1077,-236,768,-1108,-199,823,-1140,-122,860,-1155,-75,768,-1128,-112,709,-1065,-127,197,-1588,-47,206,-1583,-40,242,-1603,-59,270,-1606,-113,266,-1609,-129,240,-1611,-119,1592,892,-82,1673,817,-159,638,-1368,-159,611,-1327,-207,565,672,-210,584,713,-200,605,749,-140,663,-1390,-176,484,739,-168,489,763,-169,479,711,-125,302,-1548,-129,297,-1520,-125,310,-1574,-85,601,-1347,-105,607,740,-93,687,-1395,-101,498,759,-107,561,652,-102,484,689,-53,302,-1520,-68,314,-1575,-91,588,707,-95,495,736,-73,628,-1369,-54,315,-1545,-110,192,827,-60,199,824,-46,194,799,-61,190,770,-112,184,776,-127,183,800,-32,1231,1183,-160,797,-542,-66,880,-794,0,1419,1189,-27,1466,1177,-103,1479,1094,-77,1321,1071,-45,851,-738,-100,788,-506,-94,1346,121,-102,1329,60,-142,743,-272,-171,706,27,-73,1174,679,-196,1141,631,140,1091,643,161,954,655,151,897,715,134,808,1017,128,691,1072,115,395,1168,120,175,1111,123,217,1076,121,264,1036,116,374,1083,127,665,985,128,717,941,166,717,564,209,797,480,-211,887,389,-173,776,412,-150,555,643,-139,479,691,-87,184,755,-69,74,894,-72,97,951,-70,119,1002,-85,198,843,-139,495,780,-156,614,764,-157,851,629,-163,928,635,-139,1073,673,160,821,-792,166,773,-858,133,577,-1085,59,147,-1086,46,108,-1044,27,10,-1015,15,6,-970,21,-4,-897,40,91,-945,55,185,-1002,121,539,-987,179,607,-773,237,715,-456,-165,1012,-1073,-160,855,-1153,-125,685,-1395,-97,310,-1590,-91,276,-1606,-83,207,-1683,-73,164,-1669,-81,94,-1647,-88,179,-1579,-93,288,-1504,-120,603,-1318,-168,692,-1062,-227,759,-775,168,305,1094,147,352,1098,117,366,1101,88,354,1095,64,303,1092,87,289,1126,117,284,1141,147,287,1124,-49,167,897,-24,147,872,-52,162,825,-82,158,809,-111,155,830,-127,133,875,-108,160,901,-80,173,911,-41,1278,1168,-1,1298,1214,23,1297,1215,48,1299,1209,80,1282,1156,-32,1359,-929,-42,1314,-960,0,1300,-960,43,1315,-960,34,1359,-929,0,1371,-929,-81,1262,-1395,0,1249,-1385,79,1265,-1397,44,1356,-1403,-3,1399,-1393,-49,1354,-1402,189,625,-1015,164,663,-1052,162,684,-1071,87,684,-1063,88,647,-1043,82,601,-979,141,584,-964,184,594,-977,-75,765,-1347,-150,767,-1357,-153,744,-1339,-177,701,-1306,-174,663,-1272,-130,649,-1259,-71,668,-1272,-76,725,-1330,92,1471,1134,105,1496,1119,106,1485,1090,97,1457,1102,-70,1465,1149,-88,1489,1138,-94,1478,1110,-80,1451,1119,110,1476,1115,-92,1468,1135] }
],
"morphColors": [
{ "name": "horse_colorMap", "colors": [0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.240,0.120,0.090,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.750,0.570,0.420,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.750,0.570,0.420,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.750,0.570,0.420,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.750,0.570,0.420,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.220,0.110,0.090,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.750,0.570,0.420,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.350,0.160,0.100,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.750,0.570,0.420,0.750,0.570,0.420,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.360,0.220,0.210,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.750,0.570,0.420,0.240,0.120,0.090,0.750,0.570,0.420,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.240,0.120,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.750,0.570,0.420,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.350,0.160,0.100,0.350,0.160,0.100,0.650,0.360,0.220,0.650,0.360,0.220,0.220,0.110,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.220,0.110,0.090,0.220,0.110,0.090,0.220,0.110,0.090,0.220,0.110,0.090,0.220,0.110,0.090,0.220,0.110,0.090,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220,0.650,0.360,0.220] }
],
"normals": [],
"colors": [],
"uvs": [[0.448620,0.529399,0.416272,0.497377,0.336939,0.484467,0.353083,0.543663,0.412052,0.590391,0.317679,0.592247,0.321725,0.532901,0.294803,0.573531,0.528703,0.493874,0.517961,0.541268,0.287719,0.460762,0.391785,0.432560,0.252392,0.457865,0.274426,0.519441,0.577758,0.555090,0.631081,0.525947,0.239532,0.460301,0.244234,0.517700,0.909079,0.311955,0.881905,0.307722,0.491907,0.578810,0.518764,0.585592,0.568992,0.627229,0.614655,0.631727,0.629909,0.617449,0.647716,0.593320,0.593608,0.442145,0.083679,0.217254,0.157074,0.275340,0.180338,0.200676,0.116178,0.150781,0.755107,0.105826,0.776456,0.108499,0.806134,0.116032,0.219545,0.564538,0.259562,0.564962,0.839270,0.313162,0.683083,0.562401,0.755016,0.212912,0.768605,0.214509,0.856595,0.448744,0.863080,0.449751,0.853753,0.377497,0.829794,0.379881,0.662924,0.653966,0.644562,0.675804,0.191061,0.095103,0.157435,0.061005,0.100212,0.080212,0.228324,0.102289,0.213134,0.073691,0.207633,0.042607,0.313178,0.136170,0.268864,0.129625,0.272717,0.160418,0.291926,0.160894,0.236716,0.203528,0.240792,0.158661,0.290159,0.095923,0.329056,0.128973,0.304291,0.086711,0.274767,0.204309,0.300841,0.190356,0.239891,0.079419,0.239277,0.076692,0.498842,0.449753,0.271535,0.420346,0.253660,0.423588,0.220900,0.438695,0.363919,0.604435,0.345705,0.664995,0.402715,0.653643,0.213601,0.325620,0.246160,0.266939,0.186881,0.508599,0.178806,0.556069,0.204865,0.549716,0.212216,0.508022,0.183835,0.580529,0.200311,0.568395,0.657784,0.689384,0.680358,0.664843,0.503354,0.671921,0.142700,0.023015,0.067275,0.040797,0.253846,0.038787,0.257187,0.013533,0.205939,0.006708,0.267961,0.247575,0.346092,0.119764,0.321232,0.078470,0.293134,0.227031,0.314633,0.207931,0.286943,0.062124,0.304841,0.050293,0.207747,0.484584,0.326770,0.143301,0.332008,0.148408,0.345432,0.150362,0.343181,0.136009,0.311369,0.166823,0.320043,0.180461,0.356980,0.152072,0.353631,0.132660,0.330518,0.192926,0.336440,0.153512,0.340285,0.157448,0.351643,0.163322,0.847264,0.062608,0.882816,0.054963,0.815980,0.306398,0.792789,0.308508,0.126016,0.372202,0.741446,0.213386,0.871790,0.450617,0.824355,0.377986,0.811315,0.377671,0.726031,0.111187,0.899376,0.196896,0.914374,0.196797,0.916020,0.063441,0.944843,0.073250,0.764570,0.307954,0.795555,0.377061,0.235306,0.085310,0.232653,0.076789,0.247165,0.105246,0.244592,0.084865,0.273795,0.082085,0.251799,0.077947,0.254435,0.068048,0.579812,0.681733,0.502411,0.691818,0.581707,0.696312,0.204052,0.601822,0.188050,0.611262,0.212543,0.656931,0.220374,0.636205,0.332590,0.163875,0.316360,0.167934,0.319999,0.168952,0.337409,0.171224,0.326506,0.182207,0.333347,0.184798,0.326082,0.173864,0.331226,0.169778,0.780124,0.214561,0.775712,0.238360,0.790837,0.238330,0.759075,0.237832,0.854267,0.471589,0.865949,0.474456,0.843297,0.447300,0.839248,0.469354,0.882496,0.195799,0.864834,0.194489,0.853265,0.223612,0.873834,0.229854,0.172056,0.399007,0.741083,0.239048,0.878960,0.471705,0.804374,0.449801,0.795275,0.448443,0.792550,0.473850,0.807206,0.475517,0.386821,0.415024,0.388824,0.697340,0.892459,0.227099,0.910105,0.224998,0.785683,0.448328,0.779285,0.471824,0.300359,0.617958,0.279467,0.658239,0.713677,0.303104,0.771809,0.447735,0.759398,0.469865,0.149334,0.714967,0.101030,0.715346,0.112709,0.741649,0.140764,0.741363,0.019361,0.683787,0.008075,0.715908,0.019397,0.739997,0.049952,0.739976,0.069902,0.721874,0.243698,0.078814,0.238276,0.079154,0.236435,0.075945,0.240871,0.074567,0.224019,0.122967,0.054063,0.446416,0.053310,0.442271,0.050633,0.437415,0.052359,0.452293,0.331553,0.156146,0.325437,0.154252,0.328037,0.160953,0.344872,0.168499,0.335807,0.160145,0.515975,0.630650,0.198455,0.463542,0.197107,0.473974,0.197428,0.459486,0.190080,0.489251,0.193914,0.479398,0.274903,0.692300,0.330594,0.688092,0.159409,0.469525,0.161350,0.460397,0.122364,0.459425,0.122678,0.463511,0.161571,0.454003,0.123048,0.453028,0.157336,0.478246,0.121809,0.471155,0.239701,0.075696,0.236803,0.067189,0.239474,0.074078,0.510421,0.408256,0.140199,0.685877,0.112139,0.685732,0.030193,0.102811,0.675476,0.616115,0.699849,0.632259,0.587899,0.403711,0.014499,0.055576,0.323645,0.174652,0.238975,0.076435,0.239347,0.075534,0.937149,0.318413,0.842241,0.090448,0.794728,0.069773,0.758361,0.005070,0.737921,0.053037,0.704185,0.081500,0.982352,0.053080,0.918260,0.033651,0.869065,0.008364,0.817747,0.015248,0.970268,0.279984,0.938952,0.264731,0.891325,0.272093,0.837155,0.291223,0.820828,0.283650,0.792036,0.285922,0.774985,0.287144,0.664395,0.283391,0.874761,0.380440,0.762675,0.376930,0.886450,0.386978,0.884339,0.493419,0.868847,0.496801,0.773430,0.494287,0.749914,0.492433,0.788595,0.494306,0.805248,0.496526,0.852193,0.493125,0.838839,0.488594,0.865297,0.268014,0.839696,0.259737,0.888877,0.265003,0.911201,0.260512,0.762025,0.266882,0.739847,0.267853,0.781403,0.268411,0.801923,0.268072,0.201695,0.581882,0.331561,0.821659,0.363908,0.789637,0.443242,0.776727,0.427098,0.835923,0.368129,0.882651,0.462502,0.884506,0.458456,0.825161,0.485378,0.865791,0.492462,0.753022,0.388396,0.724819,0.527789,0.750125,0.505755,0.811701,0.202423,0.847349,0.149100,0.818207,0.251478,0.786134,0.262220,0.833528,0.540649,0.752561,0.535947,0.809960,0.776289,0.875849,0.741961,0.807367,0.769134,0.803133,0.797288,0.872911,0.288274,0.871069,0.261417,0.877852,0.211189,0.919489,0.165526,0.923986,0.150272,0.909709,0.132465,0.885580,0.186573,0.734405,0.632824,0.217254,0.559428,0.275340,0.536165,0.200676,0.600325,0.150781,0.935289,0.545225,0.918101,0.598006,0.896757,0.600679,0.878490,0.561956,0.914849,0.497255,0.867085,0.608214,0.830967,0.582627,0.560636,0.856798,0.520619,0.857222,0.811775,0.808572,0.821250,0.875292,0.918196,0.705088,0.904602,0.706686,0.794442,0.944152,0.787969,0.945167,0.117257,0.946226,0.135619,0.968064,0.525441,0.095103,0.559068,0.061005,0.616291,0.080212,0.403325,0.136170,0.447639,0.129625,0.443786,0.160418,0.424576,0.160894,0.479786,0.203528,0.475710,0.158661,0.426343,0.095923,0.387447,0.128973,0.412212,0.086711,0.441735,0.204309,0.415662,0.190356,0.281339,0.742013,0.508646,0.712606,0.526521,0.715848,0.559281,0.730954,0.416263,0.896695,0.434476,0.957255,0.377466,0.945903,0.502901,0.325620,0.470343,0.266939,0.593300,0.800859,0.601375,0.848329,0.575316,0.841976,0.567965,0.800281,0.122397,0.981644,0.099822,0.957103,0.276827,0.964181,0.573802,0.023015,0.649228,0.040797,0.508870,0.042607,0.462656,0.038787,0.459315,0.013533,0.510564,0.006708,0.448542,0.247575,0.370410,0.119764,0.395271,0.078470,0.423368,0.227031,0.401869,0.207931,0.429560,0.062124,0.411662,0.050293,0.572434,0.776844,0.389732,0.143301,0.384494,0.148408,0.371071,0.150362,0.373321,0.136009,0.405133,0.166823,0.396459,0.180461,0.359523,0.152072,0.362871,0.132660,0.385985,0.192926,0.380062,0.153512,0.376218,0.157448,0.364859,0.163322,0.849327,0.516025,0.819845,0.563383,0.784244,0.555709,0.797979,0.509115,0.835063,0.801809,0.858255,0.803919,0.839728,0.873082,0.826688,0.873397,0.931768,0.705562,0.779251,0.946026,0.764590,0.882392,0.969009,0.573688,0.947161,0.603363,0.767695,0.697676,0.752700,0.697573,0.748830,0.534424,0.751026,0.564203,0.722240,0.574027,0.684726,0.553849,0.886473,0.803365,0.855488,0.872472,0.503369,0.073691,0.488179,0.102289,0.481197,0.085310,0.483849,0.076789,0.471910,0.084865,0.469338,0.105246,0.442707,0.082085,0.464704,0.077947,0.479699,0.067189,0.462068,0.068048,0.200369,0.973993,0.277770,0.984078,0.198474,0.988572,0.576129,0.894082,0.592130,0.903522,0.567638,0.949191,0.559807,0.928465,0.383913,0.163875,0.400142,0.167934,0.396503,0.168952,0.379094,0.171224,0.389997,0.182207,0.383155,0.184798,0.390421,0.173864,0.385277,0.169778,0.893083,0.706738,0.897494,0.730541,0.882366,0.730510,0.914135,0.730012,0.796777,0.967000,0.785096,0.969866,0.807749,0.942713,0.811794,0.964766,0.784577,0.696573,0.802237,0.695267,0.813800,0.724386,0.793238,0.730628,0.932131,0.731231,0.772084,0.967117,0.846669,0.945212,0.855768,0.943854,0.858493,0.969261,0.843837,0.970929,0.774615,0.727869,0.756972,0.725774,0.865361,0.943739,0.871758,0.967235,0.479822,0.910218,0.500714,0.950499,0.937366,0.798515,0.888369,0.872341,0.879235,0.943146,0.891646,0.965276,0.148932,0.645423,0.100628,0.644944,0.112362,0.618666,0.140417,0.619010,0.021276,0.621508,0.051811,0.620398,0.064275,0.652082,0.053851,0.676572,0.023316,0.677680,0.002710,0.660326,0.472805,0.078814,0.476612,0.079419,0.478227,0.079154,0.480068,0.075945,0.477029,0.074078,0.475632,0.074567,0.492484,0.122967,0.726118,0.738676,0.726871,0.734531,0.729548,0.729675,0.727822,0.744552,0.384949,0.156146,0.391065,0.154252,0.388466,0.160953,0.371630,0.168499,0.380695,0.160145,0.264206,0.922910,0.581726,0.755802,0.583074,0.766234,0.582753,0.751746,0.590101,0.781510,0.586266,0.771658,0.618831,0.752657,0.620772,0.761785,0.618610,0.746263,0.622845,0.770506,0.505278,0.984560,0.449587,0.980351,0.657817,0.751685,0.657503,0.755771,0.657133,0.745288,0.658372,0.763415,0.477225,0.076692,0.476802,0.075696,0.477155,0.075534,0.477527,0.076435,0.139736,0.674495,0.111676,0.674581,0.686309,0.102811,0.104705,0.908375,0.080332,0.924519,0.392857,0.174652,0.713897,0.813824,0.680775,0.775394,0.712090,0.760142,0.759721,0.767504,0.813891,0.786633,0.830216,0.779061,0.859008,0.781333,0.876058,0.782556,0.766705,0.988829,0.782198,0.992212,0.877613,0.989698,0.901129,0.987844,0.862448,0.989717,0.845795,0.991937,0.798849,0.988537,0.812205,0.984003,0.801772,0.768776,0.827368,0.760502,0.778196,0.765767,0.755877,0.761277,0.911186,0.759067,0.933366,0.760037,0.891804,0.760597,0.871280,0.760257,0.578486,0.874142,0.596346,0.872789,0.702004,0.055576,0.192282,0.695970,0.269760,0.700516,0.393361,0.707284,0.391357,0.989600,0.590487,0.372202,0.544447,0.399007,0.097098,0.854661,0.579870,0.860655,0.661596,0.604718,0.646417,0.635707,0.843406,0.011806,0.629609,0.653765,0.865040,0.058786,0.873665,0.195144,0.863549,0.226733,0.126169,0.685805,0.852497,0.263875,0.125182,0.715157,0.750936,0.267368,0.126736,0.741506,0.750079,0.238440,0.748231,0.213149,0.740569,0.108507,0.509664,0.651286,0.721053,0.067269,0.505335,0.582201,0.274846,0.874461,0.952149,0.559456,0.270517,0.943546,0.932631,0.600684,0.924982,0.705325,0.923133,0.730622,0.126390,0.618838,0.922276,0.759552,0.124780,0.645184,0.814570,0.764639,0.125706,0.674538,0.803519,0.727507,0.793407,0.695920,0.802045,0.559546,0.150572,0.946025,0.823653,0.512570,0.133764,0.927967,0.118585,0.896978,0.209928,0.566467,0.806432,0.284786,0.804384,0.307453,0.817835,0.377828,0.799824,0.449122,0.799878,0.474684,0.796922,0.495416,0.034675,0.739987,0.038989,0.718891,0.034638,0.683777,0.876593,0.495110,0.872454,0.473081,0.867435,0.450184,0.880606,0.383709,0.923114,0.315184,0.954610,0.272358,0.306241,0.582889,0.844612,0.780197,0.570253,0.858727,0.846659,0.802864,0.833208,0.873240,0.851219,0.944533,0.851165,0.970095,0.038583,0.677126,0.854121,0.990827,0.033493,0.656204,0.774451,0.990521,0.036544,0.620953,0.778590,0.968492,0.783610,0.945597,0.770439,0.879120,0.727929,0.810595,0.473940,0.875149,0.696433,0.767768,0.777419,0.247376,0.759960,0.246547,0.750336,0.247118,0.910434,0.235652,0.740712,0.247690,0.891384,0.238470,0.871273,0.241302,0.860234,0.237876,0.794163,0.247252,0.849194,0.234449,0.795798,0.742072,0.775689,0.739238,0.932501,0.739873,0.756643,0.736425,0.922876,0.739301,0.913250,0.738729,0.895787,0.739558,0.817870,0.735221,0.879040,0.739434,0.806834,0.738647,0.396948,0.139515,0.381343,0.132013,0.367146,0.125348,0.349357,0.125348,0.335192,0.132030,0.319974,0.139736,0.599092,0.754330,0.600718,0.764152,0.176794,0.478859,0.603387,0.771119,0.179463,0.471892,0.181089,0.462070,0.599536,0.749180,0.180645,0.456920,0.693768,0.746736,0.085103,0.461186,0.695078,0.753446,0.086413,0.454476,0.085867,0.450359,0.695406,0.737036,0.084775,0.444777,0.694314,0.742619,0.856568,0.370520,0.823517,0.370827,0.830741,0.373209,0.816490,0.370791,0.809463,0.370754,0.792457,0.370150,0.757775,0.369548,0.891520,0.380121,0.884856,0.376856,0.878193,0.373592,0.841581,0.866166,0.834553,0.866202,0.820302,0.868620,0.827525,0.866238,0.794472,0.865933,0.772856,0.869001,0.766188,0.872268,0.759520,0.875535,0.893268,0.864958,0.858587,0.865562,0.282067,0.103295,0.255306,0.106892,0.271687,0.119154,0.283597,0.116927,0.436355,0.105044,0.462701,0.106588,0.445289,0.120910,0.432792,0.117001,0.275065,0.111499,0.444929,0.111304]],
"faces": [10,53,51,49,0,4,2,0,10,49,51,50,0,0,2,1,10,52,94,421,0,3,5,586,10,50,51,210,0,1,2,11,10,210,51,56,0,11,2,10,10,56,154,57,0,10,6,12,10,57,154,87,0,12,6,13,10,55,63,59,0,14,9,15,10,59,63,54,0,15,9,8,10,155,60,87,0,17,16,13,10,87,60,57,0,13,16,12,10,468,157,475,0,646,19,655,10,475,157,156,0,655,19,18,10,63,62,122,0,9,21,20,10,122,62,394,0,20,21,551,10,63,55,62,0,9,14,21,10,62,55,64,0,21,14,22,10,55,65,64,0,14,24,22,10,64,65,66,0,22,24,23,10,59,214,55,0,15,25,14,10,55,214,65,0,14,25,24,10,59,54,140,0,15,8,26,10,59,67,213,0,27,30,28,10,213,67,69,0,28,30,29,10,73,62,64,0,233,232,231,10,66,174,64,0,230,33,231,10,64,174,173,0,231,33,32,10,87,58,155,0,13,35,17,10,155,58,72,0,17,35,34,10,157,468,158,0,19,646,36,10,158,468,469,0,36,646,648,10,172,173,178,0,31,32,38,10,178,173,176,0,38,32,39,10,179,170,180,0,40,42,41,10,180,170,171,0,41,42,247,10,383,66,382,0,537,23,535,10,382,66,65,0,535,23,24,10,68,169,67,0,48,47,30,10,67,169,168,0,30,47,46,10,80,69,78,0,56,29,57,10,86,85,81,0,62,61,55,10,81,85,206,0,55,61,54,10,154,153,87,0,6,7,13,10,87,153,58,0,13,7,35,10,50,210,54,0,1,11,8,10,54,210,209,0,8,11,65,10,57,3,56,0,12,67,10,10,56,3,2,0,10,67,66,10,140,54,209,0,26,8,65,10,3,57,6,0,67,12,68,10,6,57,60,0,68,12,16,10,61,53,211,0,69,4,70,10,211,53,212,0,70,4,71,10,69,11,213,0,29,73,28,10,213,11,47,0,28,73,72,10,4,88,13,0,74,77,75,10,13,88,71,0,75,77,76,10,12,15,70,0,81,80,44,10,70,15,95,0,44,80,45,10,53,97,212,0,4,82,71,10,10,44,68,0,84,83,48,10,68,44,169,0,48,83,47,10,17,18,75,0,87,86,51,10,75,18,77,0,51,86,85,10,19,11,80,0,88,73,56,10,80,11,69,0,56,73,29,10,31,117,203,0,89,59,60,10,203,117,204,0,60,59,58,10,22,19,85,0,91,88,61,10,85,19,80,0,61,88,56,10,23,22,86,0,92,91,62,10,86,22,85,0,62,91,61,10,18,21,77,0,86,94,85,10,77,21,84,0,85,94,93,10,60,155,119,0,16,17,95,10,119,155,88,0,95,17,77,10,83,90,200,0,99,98,96,10,200,90,131,0,96,98,97,10,91,86,89,0,101,62,100,10,89,86,81,0,100,62,55,10,83,20,90,0,99,103,98,10,90,20,24,0,98,103,102,10,91,25,86,0,101,104,62,10,86,25,23,0,62,104,92,10,90,132,131,0,98,105,97,10,90,24,142,0,98,102,106,10,142,24,41,0,106,102,107,10,66,383,174,0,238,536,108,10,174,383,384,0,108,536,538,10,410,470,159,0,572,649,111,10,159,470,471,0,111,649,650,10,391,392,178,0,547,548,38,10,178,392,172,0,38,548,31,10,419,182,418,0,583,249,582,10,418,182,188,0,582,249,114,10,73,172,393,0,233,31,550,10,393,172,392,0,550,31,548,10,191,190,187,0,118,120,119,10,187,190,186,0,119,120,121,10,97,186,138,0,235,121,236,10,138,186,190,0,236,121,120,10,159,471,160,0,111,650,122,10,160,471,472,0,122,650,651,10,76,118,115,0,49,50,124,10,118,137,115,0,50,125,124,10,114,79,115,0,127,126,124,10,115,79,76,0,124,126,49,10,79,114,133,0,126,127,128,10,133,114,134,0,128,127,129,10,75,77,116,0,51,85,216,10,116,77,113,0,216,85,130,10,48,16,138,0,133,132,131,10,138,16,97,0,131,132,82,10,202,207,45,0,134,137,135,10,45,207,30,0,135,137,136,10,26,27,144,0,141,140,138,10,144,27,145,0,138,140,139,10,28,25,147,0,143,104,142,10,147,25,91,0,142,104,101,10,145,27,146,0,139,140,144,10,146,27,29,0,144,140,145,10,146,29,147,0,144,145,142,10,147,29,28,0,142,145,143,10,194,199,177,0,148,147,146,10,177,199,176,0,146,147,39,10,199,198,176,0,147,149,39,10,176,198,178,0,39,149,38,10,162,167,180,0,151,150,41,10,180,167,179,0,41,150,40,10,167,166,179,0,150,153,40,10,179,166,181,0,40,153,152,10,386,194,385,0,540,156,539,10,385,194,177,0,539,156,155,10,178,198,391,0,38,149,547,10,391,198,390,0,547,149,546,10,188,163,418,0,114,160,582,10,418,163,417,0,582,160,581,10,413,165,412,0,575,163,574,10,412,165,189,0,574,163,162,10,187,197,191,0,119,168,118,10,191,197,196,0,118,168,167,10,165,164,189,0,163,170,162,10,189,164,193,0,162,170,169,10,208,207,201,0,172,137,171,10,201,207,202,0,171,137,134,10,472,473,160,0,651,652,122,10,160,473,161,0,122,652,173,10,192,193,182,0,123,169,248,10,182,193,188,0,248,169,174,10,193,164,188,0,169,170,174,10,188,164,163,0,174,170,175,10,82,205,487,0,52,53,669,10,487,205,486,0,669,53,668,10,53,122,97,0,4,20,82,10,388,389,101,0,543,545,177,10,101,389,103,0,177,545,178,10,114,98,134,0,127,63,129,10,134,98,149,0,129,63,185,10,115,150,114,0,124,186,127,10,114,150,98,0,127,186,63,10,137,151,115,0,125,187,124,10,115,151,150,0,124,187,186,10,152,116,148,0,217,216,188,10,148,116,113,0,188,216,130,10,453,454,31,0,627,628,89,10,31,454,117,0,89,628,59,10,67,168,69,0,30,46,29,10,69,168,74,0,29,46,189,10,40,39,130,0,193,192,190,10,130,39,129,0,190,192,191,10,121,92,120,0,194,196,195,10,120,92,89,0,195,196,100,10,32,26,143,0,197,141,198,10,143,26,144,0,198,141,138,10,393,394,73,0,549,551,199,10,73,394,62,0,199,551,21,10,119,124,60,0,95,201,16,10,124,123,60,0,201,200,16,10,60,123,6,0,16,200,68,10,6,123,33,0,68,200,202,10,5,34,119,0,203,204,95,10,119,34,124,0,95,204,201,10,459,460,124,0,634,635,201,10,124,460,123,0,201,635,200,10,460,461,123,0,635,637,200,10,123,461,33,0,200,637,202,10,458,459,34,0,632,634,204,10,34,459,124,0,204,634,201,10,211,8,208,0,70,206,172,10,208,8,7,0,172,206,205,10,53,61,52,0,4,69,3,10,52,61,94,0,3,69,5,10,51,52,56,0,2,3,10,10,56,52,154,0,10,3,6,10,128,127,126,0,210,209,207,10,126,127,125,0,207,209,208,10,127,37,125,0,209,212,208,10,125,37,35,0,208,212,211,10,36,38,126,0,213,214,207,10,126,38,128,0,207,214,210,10,464,465,128,0,641,642,210,10,128,465,127,0,210,642,209,10,465,466,127,0,642,644,209,10,127,466,37,0,209,644,212,10,464,128,463,0,641,210,639,10,463,128,38,0,639,210,214,10,120,89,131,0,195,100,97,10,131,89,200,0,97,100,96,10,121,120,132,0,194,195,105,10,132,120,131,0,105,195,97,10,32,143,41,0,197,198,107,10,41,143,142,0,107,198,106,10,134,113,133,0,129,130,128,10,133,113,84,0,128,130,93,10,148,113,149,0,188,130,185,10,149,113,134,0,185,130,129,10,135,136,100,0,64,227,215,10,100,136,99,0,215,227,228,10,152,151,116,0,217,187,216,10,116,151,137,0,216,187,125,10,116,137,75,0,216,125,51,10,75,137,118,0,51,125,50,10,15,48,95,0,80,133,45,10,95,48,138,0,45,133,131,10,95,138,183,0,237,236,109,10,183,138,190,0,109,236,120,10,195,185,196,0,157,154,167,10,196,185,191,0,167,154,118,10,117,82,484,0,59,52,666,10,484,82,487,0,666,52,669,10,387,388,102,0,541,543,220,10,102,388,101,0,220,543,177,10,176,173,177,0,39,32,146,10,177,173,174,0,146,32,33,10,174,384,177,0,108,538,155,10,177,384,385,0,155,538,539,10,183,190,185,0,109,120,154,10,185,190,191,0,154,120,118,10,59,140,67,0,27,221,30,10,67,140,68,0,30,221,48,10,43,12,141,0,223,81,222,10,141,12,70,0,222,81,44,10,193,192,189,0,169,123,162,10,189,192,184,0,162,123,116,10,184,411,189,0,116,573,162,10,189,411,412,0,162,573,574,10,170,179,175,0,42,40,43,10,175,179,181,0,43,40,152,10,63,49,54,0,9,0,8,10,54,49,50,0,8,0,1,10,53,49,122,0,4,0,20,10,122,49,63,0,20,0,9,10,90,142,132,0,98,106,105,10,143,121,142,0,198,194,106,10,142,121,132,0,106,194,105,10,92,121,144,0,196,194,138,10,144,121,143,0,138,194,198,10,144,145,92,0,138,139,196,10,92,145,89,0,196,139,100,10,89,145,93,0,100,139,226,10,93,145,146,0,226,139,144,10,146,147,93,0,144,142,226,10,93,147,91,0,226,142,101,10,89,93,91,0,100,226,101,10,135,100,149,0,64,215,185,10,98,135,149,0,63,64,185,10,150,136,98,0,186,227,63,10,98,136,135,0,63,227,64,10,99,136,151,0,228,227,187,10,473,474,161,0,653,654,229,10,161,474,420,0,229,654,584,10,88,155,71,0,77,17,76,10,71,155,72,0,76,17,34,10,94,161,421,0,239,229,585,10,421,161,420,0,585,229,584,10,153,156,58,0,240,18,241,10,58,156,157,0,241,18,19,10,58,157,72,0,241,19,242,10,72,157,158,0,242,19,36,10,96,409,159,0,244,571,111,10,159,409,410,0,111,571,572,10,160,111,159,0,122,245,111,10,159,111,96,0,111,245,244,10,94,111,161,0,246,245,173,10,161,111,160,0,173,245,122,10,416,417,109,0,580,581,250,10,109,417,163,0,250,581,160,10,112,415,109,0,184,578,253,10,109,415,416,0,253,578,579,10,112,164,110,0,252,170,254,10,110,164,165,0,254,170,163,10,414,110,413,0,576,254,575,10,413,110,165,0,575,254,163,10,104,106,167,0,256,257,150,10,167,106,166,0,150,257,153,10,105,104,162,0,251,256,151,10,162,104,167,0,151,256,150,10,4,5,88,0,74,203,77,10,88,5,119,0,77,203,95,10,74,168,76,0,189,46,49,10,76,168,118,0,49,46,50,10,169,75,168,0,47,51,46,10,168,75,118,0,46,51,50,10,44,17,169,0,83,87,47,10,169,17,75,0,47,87,51,10,441,442,386,0,611,613,540,10,386,442,194,0,540,613,156,10,440,195,439,0,610,157,609,10,439,195,196,0,609,157,167,10,439,196,438,0,609,167,607,10,438,196,197,0,607,167,168,10,436,437,198,0,605,606,149,10,198,437,390,0,149,606,546,10,435,436,199,0,604,605,147,10,199,436,198,0,147,605,149,10,442,435,194,0,612,604,148,10,194,435,199,0,148,604,147,10,148,100,152,0,188,215,217,10,152,100,99,0,217,215,228,10,82,117,455,0,52,59,629,10,455,117,454,0,629,59,628,10,82,455,206,0,52,629,54,10,206,455,81,0,54,629,55,10,94,61,201,0,5,69,171,10,201,61,211,0,171,69,70,10,111,94,202,0,266,5,134,10,94,201,202,0,5,171,134,10,202,45,111,0,134,135,266,10,111,45,14,0,266,135,78,10,69,74,78,0,29,189,57,10,84,21,203,0,93,94,60,10,203,21,46,0,60,94,90,10,133,84,204,0,128,93,58,10,204,84,203,0,58,93,60,10,133,204,484,0,128,58,666,10,79,205,76,0,126,53,49,10,206,78,205,0,54,57,53,10,205,78,74,0,53,57,189,10,85,80,206,0,61,56,54,10,206,80,78,0,54,56,57,10,7,30,208,0,205,136,172,10,208,30,207,0,172,136,137,10,42,10,140,0,225,84,221,10,140,10,68,0,221,84,48,10,42,140,1,0,224,26,218,10,1,140,209,0,218,26,65,10,210,0,209,0,11,165,65,10,209,0,1,0,65,165,218,10,56,2,210,0,10,66,11,10,210,2,0,0,11,66,165,10,212,9,211,0,71,166,70,10,211,9,8,0,70,166,206,10,16,9,97,0,132,166,82,10,97,9,212,0,82,166,71,10,201,211,208,0,171,70,172,10,382,65,381,0,535,24,534,10,381,65,214,0,534,24,25,10,43,141,47,0,158,112,72,10,47,141,213,0,72,112,28,10,381,213,141,0,534,37,222,10,136,150,151,0,227,186,187,10,152,99,151,0,217,228,187,10,100,148,149,0,215,188,185,10,13,96,14,0,75,79,78,10,14,96,111,0,78,79,266,10,72,409,71,0,34,570,76,10,77,84,113,0,85,93,130,10,217,218,219,0,269,270,271,10,320,319,218,0,273,274,270,10,218,319,434,0,270,274,602,10,216,376,217,0,268,276,269,10,217,376,222,0,269,276,275,10,222,223,320,0,275,277,273,10,320,223,253,0,273,277,278,10,221,225,229,0,279,280,282,10,229,225,220,0,282,280,281,10,223,226,253,0,277,283,278,10,253,226,321,0,278,283,284,10,322,323,480,0,286,287,661,10,480,323,479,0,661,287,660,10,395,228,288,0,552,290,289,10,288,228,229,0,289,290,282,10,230,221,228,0,291,279,290,10,228,221,229,0,290,279,282,10,221,230,231,0,279,291,293,10,231,230,232,0,293,291,292,10,231,380,221,0,293,294,279,10,221,380,225,0,279,294,280,10,225,306,220,0,280,295,281,10,225,379,233,0,296,297,299,10,233,379,235,0,299,297,298,10,338,339,239,0,301,302,300,10,239,339,230,0,300,302,303,10,339,340,230,0,302,305,303,10,230,340,232,0,303,305,306,10,238,224,321,0,307,308,284,10,321,224,253,0,284,308,278,10,323,324,479,0,287,309,660,10,479,324,478,0,660,309,658,10,342,343,339,0,312,419,302,10,339,343,340,0,302,419,305,10,345,346,336,0,313,314,288,10,336,346,337,0,288,314,285,10,231,232,407,0,293,292,568,10,407,232,406,0,568,292,566,10,334,335,233,0,317,318,299,10,233,335,234,0,299,318,319,10,248,371,372,0,320,321,322,10,246,244,235,0,324,325,298,10,370,283,369,0,326,327,328,10,369,283,31,0,328,327,354,10,372,251,247,0,322,329,323,10,247,251,252,0,323,329,330,10,320,253,319,0,273,278,274,10,319,253,224,0,274,278,308,10,375,376,220,0,331,276,281,10,220,376,216,0,281,276,268,10,223,222,3,0,277,275,333,10,3,222,2,0,333,275,332,10,306,375,220,0,295,331,281,10,3,6,223,0,333,334,277,10,223,6,226,0,277,334,283,10,227,377,219,0,335,336,271,10,219,377,378,0,271,336,337,10,235,379,11,0,298,297,339,10,11,379,47,0,339,297,338,10,4,13,254,0,340,341,343,10,254,13,237,0,343,341,342,10,261,15,236,0,316,344,315,10,236,15,12,0,315,344,345,10,219,378,263,0,271,337,346,10,335,44,234,0,318,347,319,10,234,44,10,0,319,347,348,10,243,18,241,0,350,351,349,10,241,18,17,0,349,351,352,10,235,11,246,0,298,339,324,10,246,11,19,0,324,339,353,10,369,31,46,0,328,354,355,10,246,19,251,0,324,353,329,10,251,19,22,0,329,353,356,10,251,22,252,0,329,356,330,10,252,22,23,0,330,356,357,10,250,21,243,0,358,359,350,10,243,21,18,0,350,359,351,10,226,285,321,0,283,360,284,10,321,285,254,0,284,360,343,10,297,256,366,0,362,363,361,10,366,256,249,0,361,363,364,10,247,252,255,0,323,330,365,10,255,252,257,0,365,330,366,10,249,256,20,0,364,363,368,10,20,256,24,0,368,363,367,10,23,25,252,0,357,369,330,10,252,25,257,0,330,369,366,10,256,297,298,0,363,362,370,10,256,308,24,0,363,371,367,10,24,308,41,0,367,371,372,10,232,340,406,0,373,374,567,10,406,340,405,0,567,374,565,10,324,423,478,0,377,589,659,10,478,423,477,0,659,589,657,10,340,343,405,0,374,428,565,10,405,343,404,0,565,428,564,10,337,346,432,0,285,314,600,10,432,346,431,0,600,314,599,10,397,338,396,0,555,301,553,10,396,338,239,0,553,301,300,10,356,352,304,0,389,390,388,10,304,352,263,0,388,390,391,10,325,326,476,0,378,392,656,10,476,326,483,0,656,392,665,10,242,281,284,0,395,396,394,10,281,303,284,0,396,397,394,10,280,281,245,0,398,396,399,10,245,281,242,0,399,396,395,10,245,299,280,0,399,400,398,10,280,299,300,0,398,400,401,10,279,243,282,0,403,350,402,10,282,243,241,0,402,350,349,10,263,16,304,0,346,405,404,10,304,16,48,0,404,405,406,10,368,45,373,0,407,408,410,10,373,45,30,0,410,408,409,10,311,27,310,0,412,413,411,10,310,27,26,0,411,413,414,10,257,25,313,0,366,369,415,10,313,25,28,0,415,369,416,10,311,312,27,0,412,417,413,10,27,312,29,0,413,417,418,10,312,313,29,0,417,415,418,10,29,313,28,0,418,415,416,10,342,365,343,0,312,420,419,10,343,365,360,0,419,420,421,10,344,364,342,0,311,422,312,10,342,364,365,0,312,422,420,10,345,333,346,0,313,423,314,10,346,333,328,0,314,423,424,10,347,332,345,0,425,426,313,10,345,332,333,0,313,426,423,10,343,360,404,0,428,429,564,10,404,360,403,0,564,429,563,10,344,398,364,0,311,556,422,10,364,398,399,0,422,556,557,10,346,328,431,0,314,424,599,10,431,328,430,0,599,424,598,10,347,425,332,0,433,591,436,10,332,425,426,0,436,591,592,10,353,357,363,0,387,386,438,10,363,357,362,0,438,386,437,10,359,330,355,0,439,440,434,10,355,330,331,0,434,440,435,10,368,373,367,0,407,410,441,10,367,373,374,0,441,410,442,10,327,482,326,0,443,664,392,10,326,482,483,0,392,664,665,10,354,359,348,0,445,439,444,10,348,359,358,0,444,439,393,10,359,354,330,0,439,445,440,10,330,354,329,0,440,445,446,10,219,263,288,0,271,346,289,10,401,267,400,0,560,448,558,10,400,267,269,0,558,448,449,10,272,427,270,0,454,593,453,10,270,427,428,0,453,593,595,10,280,300,264,0,398,401,458,10,264,300,315,0,458,401,457,10,264,316,280,0,458,459,398,10,280,316,281,0,398,459,396,10,316,317,281,0,459,460,396,10,281,317,303,0,396,460,397,10,318,314,282,0,461,462,402,10,282,314,279,0,402,462,403,10,283,452,31,0,327,625,354,10,31,452,453,0,354,625,626,10,240,334,235,0,463,317,298,10,235,334,233,0,298,317,299,10,295,39,296,0,465,466,464,10,296,39,40,0,464,466,467,10,287,286,258,0,468,469,470,10,258,286,255,0,470,469,365,10,32,309,26,0,471,472,414,10,26,309,310,0,414,472,411,10,396,239,395,0,554,473,552,10,395,239,228,0,552,473,290,10,285,226,290,0,360,283,475,10,226,289,290,0,283,474,475,10,226,6,289,0,283,334,474,10,289,6,33,0,474,334,476,10,5,285,34,0,477,360,478,10,34,285,290,0,478,360,475,10,289,456,290,0,474,630,475,10,290,456,457,0,475,630,631,10,33,461,289,0,476,636,474,10,289,461,456,0,474,636,630,10,458,34,457,0,633,478,631,10,457,34,290,0,631,478,475,10,377,374,8,0,336,442,484,10,8,374,7,0,484,442,483,10,219,218,227,0,271,270,335,10,227,218,260,0,335,270,272,10,217,222,218,0,269,275,270,10,218,222,320,0,270,275,273,10,291,293,292,0,479,485,480,10,292,293,294,0,480,485,486,10,35,37,291,0,481,487,479,10,291,37,293,0,479,487,485,10,36,292,38,0,482,480,488,10,38,292,294,0,488,480,486,10,293,467,294,0,485,645,486,10,294,467,462,0,486,645,638,10,37,466,293,0,487,643,485,10,293,466,467,0,485,643,645,10,38,294,463,0,488,486,640,10,463,294,462,0,640,486,638,10,366,255,297,0,361,365,362,10,297,255,286,0,362,365,469,10,297,286,298,0,362,469,370,10,298,286,287,0,370,469,468,10,308,309,41,0,371,472,372,10,41,309,32,0,372,472,471,10,300,299,279,0,401,400,403,10,279,299,250,0,403,400,358,10,300,279,315,0,401,403,457,10,315,279,314,0,457,403,462,10,301,266,302,0,489,490,492,10,302,266,265,0,492,490,491,10,303,317,282,0,397,460,402,10,282,317,318,0,402,460,461,10,282,241,303,0,402,349,397,10,303,241,284,0,397,349,394,10,304,48,261,0,404,406,316,10,261,48,15,0,316,406,344,10,261,349,304,0,376,375,388,10,304,349,356,0,388,375,389,10,349,351,356,0,375,427,389,10,356,351,357,0,389,427,386,10,357,351,362,0,386,427,437,10,362,351,361,0,437,427,430,10,490,493,489,0,672,675,671,10,402,268,401,0,562,494,560,10,401,268,267,0,560,494,448,10,225,233,306,0,296,299,495,10,306,233,234,0,495,299,319,10,236,12,307,0,315,345,496,10,307,12,43,0,496,345,497,10,359,355,358,0,439,434,393,10,358,355,350,0,393,434,379,10,424,425,341,0,590,591,380,10,341,425,347,0,380,591,433,10,347,345,341,0,425,313,310,10,341,345,336,0,310,313,288,10,216,215,220,0,268,267,281,10,220,215,229,0,281,267,282,10,219,288,215,0,271,289,267,10,215,288,229,0,267,289,282,10,256,298,308,0,363,370,371,10,309,308,287,0,472,371,468,10,287,308,298,0,468,371,370,10,309,287,310,0,472,468,411,10,310,287,258,0,411,468,470,10,255,311,258,0,365,412,470,10,258,311,310,0,470,412,411,10,255,259,311,0,365,498,412,10,311,259,312,0,412,498,417,10,257,313,259,0,366,415,498,10,259,313,312,0,498,415,417,10,255,257,259,0,365,366,498,10,301,315,266,0,489,457,490,10,264,315,301,0,458,457,489,10,316,264,302,0,459,458,492,10,302,264,301,0,492,458,489,10,265,317,302,0,491,460,492,10,481,433,480,0,662,601,661,10,480,433,322,0,661,601,286,10,254,237,321,0,343,342,284,10,321,237,238,0,284,342,307,10,342,339,344,0,312,302,311,10,344,339,338,0,311,302,301,10,398,344,397,0,556,311,555,10,397,344,338,0,555,311,301,10,357,353,356,0,386,387,389,10,356,353,352,0,389,387,390,10,434,319,433,0,603,501,601,10,433,319,322,0,601,501,286,10,319,224,322,0,501,502,286,10,322,224,323,0,286,502,287,10,224,238,323,0,502,503,287,10,323,238,324,0,287,503,309,10,324,238,423,0,377,504,589,10,423,238,422,0,589,504,587,10,326,325,277,0,392,378,506,10,277,325,262,0,506,378,505,10,429,430,271,0,596,598,508,10,271,430,328,0,508,598,424,10,330,329,278,0,440,446,509,10,278,329,275,0,509,446,510,10,331,330,276,0,435,440,511,10,276,330,278,0,511,440,509,10,332,426,272,0,436,592,512,10,272,426,427,0,512,592,594,10,270,333,272,0,513,423,514,10,272,333,332,0,514,423,426,10,271,328,270,0,508,424,513,10,270,328,333,0,513,424,423,10,4,254,5,0,340,343,477,10,5,254,285,0,477,343,360,10,284,334,242,0,394,317,395,10,242,334,240,0,395,317,463,10,335,334,241,0,318,317,349,10,241,334,284,0,349,317,394,10,44,335,17,0,347,318,352,10,17,335,241,0,352,318,349,10,450,403,449,0,623,563,621,10,449,403,360,0,621,563,429,10,362,361,444,0,437,430,615,10,444,361,443,0,615,430,614,10,363,362,445,0,438,437,617,10,445,362,444,0,617,437,615,10,447,364,446,0,619,422,618,10,446,364,399,0,618,422,557,10,448,365,447,0,620,420,619,10,447,365,364,0,619,420,422,10,449,360,448,0,622,421,620,10,448,360,365,0,620,421,420,10,265,266,318,0,491,490,461,10,318,266,314,0,461,490,462,10,248,451,283,0,320,624,327,10,283,451,452,0,327,624,625,10,377,227,367,0,336,335,441,10,367,227,260,0,441,335,272,10,367,260,368,0,441,272,407,10,260,277,368,0,272,523,407,10,14,45,277,0,524,408,523,10,277,45,368,0,523,408,407,10,235,244,240,0,298,325,463,10,250,369,21,0,358,328,359,10,21,369,46,0,359,328,355,10,299,370,250,0,400,326,358,10,250,370,369,0,358,326,328,10,242,240,371,0,395,463,321,10,372,371,244,0,322,321,325,10,244,371,240,0,325,321,463,10,251,372,246,0,329,322,324,10,246,372,244,0,324,322,325,10,373,30,374,0,410,409,442,10,374,30,7,0,442,409,483,10,42,306,10,0,525,495,348,10,10,306,234,0,348,495,319,10,42,1,306,0,526,527,295,10,306,1,375,0,295,527,331,10,376,375,0,0,276,331,528,10,0,375,1,0,528,331,527,10,222,376,2,0,275,276,332,10,2,376,0,0,332,276,528,10,378,377,9,0,337,336,529,10,9,377,8,0,529,336,484,10,378,9,263,0,337,529,346,10,263,9,16,0,346,529,405,10,367,374,377,0,441,442,336,10,380,231,408,0,294,293,569,10,408,231,407,0,569,293,568,10,379,307,47,0,297,530,338,10,47,307,43,0,338,530,531,10,225,380,379,0,280,294,532,10,379,380,408,0,532,294,569,10,302,317,316,0,492,460,459,10,318,317,265,0,461,460,491,10,266,315,314,0,490,457,462,10,277,262,14,0,523,533,524,10,14,262,13,0,524,533,341,10,422,237,262,0,588,342,533,10,262,237,13,0,533,342,341,10,243,279,250,0,350,403,358,10,53,52,51,0,4,3,2,10,205,74,76,0,53,189,49,10,64,173,73,0,231,32,233,10,73,173,172,0,233,32,31,10,112,110,415,0,184,183,578,10,415,110,414,0,578,183,577,10,429,271,428,0,597,452,595,10,428,271,270,0,595,452,453,10,216,217,215,0,268,269,267,10,215,217,219,0,267,269,271,10,239,230,228,0,300,303,304,10,70,382,141,0,44,535,222,10,141,382,381,0,222,535,534,10,95,383,70,0,45,537,44,10,70,383,382,0,44,537,535,10,383,95,384,0,536,237,538,10,384,95,183,0,538,237,109,10,384,183,385,0,538,109,539,10,385,183,185,0,539,109,154,10,185,195,385,0,154,157,539,10,385,195,386,0,539,157,540,10,441,386,440,0,611,540,610,10,440,386,195,0,610,540,157,10,139,388,107,0,176,543,219,10,107,388,387,0,219,543,541,10,108,389,139,0,179,545,176,10,139,389,388,0,176,545,543,10,390,437,197,0,546,606,159,10,197,437,438,0,159,606,608,10,391,390,187,0,547,546,113,10,187,390,197,0,113,546,159,10,187,186,391,0,113,117,547,10,391,186,392,0,547,117,548,10,97,393,186,0,234,550,117,10,186,393,392,0,117,550,548,10,122,394,97,0,20,551,82,10,97,394,393,0,82,551,549,10,396,395,263,0,554,552,346,10,263,395,288,0,346,552,289,10,263,352,396,0,384,385,553,10,396,352,397,0,553,385,555,10,353,398,352,0,381,556,385,10,352,398,397,0,385,556,555,10,398,353,399,0,556,381,557,10,399,353,363,0,557,381,431,10,399,363,446,0,557,431,618,10,446,363,445,0,618,431,616,10,401,400,305,0,560,558,447,10,305,400,274,0,447,558,450,10,402,401,273,0,562,560,493,10,273,401,305,0,493,560,447,10,450,443,403,0,623,614,563,10,403,443,361,0,563,614,430,10,351,404,361,0,427,564,430,10,361,404,403,0,430,564,563,10,405,404,349,0,565,564,375,10,349,404,351,0,375,564,427,10,406,405,261,0,567,565,376,10,261,405,349,0,376,565,375,10,407,406,236,0,568,566,315,10,236,406,261,0,315,566,316,10,408,407,307,0,569,568,496,10,307,407,236,0,496,568,315,10,409,72,410,0,571,243,572,10,410,72,158,0,572,243,110,10,158,469,410,0,110,647,572,10,410,469,470,0,572,647,649,10,411,175,412,0,573,115,574,10,412,175,181,0,574,115,161,10,181,166,412,0,161,164,574,10,412,166,413,0,574,164,575,10,414,413,106,0,576,575,255,10,106,413,166,0,255,575,164,10,415,414,104,0,578,577,181,10,104,414,106,0,181,577,182,10,416,415,105,0,579,578,180,10,105,415,104,0,180,578,181,10,416,105,417,0,580,251,581,10,417,105,162,0,581,251,151,10,417,162,418,0,581,151,582,10,418,162,180,0,582,151,41,10,171,419,180,0,247,583,41,10,180,419,418,0,41,583,582,10,420,474,156,0,584,654,18,10,156,474,475,0,18,654,655,10,421,420,153,0,585,584,240,10,153,420,156,0,240,584,18,10,423,422,325,0,589,587,378,10,325,422,262,0,378,587,505,10,423,325,477,0,589,378,657,10,477,325,476,0,657,378,656,10,350,355,424,0,379,434,590,10,424,355,425,0,590,434,591,10,426,425,331,0,592,591,435,10,331,425,355,0,435,591,434,10,427,426,276,0,594,592,511,10,276,426,331,0,511,592,435,10,427,276,428,0,593,455,595,10,428,276,278,0,595,455,456,10,429,428,275,0,597,595,451,10,275,428,278,0,451,595,456,10,329,430,275,0,432,598,507,10,275,430,429,0,507,598,596,10,354,431,329,0,382,599,432,10,329,431,430,0,432,599,598,10,432,431,348,0,600,599,383,10,348,431,354,0,383,599,382,10,482,327,481,0,663,499,662,10,481,327,433,0,662,499,601,10,260,434,327,0,500,603,443,10,327,434,433,0,443,603,601,10,218,434,260,0,270,602,272,10,421,153,52,0,586,7,3,10,52,153,154,0,3,7,6,10,381,214,213,0,534,25,37,10,213,214,59,0,37,25,15,10,379,408,307,0,532,569,496,10,101,103,435,0,264,262,604,10,435,103,436,0,604,262,605,10,103,389,436,0,262,544,605,10,436,389,437,0,605,544,606,10,438,437,108,0,608,606,263,10,108,437,389,0,263,606,544,10,139,439,108,0,260,609,261,10,108,439,438,0,261,609,607,10,107,440,139,0,258,610,260,10,139,440,439,0,260,610,609,10,387,441,107,0,542,611,258,10,107,441,440,0,258,611,610,10,387,102,441,0,542,259,611,10,441,102,442,0,611,259,613,10,102,101,442,0,265,264,612,10,442,101,435,0,612,264,604,10,444,443,305,0,615,614,517,10,305,443,273,0,517,614,515,10,445,444,274,0,617,615,518,10,274,444,305,0,518,615,517,10,400,446,274,0,559,618,520,10,274,446,445,0,520,618,616,10,269,447,400,0,519,619,559,10,400,447,446,0,559,619,618,10,267,448,269,0,521,620,519,10,269,448,447,0,519,620,619,10,268,449,267,0,522,622,521,10,267,449,448,0,521,622,620,10,402,450,268,0,561,623,516,10,268,450,449,0,516,623,621,10,443,450,273,0,614,623,515,10,273,450,402,0,515,623,561,10,255,366,247,0,365,361,323,10,247,366,451,0,323,361,624,10,451,366,452,0,624,361,625,10,452,366,249,0,625,361,364,10,452,249,453,0,625,364,626,10,453,249,20,0,626,364,368,10,454,453,83,0,628,627,99,10,83,453,20,0,99,627,103,10,455,454,200,0,629,628,96,10,200,454,83,0,96,628,99,10,89,81,200,0,100,55,96,10,200,81,455,0,96,55,629,10,82,206,205,0,52,54,53,10,248,372,451,0,320,322,624,10,451,372,247,0,624,322,323,10,456,291,457,0,630,479,631,10,457,291,292,0,631,479,480,10,458,457,36,0,633,631,482,10,36,457,292,0,482,631,480,10,126,459,36,0,207,634,213,10,36,459,458,0,213,634,632,10,460,459,125,0,635,634,208,10,125,459,126,0,208,634,207,10,460,125,461,0,635,208,637,10,461,125,35,0,637,208,211,10,456,461,291,0,630,636,479,10,291,461,35,0,479,636,481,10,40,463,296,0,467,640,464,10,296,463,462,0,464,640,638,10,40,130,463,0,193,190,639,10,463,130,464,0,639,190,641,10,465,464,129,0,642,641,191,10,129,464,130,0,191,641,190,10,465,129,466,0,642,191,644,10,466,129,39,0,644,191,192,10,467,466,295,0,645,643,465,10,295,466,39,0,465,643,466,10,467,295,462,0,645,465,638,10,462,295,296,0,638,465,464,10,170,175,468,0,42,43,646,10,468,175,469,0,646,43,648,10,470,469,411,0,649,647,573,10,411,469,175,0,573,647,115,10,471,470,184,0,650,649,116,10,184,470,411,0,116,649,573,10,471,184,472,0,650,116,651,10,472,184,192,0,651,116,123,10,472,192,473,0,651,123,652,10,473,192,182,0,652,123,248,10,182,419,473,0,249,583,653,10,473,419,474,0,653,583,654,10,475,474,171,0,655,654,247,10,171,474,419,0,247,654,583,10,170,468,171,0,42,646,247,10,171,468,475,0,247,646,655,10,424,477,350,0,590,657,379,10,350,477,476,0,379,657,656,10,477,424,478,0,657,590,659,10,478,424,341,0,659,590,380,10,478,341,479,0,658,310,660,10,479,341,336,0,660,310,288,10,480,479,337,0,661,660,285,10,337,479,336,0,285,660,288,10,432,481,337,0,600,662,285,10,337,481,480,0,285,662,661,10,348,482,432,0,383,663,600,10,432,482,481,0,600,663,662,10,483,482,358,0,665,664,393,10,358,482,348,0,393,664,444,10,476,483,350,0,656,665,379,10,350,483,358,0,379,665,393,10,203,46,31,0,60,90,89,10,238,237,422,0,307,342,588,10,409,96,71,0,570,79,76,10,71,96,13,0,76,79,75,10,109,163,112,0,253,175,184,10,112,163,164,0,184,175,170,10,260,327,277,0,500,443,506,10,277,327,326,0,506,443,392,10,484,492,485,0,666,674,667,10,245,489,299,0,399,671,400,10,299,489,488,0,400,671,670,10,245,371,489,0,399,321,671,10,489,371,490,0,671,321,672,10,490,371,491,0,672,321,673,10,491,371,248,0,673,321,320,10,283,488,248,0,327,670,320,10,248,488,491,0,320,670,673,10,487,492,484,0,669,674,666,10,486,492,487,0,668,674,669,10,485,492,486,0,667,674,668,10,489,493,488,0,671,675,670,10,491,493,490,0,673,675,672,10,488,493,491,0,670,675,673,10,484,485,133,0,666,667,128,10,133,485,79,0,128,667,126,10,204,117,484,0,58,59,666,10,79,485,205,0,126,667,53,10,205,485,486,0,53,667,668,10,245,242,371,0,399,395,321,10,370,488,283,0,326,670,327,10,299,488,370,0,400,670,326]
}
HEADER CSD ENTRY GLOBAL
CRYST1 4.7589 4.7589 12.9912 90.00 90.00 120.00 R-3c
SCALE1 0.210133 0.121320 -0.000000 0.000000
SCALE2 0.000000 0.242640 -0.000000 0.000000
SCALE3 0.000000 0.000000 0.076975 0.000000
HETATM 1 Al UNK 0 1 2.379 4.121 4.573 1.00 0.00
HETATM 2 O UNK 0 1 3.835 4.121 3.248 1.00 0.00
HETATM 3 Al UNK 0 1 2.379 4.121 1.923 1.00 0.00
HETATM 4 O UNK 0 1 1.652 5.382 3.248 1.00 0.00
HETATM 5 O UNK 0 1 1.652 2.861 3.248 1.00 0.00
HETATM 6 Al UNK 0 1 -0.000 2.748 4.088 1.00 0.00
HETATM 7 Al UNK 0 1 4.759 2.748 4.088 1.00 0.00
HETATM 8 O UNK 0 1 3.303 2.748 5.413 1.00 0.00
HETATM 9 Al UNK 0 1 2.379 6.869 4.088 1.00 0.00
HETATM 10 O UNK 0 1 3.107 5.608 5.413 1.00 0.00
HETATM 11 O UNK 0 1 0.728 4.008 5.413 1.00 0.00
HETATM 12 Al UNK 0 1 4.759 5.495 2.408 1.00 0.00
HETATM 13 Al UNK 0 1 2.379 1.374 2.408 1.00 0.00
HETATM 14 Al UNK 0 1 0.000 5.495 2.408 1.00 0.00
HETATM 15 O UNK 0 1 0.728 4.234 1.083 1.00 0.00
HETATM 16 O UNK 0 1 3.303 5.495 1.083 1.00 0.00
HETATM 17 O UNK 0 1 3.107 2.634 1.083 1.00 0.00
HETATM 18 Al UNK 0 1 -2.379 4.121 4.573 1.00 0.00
HETATM 19 O UNK 0 1 -3.107 5.382 3.248 1.00 0.00
HETATM 20 Al UNK 0 1 -2.379 4.121 1.923 1.00 0.00
HETATM 21 O UNK 0 1 -3.107 2.861 3.248 1.00 0.00
HETATM 22 O UNK 0 1 -0.924 4.121 3.248 1.00 0.00
HETATM 23 Al UNK 0 1 -2.379 6.869 4.088 1.00 0.00
HETATM 24 O UNK 0 1 -1.652 5.608 5.413 1.00 0.00
HETATM 25 Al UNK 0 1 -4.759 2.748 4.088 1.00 0.00
HETATM 26 O UNK 0 1 -4.031 4.008 5.413 1.00 0.00
HETATM 27 O UNK 0 1 -1.456 2.748 5.413 1.00 0.00
HETATM 28 Al UNK 0 1 -4.759 5.495 2.408 1.00 0.00
HETATM 29 Al UNK 0 1 -2.379 1.374 2.408 1.00 0.00
HETATM 30 O UNK 0 1 -1.652 2.634 1.083 1.00 0.00
HETATM 31 O UNK 0 1 -4.031 4.234 1.083 1.00 0.00
HETATM 32 O UNK 0 1 -1.456 5.495 1.083 1.00 0.00
HETATM 33 Al UNK 0 1 0.000 0.000 4.573 1.00 0.00
HETATM 34 O UNK 0 1 -0.728 -1.261 3.248 1.00 0.00
HETATM 35 Al UNK 0 1 0.000 0.000 1.923 1.00 0.00
HETATM 36 O UNK 0 1 1.456 0.000 3.248 1.00 0.00
HETATM 37 O UNK 0 1 -0.728 1.261 3.248 1.00 0.00
HETATM 38 Al UNK 0 1 -2.379 -1.374 4.088 1.00 0.00
HETATM 39 O UNK 0 1 -1.652 -0.113 5.413 1.00 0.00
HETATM 40 Al UNK 0 1 2.379 -1.374 4.088 1.00 0.00
HETATM 41 O UNK 0 1 0.924 -1.374 5.413 1.00 0.00
HETATM 42 O UNK 0 1 0.728 1.487 5.413 1.00 0.00
HETATM 43 Al UNK 0 1 -0.000 -2.748 2.408 1.00 0.00
HETATM 44 O UNK 0 1 0.924 1.374 1.083 1.00 0.00
HETATM 45 O UNK 0 1 0.728 -1.487 1.083 1.00 0.00
HETATM 46 O UNK 0 1 -1.652 0.113 1.083 1.00 0.00
HETATM 47 Al UNK 0 1 4.759 0.000 4.573 1.00 0.00
HETATM 48 O UNK 0 1 4.031 -1.261 3.248 1.00 0.00
HETATM 49 Al UNK 0 1 4.759 0.000 1.923 1.00 0.00
HETATM 50 O UNK 0 1 6.215 0.000 3.248 1.00 0.00
HETATM 51 O UNK 0 1 4.031 1.261 3.248 1.00 0.00
HETATM 52 O UNK 0 1 3.107 -0.113 5.413 1.00 0.00
HETATM 53 Al UNK 0 1 7.138 -1.374 4.088 1.00 0.00
HETATM 54 O UNK 0 1 5.683 -1.374 5.413 1.00 0.00
HETATM 55 O UNK 0 1 5.487 1.487 5.413 1.00 0.00
HETATM 56 Al UNK 0 1 4.759 -2.748 2.408 1.00 0.00
HETATM 57 Al UNK 0 1 7.138 1.374 2.408 1.00 0.00
HETATM 58 O UNK 0 1 5.683 1.374 1.083 1.00 0.00
HETATM 59 O UNK 0 1 5.487 -1.487 1.083 1.00 0.00
HETATM 60 O UNK 0 1 3.107 0.113 1.083 1.00 0.00
HETATM 61 Al UNK 0 1 -0.000 2.748 13.234 1.00 0.00
HETATM 62 O UNK 0 1 1.456 2.748 11.909 1.00 0.00
HETATM 63 Al UNK 0 1 -0.000 2.748 10.583 1.00 0.00
HETATM 64 O UNK 0 1 -0.728 4.008 11.909 1.00 0.00
HETATM 65 O UNK 0 1 -0.728 1.487 11.909 1.00 0.00
HETATM 66 Al UNK 0 1 -2.379 1.374 12.749 1.00 0.00
HETATM 67 Al UNK 0 1 2.379 1.374 12.749 1.00 0.00
HETATM 68 O UNK 0 1 0.924 1.374 14.074 1.00 0.00
HETATM 69 Al UNK 0 1 -0.000 5.495 12.749 1.00 0.00
HETATM 70 O UNK 0 1 0.728 4.234 14.074 1.00 0.00
HETATM 71 O UNK 0 1 -1.652 2.634 14.074 1.00 0.00
HETATM 72 Al UNK 0 1 2.379 4.121 11.069 1.00 0.00
HETATM 73 Al UNK 0 1 0.000 0.000 11.069 1.00 0.00
HETATM 74 Al UNK 0 1 -2.379 4.121 11.069 1.00 0.00
HETATM 75 O UNK 0 1 -1.652 2.861 9.743 1.00 0.00
HETATM 76 O UNK 0 1 0.924 4.121 9.743 1.00 0.00
HETATM 77 O UNK 0 1 0.728 1.261 9.743 1.00 0.00
HETATM 78 Al UNK 0 1 2.379 1.374 8.903 1.00 0.00
HETATM 79 O UNK 0 1 3.835 1.374 7.578 1.00 0.00
HETATM 80 Al UNK 0 1 2.379 1.374 6.253 1.00 0.00
HETATM 81 O UNK 0 1 1.652 2.634 7.578 1.00 0.00
HETATM 82 O UNK 0 1 1.652 0.113 7.578 1.00 0.00
HETATM 83 Al UNK 0 1 0.000 0.000 8.418 1.00 0.00
HETATM 84 Al UNK 0 1 4.759 0.000 8.418 1.00 0.00
HETATM 85 O UNK 0 1 3.303 0.000 9.743 1.00 0.00
HETATM 86 Al UNK 0 1 2.379 4.121 8.418 1.00 0.00
HETATM 87 O UNK 0 1 3.107 2.861 9.743 1.00 0.00
HETATM 88 Al UNK 0 1 4.759 2.748 6.738 1.00 0.00
HETATM 89 Al UNK 0 1 2.379 -1.374 6.738 1.00 0.00
HETATM 90 Al UNK 0 1 0.000 2.748 6.738 1.00 0.00
HETATM 91 O UNK 0 1 -1.456 0.000 9.743 1.00 0.00
HETATM 92 O UNK 0 1 0.728 -1.261 9.743 1.00 0.00
HETATM 93 Al UNK 0 1 -2.379 1.374 8.903 1.00 0.00
HETATM 94 O UNK 0 1 -0.924 1.374 7.578 1.00 0.00
HETATM 95 Al UNK 0 1 0.000 -2.748 8.903 1.00 0.00
HETATM 96 O UNK 0 1 -0.728 -1.487 7.578 1.00 0.00
HETATM 97 Al UNK 0 1 -2.379 -1.374 10.583 1.00 0.00
HETATM 98 Al UNK 0 1 2.379 -1.374 10.583 1.00 0.00
HETATM 99 O UNK 0 1 1.652 -0.113 11.909 1.00 0.00
HETATM 100 O UNK 0 1 -0.924 -1.374 11.909 1.00 0.00
HETATM 101 Al UNK 0 1 -2.379 4.121 8.418 1.00 0.00
HETATM 102 O UNK 0 1 -3.835 4.121 9.743 1.00 0.00
HETATM 103 O UNK 0 1 -1.652 5.382 9.743 1.00 0.00
HETATM 104 Al UNK 0 1 0.000 5.495 8.903 1.00 0.00
HETATM 105 Al UNK 0 1 -4.759 5.495 8.903 1.00 0.00
HETATM 106 O UNK 0 1 -3.303 5.495 7.578 1.00 0.00
HETATM 107 O UNK 0 1 -3.107 2.634 7.578 1.00 0.00
HETATM 108 O UNK 0 1 -0.728 4.234 7.578 1.00 0.00
HETATM 109 Al UNK 0 1 -4.759 2.748 10.583 1.00 0.00
HETATM 110 Al UNK 0 1 -2.379 6.869 10.583 1.00 0.00
HETATM 111 O UNK 0 1 -3.303 2.748 11.909 1.00 0.00
HETATM 112 O UNK 0 1 -3.107 5.608 11.909 1.00 0.00
HETATM 113 Al UNK 0 1 4.759 0.000 11.069 1.00 0.00
HETATM 114 O UNK 0 1 5.487 -1.261 9.743 1.00 0.00
HETATM 115 O UNK 0 1 5.487 1.261 9.743 1.00 0.00
HETATM 116 Al UNK 0 1 7.138 1.374 8.903 1.00 0.00
HETATM 117 Al UNK 0 1 4.759 -2.748 8.903 1.00 0.00
HETATM 118 O UNK 0 1 4.031 -1.487 7.578 1.00 0.00
HETATM 119 O UNK 0 1 6.410 0.113 7.578 1.00 0.00
HETATM 120 Al UNK 0 1 4.759 2.748 10.583 1.00 0.00
HETATM 121 Al UNK 0 1 7.138 -1.374 10.583 1.00 0.00
HETATM 122 O UNK 0 1 6.410 -0.113 11.909 1.00 0.00
HETATM 123 O UNK 0 1 3.835 -1.374 11.909 1.00 0.00
HETATM 124 O UNK 0 1 4.031 1.487 11.909 1.00 0.00
HETATM 125 O UNK 0 1 3.107 5.382 9.743 1.00 0.00
HETATM 126 Al UNK 0 1 4.759 5.495 8.903 1.00 0.00
HETATM 127 O UNK 0 1 1.456 5.495 7.578 1.00 0.00
HETATM 128 O UNK 0 1 4.031 4.234 7.578 1.00 0.00
HETATM 129 Al UNK 0 1 2.379 6.869 10.583 1.00 0.00
HETATM 130 O UNK 0 1 4.031 4.008 11.909 1.00 0.00
HETATM 131 O UNK 0 1 1.652 5.608 11.909 1.00 0.00
HETATM 132 Al UNK 0 1 -2.379 1.374 6.253 1.00 0.00
HETATM 133 Al UNK 0 1 -0.000 5.495 6.253 1.00 0.00
HETATM 134 Al UNK 0 1 2.379 1.374 -0.243 1.00 0.00
HETATM 135 Al UNK 0 1 4.759 2.748 0.243 1.00 0.00
HETATM 136 Al UNK 0 1 0.000 2.748 0.243 1.00 0.00
HETATM 137 O UNK 0 1 1.456 2.748 -1.083 1.00 0.00
HETATM 138 Al UNK 0 1 2.379 -1.374 0.243 1.00 0.00
HETATM 139 O UNK 0 1 1.652 -0.113 -1.083 1.00 0.00
HETATM 140 O UNK 0 1 4.031 1.487 -1.083 1.00 0.00
CONECT 1 2 3 4
CONECT 2 3 7 12
CONECT 3 4 5 12
CONECT 4 9 14
CONECT 5 1 6 13
CONECT 6 1 11 18
CONECT 7 1 47 51
CONECT 8 1 80
CONECT 9 1
CONECT 10 1
CONECT 11 1 90 133
CONECT 12
CONECT 13 3 17 35
CONECT 14 3 20 22
CONECT 15 3
CONECT 16 3
CONECT 17 3 134 135
CONECT 18 19 20 21
CONECT 19 20 23 28
CONECT 20 21 22 28
CONECT 21 25 29
CONECT 22 6 18
CONECT 23 18
CONECT 24 18
CONECT 25 18
CONECT 26 18
CONECT 27 6 18 90
CONECT 28
CONECT 29 20 35 37
CONECT 30 20
CONECT 31 20
CONECT 32 20
CONECT 33 6 34 35
CONECT 34 35 38 43
CONECT 35 36 37 43
CONECT 36 13 33 40
CONECT 37 6 33
CONECT 38 33
CONECT 39 33
CONECT 40 33 47 48
CONECT 41 33
CONECT 42 6 33 80
CONECT 43
CONECT 44 13 35 134
CONECT 45 35
CONECT 46 35
CONECT 47 48 49 50
CONECT 48 49 56
CONECT 49 13 50 51
CONECT 50 53 57
CONECT 51 13 47
CONECT 52 47 80
CONECT 53 47
CONECT 54 47
CONECT 55 47
CONECT 56 49
CONECT 57 49
CONECT 58 49
CONECT 59 49
CONECT 60 13 49 134
CONECT 61 62 63 64
CONECT 62 63 67 72
CONECT 63 64 65 72
CONECT 64 69 74
CONECT 65 61 66 73
CONECT 66 61
CONECT 67 61
CONECT 68 61
CONECT 69 61
CONECT 70 61
CONECT 71 61
CONECT 72 76 86 87
CONECT 73 63 77 83
CONECT 74 63 75 101
CONECT 75 63 93 101
CONECT 76 63 86 104
CONECT 77 63 78 83
CONECT 78 79 80 81
CONECT 79 80 84 88
CONECT 80 81 82 88
CONECT 81 86 90
CONECT 82 78 83 89
CONECT 83 78 91 92
CONECT 84 78 85 113
CONECT 85 78 98 113
CONECT 86 78 87 104
CONECT 87 78 120
CONECT 88
CONECT 89 80
CONECT 90 6 42 80
CONECT 91 73 93 97
CONECT 92 73 95 98
CONECT 93 83 101
CONECT 94 83 90
CONECT 95 83
CONECT 96 83
CONECT 97 73
CONECT 98 73 113
CONECT 99 73
CONECT 100 73
CONECT 101 102 103 104
CONECT 102 74 105 109
CONECT 103 74 104 110
CONECT 104
CONECT 105 101
CONECT 106 101
CONECT 107 101
CONECT 108 90 101
CONECT 109 74
CONECT 110 74
CONECT 111 74
CONECT 112 74
CONECT 113 114 115 120
CONECT 114 84 117 121
CONECT 115 84 116 120
CONECT 116 84
CONECT 117 84
CONECT 118 84
CONECT 119 84
CONECT 120 72
CONECT 121 113
CONECT 122 113
CONECT 123 113
CONECT 124 113
CONECT 125 72 86 126
CONECT 126 86
CONECT 127 86
CONECT 128 86
CONECT 129 72 125
CONECT 130 72
CONECT 131 72
CONECT 132 27 90
CONECT 133 90
CONECT 134 13 135 136
CONECT 135
CONECT 136 44
CONECT 137 134
CONECT 138 60 134
CONECT 139 134
CONECT 140 134
MASTER 0 0 0 0 0 0 0 0 3 140 0 140 0
END
HEADER NONAME 22-Apr-10 NONE 1
TITLE NONE 2
AUTHOR Chemical Structure Services at http://cactus.nci.nih.gov NONE 3
REVDAT 1 22-Apr-10 0 NONE 4
ATOM 1 C 0 2.154 1.017 -0.012 0.00 0.00 C+0
ATOM 2 C 0 -0.545 1.675 0.087 0.00 0.00 C+0
ATOM 3 C 0 1.761 2.338 0.015 0.00 0.00 C+0
ATOM 4 C 0 0.416 2.666 0.064 0.00 0.00 C+0
ATOM 5 C 0 -3.466 -1.377 0.133 0.00 0.00 C+0
ATOM 6 C 0 1.192 0.004 0.010 0.00 0.00 C+0
ATOM 7 C 0 -0.168 0.341 0.060 0.00 0.00 C+0
ATOM 8 O 0 0.765 -2.290 -0.001 0.00 0.00 O+0
ATOM 9 O 0 -2.733 0.825 -0.277 0.00 0.00 O+0
ATOM 10 O 0 2.912 -1.731 -0.067 0.00 0.00 O+0
ATOM 11 C 0 1.604 -1.411 -0.019 0.00 0.00 C+0
ATOM 12 C 0 -2.411 -0.315 -0.036 0.00 0.00 C+0
ATOM 13 O 0 -1.112 -0.634 0.081 0.00 0.00 O+0
ATOM 14 H 0 3.183 -2.659 -0.086 0.00 0.00 H+0
ATOM 15 H 0 3.203 0.765 -0.054 0.00 0.00 H+0
ATOM 16 H 0 -1.591 1.939 0.125 0.00 0.00 H+0
ATOM 17 H 0 2.506 3.120 -0.002 0.00 0.00 H+0
ATOM 18 H 0 0.118 3.704 0.085 0.00 0.00 H+0
ATOM 19 H 0 -3.762 -1.431 1.181 0.00 0.00 H+0
ATOM 20 H 0 -4.334 -1.127 -0.477 0.00 0.00 H+0
ATOM 21 H 0 -3.066 -2.340 -0.182 0.00 0.00 H+0
CONECT 1 6 3 15 0 NONE 26
CONECT 2 7 4 16 0 NONE 27
CONECT 3 1 4 17 0 NONE 28
CONECT 4 2 3 18 0 NONE 29
CONECT 5 12 19 20 21 NONE 30
CONECT 6 7 1 11 0 NONE 31
CONECT 7 6 2 13 0 NONE 32
CONECT 8 11 0 0 0 NONE 33
CONECT 9 12 0 0 0 NONE 34
CONECT 10 11 14 0 0 NONE 35
CONECT 11 6 10 8 0 NONE 36
CONECT 12 13 5 9 0 NONE 37
CONECT 13 7 12 0 0 NONE 38
END NONE 39
COMPND bucky.pdb
HETATM 1 C -3.4306 0.3484 0.3630
HETATM 2 C -3.1790 1.1810 -0.7334
HETATM 3 C -2.9160 0.3690 -1.8427
HETATM 4 C -3.0048 -0.9660 -1.4314
HETATM 5 C -3.3229 -0.9791 -0.0682
HETATM 6 C -1.9449 0.7442 -2.7732
HETATM 7 C -1.2332 1.9362 -2.5954
HETATM 8 C -1.4944 2.7485 -1.4902
HETATM 9 C -2.4680 2.3700 -0.5585
HETATM 10 C -2.0114 2.7298 0.7143
HETATM 11 C -2.2640 1.9005 1.8090
HETATM 12 C -2.9745 0.7074 1.6331
HETATM 13 C -2.4129 -0.2585 2.4753
HETATM 14 C -2.3071 -1.5829 2.0466
HETATM 15 C -2.7627 -1.9425 0.7730
HETATM 16 C -1.8823 -2.8972 0.2521
HETATM 17 C -1.5635 -2.8861 -1.1071
HETATM 18 C -2.1254 -1.9193 -1.9490
HETATM 19 C -1.1533 -1.5397 -2.8812
HETATM 20 C -1.0615 -0.2088 -3.2934
HETATM 21 C 0.0879 1.7218 -3.0046
HETATM 22 C -0.4365 3.3422 -0.7917
HETATM 23 C -0.7555 3.3307 0.5716
HETATM 24 C -1.2619 1.6696 2.7586
HETATM 25 C -1.3534 0.3346 3.1711
HETATM 26 C -1.1426 -2.3137 2.3104
HETATM 27 C -0.8795 -3.1267 1.2011
HETATM 28 C -0.2429 -3.1010 -1.5184
HETATM 29 C 0.0114 -2.2689 -2.6155
HETATM 30 C 0.1936 0.3941 -3.4362
HETATM 31 C 3.3266 0.9826 0.0695
HETATM 32 C 3.0096 0.9706 1.4326
HETATM 33 C 2.9177 -0.3640 1.8443
HETATM 34 C 3.1778 -1.1770 0.7349
HETATM 35 C 3.4306 -0.3451 -0.3621
HETATM 36 C 1.9473 -0.7475 2.7721
HETATM 37 C 1.0645 0.2062 3.2916
HETATM 38 C 1.1547 1.5385 2.8834
HETATM 39 C 2.1280 1.9203 1.9528
HETATM 40 C 1.5657 2.8862 1.1107
HETATM 41 C 1.8834 2.9000 -0.2489
HETATM 42 C 2.7651 1.9463 -0.7707
HETATM 43 C 2.3092 1.5866 -2.0437
HETATM 44 C 2.4144 0.2631 -2.4755
HETATM 45 C 2.9758 -0.7031 -1.6328
HETATM 46 C 2.2666 -1.8962 -1.8100
HETATM 47 C 2.0133 -2.7276 -0.7172
HETATM 48 C 2.4693 -2.3670 0.5560
HETATM 49 C 1.4973 -2.7481 1.4877
HETATM 50 C 1.2349 -1.9394 2.5952
HETATM 51 C -0.1917 -0.3936 3.4362
HETATM 52 C -0.0088 2.2691 2.6153
HETATM 53 C 0.2447 3.1026 1.5191
HETATM 54 C 0.8815 3.1269 -1.2000
HETATM 55 C 1.1442 2.3150 -2.3100
HETATM 56 C 1.3558 -0.3333 -3.1706
HETATM 57 C 1.2640 -1.6687 -2.7595
HETATM 58 C 0.7577 -3.3290 -0.5712
HETATM 59 C 0.4382 -3.3422 0.7920
HETATM 60 C -0.0856 -1.7214 3.0049
CONECT 1 2 5 12
CONECT 2 1 3 9
CONECT 3 2 4 6
CONECT 4 3 5 18
CONECT 5 1 4 15
CONECT 6 3 7 20
CONECT 7 6 8 21
CONECT 8 7 9 22
CONECT 9 2 8 10
CONECT 10 9 11 23
CONECT 11 10 12 24
CONECT 12 1 11 13
CONECT 13 12 14 25
CONECT 14 13 15 26
CONECT 15 5 14 16
CONECT 16 15 17 27
CONECT 17 16 18 28
CONECT 18 4 17 19
CONECT 19 18 20 29
CONECT 20 6 19 30
CONECT 21 7 30 55
CONECT 22 8 23 54
CONECT 23 10 22 53
CONECT 24 11 25 52
CONECT 25 13 24 51
CONECT 26 14 27 60
CONECT 27 16 26 59
CONECT 28 17 29 58
CONECT 29 19 28 57
CONECT 30 20 21 56
CONECT 31 32 35 42
CONECT 32 31 33 39
CONECT 33 32 34 36
CONECT 34 33 35 48
CONECT 35 31 34 45
CONECT 36 33 37 50
CONECT 37 36 38 51
CONECT 38 37 39 52
CONECT 39 32 38 40
CONECT 40 39 41 53
CONECT 41 40 42 54
CONECT 42 31 41 43
CONECT 43 42 44 55
CONECT 44 43 45 56
CONECT 45 35 44 46
CONECT 46 45 47 57
CONECT 47 46 48 58
CONECT 48 34 47 49
CONECT 49 48 50 59
CONECT 50 36 49 60
CONECT 51 25 37 60
CONECT 52 24 38 53
CONECT 53 23 40 52
CONECT 54 22 41 55
CONECT 55 21 43 54
CONECT 56 30 44 57
CONECT 57 29 46 56
CONECT 58 28 47 59
CONECT 59 27 49 58
CONECT 60 26 50 51
END
HEADER MOLECULE
COMPND CAF2 (FLUORITE), VIEW CENTERED ON ANIONS
AUTHOR A. W. MAVERICK
ATOM 1 F UNK 1 -1.366 -1.366 -1.366 1.00 0.00
ATOM 2 F UNK 1 -1.366 -1.366 1.366 1.00 0.00
ATOM 3 F UNK 1 -1.366 1.366 -1.366 1.00 0.00
ATOM 4 F UNK 1 -1.366 1.366 1.366 1.00 0.00
ATOM 5 F UNK 1 1.366 -1.366 -1.366 1.00 0.00
ATOM 6 F UNK 1 1.366 -1.366 1.366 1.00 0.00
ATOM 7 F UNK 1 1.366 1.366 -1.366 1.00 0.00
ATOM 8 F UNK 1 1.366 1.366 1.366 1.00 0.00
ATOM 9 CA UNK 1 -2.732 -2.732 -2.732 1.00 0.00
ATOM 10 CA UNK 1 0.000 0.000 -2.732 1.00 0.00
ATOM 11 CA UNK 1 0.000 -2.732 0.000 1.00 0.00
ATOM 12 CA UNK 1 -2.732 0.000 0.000 1.00 0.00
ATOM 13 CA UNK 1 -2.732 -2.732 2.732 1.00 0.00
ATOM 14 CA UNK 1 0.000 0.000 2.732 1.00 0.00
ATOM 15 CA UNK 1 -2.732 2.732 -2.732 1.00 0.00
ATOM 16 CA UNK 1 0.000 2.732 0.000 1.00 0.00
ATOM 17 CA UNK 1 -2.732 2.732 2.732 1.00 0.00
ATOM 18 CA UNK 1 2.732 -2.732 -2.732 1.00 0.00
ATOM 19 CA UNK 1 2.732 0.000 0.000 1.00 0.00
ATOM 20 CA UNK 1 2.732 -2.732 2.732 1.00 0.00
ATOM 21 CA UNK 1 2.732 2.732 -2.732 1.00 0.00
ATOM 22 CA UNK 1 2.732 2.732 2.732 1.00 0.00
CONECT 1 9 10 11 12
CONECT 2 11 12 13 14
CONECT 3 10 12 15 16
CONECT 4 12 14 16 17
CONECT 5 10 11 18 19
CONECT 6 11 14 19 20
CONECT 7 10 16 19 21
CONECT 8 14 16 19 22
CONECT 9 1
CONECT 10 1 3 5 7
CONECT 11 1 2 5 6
CONECT 12 1 2 3 4
CONECT 13 2
CONECT 14 2 4 6 8
CONECT 15 3
CONECT 16 3 4 7 8
CONECT 17 4
CONECT 18 5
CONECT 19 5 6 7 8
CONECT 20 6
CONECT 21 7
CONECT 22 8
MASTER 0 0 0 0 0 0 0 0 22 0 22 0
END
HEADER NONAME 22-Apr-10 NONE 1
TITLE NONE 2
AUTHOR Chemical Structure Services at http://cactus.nci.nih.gov NONE 3
REVDAT 1 22-Apr-10 0 NONE 4
ATOM 1 C 0 -2.561 1.251 -0.000 0.00 0.00 C+0
ATOM 2 C 0 -3.261 -1.161 -0.000 0.00 0.00 C+0
ATOM 3 C 0 1.534 2.629 0.000 0.00 0.00 C+0
ATOM 4 C 0 2.247 -2.176 -0.000 0.00 0.00 C+0
ATOM 5 O 0 -0.438 -2.428 0.000 0.00 0.00 O+0
ATOM 6 O 0 2.994 0.384 0.000 0.00 0.00 O+0
ATOM 7 C 0 -0.016 -1.285 -0.000 0.00 0.00 C+0
ATOM 8 C 0 1.791 0.208 0.000 0.00 0.00 C+0
ATOM 9 C 0 -0.911 -0.194 -0.000 0.00 0.00 C+0
ATOM 10 C 0 -0.403 1.099 -0.000 0.00 0.00 C+0
ATOM 11 N 0 -1.445 1.934 -0.000 0.00 0.00 N+0
ATOM 12 N 0 0.971 1.277 -0.000 0.00 0.00 N+0
ATOM 13 N 0 1.312 -1.048 -0.000 0.00 0.00 N+0
ATOM 14 N 0 -2.286 -0.068 0.000 0.00 0.00 N+0
ATOM 15 H 0 -3.552 1.680 0.004 0.00 0.00 H+0
ATOM 16 H 0 -3.503 -1.433 1.028 0.00 0.00 H+0
ATOM 17 H 0 -4.168 -0.840 -0.514 0.00 0.00 H+0
ATOM 18 H 0 -2.839 -2.025 -0.514 0.00 0.00 H+0
ATOM 19 H 0 1.673 2.965 1.028 0.00 0.00 H+0
ATOM 20 H 0 2.495 2.623 -0.514 0.00 0.00 H+0
ATOM 21 H 0 0.851 3.307 -0.514 0.00 0.00 H+0
ATOM 22 H 0 2.478 -2.456 -1.028 0.00 0.00 H+0
ATOM 23 H 0 3.164 -1.888 0.513 0.00 0.00 H+0
ATOM 24 H 0 1.793 -3.024 0.514 0.00 0.00 H+0
CONECT 1 14 11 15 0 NONE 29
CONECT 2 14 16 17 18 NONE 30
CONECT 3 12 19 20 21 NONE 31
CONECT 4 13 22 23 24 NONE 32
CONECT 5 7 0 0 0 NONE 33
CONECT 6 8 0 0 0 NONE 34
CONECT 7 9 13 5 0 NONE 35
CONECT 8 12 6 13 0 NONE 36
CONECT 9 10 7 14 0 NONE 37
CONECT 10 9 12 11 0 NONE 38
CONECT 11 10 1 0 0 NONE 39
CONECT 12 10 8 3 0 NONE 40
CONECT 13 7 4 8 0 NONE 41
CONECT 14 9 1 2 0 NONE 42
END NONE 43
ORIGX1 1.000000 0.000000 0.000000 0.00000
ORIGX2 0.000000 1.000000 0.000000 0.00000
ORIGX3 0.000000 0.000000 1.000000 0.00000
SCALE1 0.100000 0.000000 0.000000 0.00000
SCALE2 0.000000 0.100000 0.000000 0.00000
SCALE3 0.000000 0.000000 0.100000 0.00000
ATOM 1 C 1 -7.323 0.716 -5.120 1.00 0.00
ATOM 2 C 1 -8.580 0.025 -4.537 1.00 0.00
ATOM 3 C 1 -9.814 0.931 -4.416 1.00 0.00
ATOM 4 C 1 -9.476 2.171 -3.582 1.00 0.00
ATOM 5 O 1 -10.603 3.009 -3.488 1.00 0.00
ATOM 6 C 1 -7.105 2.022 -4.368 1.00 0.00
ATOM 7 C 1 -8.298 2.936 -4.191 1.00 0.00
ATOM 8 H 1 -9.230 1.870 -2.536 1.00 0.00
ATOM 9 H 1 -10.862 3.297 -4.348 1.00 0.00
ATOM 10 H 1 -10.173 1.239 -5.425 1.00 0.00
ATOM 11 H 1 -10.653 0.372 -3.935 1.00 0.00
ATOM 12 C 1 -5.905 2.409 -3.906 1.00 0.00
ATOM 13 C 1 -4.641 1.613 -4.039 1.00 0.00
ATOM 14 H 1 -8.856 -0.863 -5.151 1.00 0.00
ATOM 15 H 1 -8.349 -0.350 -3.512 1.00 0.00
ATOM 16 H 1 -8.053 3.806 -3.539 1.00 0.00
ATOM 17 H 1 -8.589 3.360 -5.178 1.00 0.00
ATOM 18 C 1 -7.556 1.063 -6.606 1.00 0.00
ATOM 19 H 1 -6.656 1.519 -7.073 1.00 0.00
ATOM 20 H 1 -7.847 0.176 -7.211 1.00 0.00
ATOM 21 H 1 -8.382 1.793 -6.753 1.00 0.00
ATOM 22 C 1 -6.098 -0.229 -4.938 1.00 0.00
ATOM 23 C 1 -4.758 0.515 -5.105 1.00 0.00
ATOM 24 H 1 -3.807 2.303 -4.306 1.00 0.00
ATOM 25 H 1 -4.416 1.181 -3.036 1.00 0.00
ATOM 26 H 1 -6.101 -0.569 -3.874 1.00 0.00
ATOM 27 H 1 -4.726 1.004 -6.104 1.00 0.00
ATOM 28 C 1 -6.149 -1.518 -5.786 1.00 0.00
ATOM 29 C 1 -3.583 -0.466 -4.987 1.00 0.00
ATOM 30 C 1 -3.610 -1.635 -5.997 1.00 0.00
ATOM 31 C 1 -4.900 -2.410 -5.665 1.00 0.00
ATOM 32 H 1 -7.038 -2.128 -5.500 1.00 0.00
ATOM 33 H 1 -6.283 -1.269 -6.861 1.00 0.00
ATOM 34 H 1 -4.850 -2.821 -4.629 1.00 0.00
ATOM 35 H 1 -5.024 -3.287 -6.338 1.00 0.00
ATOM 36 H 1 -3.640 -0.901 -3.959 1.00 0.00
ATOM 37 C 1 -3.594 -1.172 -7.468 1.00 0.00
ATOM 38 H 1 -3.716 -2.030 -8.165 1.00 0.00
ATOM 39 H 1 -4.409 -0.460 -7.718 1.00 0.00
ATOM 40 H 1 -2.644 -0.664 -7.746 1.00 0.00
ATOM 41 C 1 -2.273 -2.341 -5.642 1.00 0.00
ATOM 42 C 1 -1.314 -1.155 -5.356 1.00 0.00
ATOM 43 C 1 -2.169 0.102 -5.114 1.00 0.00
ATOM 44 H 1 -0.681 -1.369 -4.463 1.00 0.00
ATOM 45 H 1 -0.630 -0.965 -6.217 1.00 0.00
ATOM 46 H 1 -2.116 0.800 -5.982 1.00 0.00
ATOM 47 H 1 -1.847 0.664 -4.206 1.00 0.00
ATOM 48 H 1 -2.438 -2.878 -4.677 1.00 0.00
ATOM 49 C 1 -1.661 -3.375 -6.619 1.00 0.00
ATOM 50 C 1 -2.627 -4.529 -6.939 1.00 0.00
ATOM 51 C 1 -0.337 -3.949 -6.059 1.00 0.00
ATOM 52 C 1 0.515 -4.714 -7.088 1.00 0.00
ATOM 53 C 1 1.887 -5.111 -6.518 1.00 0.00
ATOM 54 C 1 2.733 -5.984 -7.466 1.00 0.00
ATOM 55 C 1 4.014 -6.450 -6.753 1.00 0.00
ATOM 56 C 1 3.101 -5.250 -8.766 1.00 0.00
ATOM 57 H 1 -2.156 -5.315 -7.569 1.00 0.00
ATOM 58 H 1 -2.994 -5.018 -6.008 1.00 0.00
ATOM 59 H 1 -3.504 -4.190 -7.530 1.00 0.00
ATOM 60 H 1 0.302 -3.122 -5.677 1.00 0.00
ATOM 61 H 1 -0.560 -4.605 -5.185 1.00 0.00
ATOM 62 H 1 -0.009 -5.640 -7.418 1.00 0.00
ATOM 63 H 1 0.654 -4.067 -7.985 1.00 0.00
ATOM 64 H 1 4.625 -7.113 -7.409 1.00 0.00
ATOM 65 H 1 4.650 -5.583 -6.461 1.00 0.00
ATOM 66 H 1 3.779 -7.028 -5.830 1.00 0.00
ATOM 67 H 1 3.761 -5.877 -9.409 1.00 0.00
ATOM 68 H 1 2.201 -5.009 -9.377 1.00 0.00
ATOM 69 H 1 3.639 -4.299 -8.553 1.00 0.00
ATOM 70 H 1 2.141 -6.894 -7.733 1.00 0.00
ATOM 71 H 1 2.463 -4.192 -6.255 1.00 0.00
ATOM 72 H 1 1.720 -5.673 -5.569 1.00 0.00
ATOM 73 H 1 -1.419 -2.850 -7.574 1.00 0.00
ATOM 74 H 1 -5.813 3.367 -3.367 1.00 0.00
TER 75
CONECT 1 2
CONECT 2 1
CONECT 2 3
CONECT 3 2
CONECT 3 4
CONECT 4 3
CONECT 4 5
CONECT 5 4
CONECT 1 6
CONECT 6 1
CONECT 6 7
CONECT 7 6
CONECT 7 4
CONECT 4 7
CONECT 4 8
CONECT 8 4
CONECT 5 9
CONECT 9 5
CONECT 3 10
CONECT 10 3
CONECT 3 11
CONECT 11 3
CONECT 6 12
CONECT 12 6
CONECT 12 13
CONECT 13 12
CONECT 2 14
CONECT 14 2
CONECT 2 15
CONECT 15 2
CONECT 7 16
CONECT 16 7
CONECT 7 17
CONECT 17 7
CONECT 1 18
CONECT 18 1
CONECT 18 19
CONECT 19 18
CONECT 18 20
CONECT 20 18
CONECT 18 21
CONECT 21 18
CONECT 1 22
CONECT 22 1
CONECT 22 23
CONECT 23 22
CONECT 23 13
CONECT 13 23
CONECT 13 24
CONECT 24 13
CONECT 13 25
CONECT 25 13
CONECT 22 26
CONECT 26 22
CONECT 23 27
CONECT 27 23
CONECT 22 28
CONECT 28 22
CONECT 23 29
CONECT 29 23
CONECT 29 30
CONECT 30 29
CONECT 28 31
CONECT 31 28
CONECT 31 30
CONECT 30 31
CONECT 28 32
CONECT 32 28
CONECT 28 33
CONECT 33 28
CONECT 31 34
CONECT 34 31
CONECT 31 35
CONECT 35 31
CONECT 29 36
CONECT 36 29
CONECT 30 37
CONECT 37 30
CONECT 37 38
CONECT 38 37
CONECT 37 39
CONECT 39 37
CONECT 37 40
CONECT 40 37
CONECT 30 41
CONECT 41 30
CONECT 41 42
CONECT 42 41
CONECT 42 43
CONECT 43 42
CONECT 43 29
CONECT 29 43
CONECT 42 44
CONECT 44 42
CONECT 42 45
CONECT 45 42
CONECT 43 46
CONECT 46 43
CONECT 43 47
CONECT 47 43
CONECT 41 48
CONECT 48 41
CONECT 41 49
CONECT 49 41
CONECT 49 50
CONECT 50 49
CONECT 49 51
CONECT 51 49
CONECT 51 52
CONECT 52 51
CONECT 52 53
CONECT 53 52
CONECT 53 54
CONECT 54 53
CONECT 54 55
CONECT 55 54
CONECT 54 56
CONECT 56 54
CONECT 50 57
CONECT 57 50
CONECT 50 58
CONECT 58 50
CONECT 50 59
CONECT 59 50
CONECT 51 60
CONECT 60 51
CONECT 51 61
CONECT 61 51
CONECT 52 62
CONECT 62 52
CONECT 52 63
CONECT 63 52
CONECT 55 64
CONECT 64 55
CONECT 55 65
CONECT 65 55
CONECT 55 66
CONECT 66 55
CONECT 56 67
CONECT 67 56
CONECT 56 68
CONECT 68 56
CONECT 56 69
CONECT 69 56
CONECT 54 70
CONECT 70 54
CONECT 53 71
CONECT 71 53
CONECT 53 72
CONECT 72 53
CONECT 49 73
CONECT 73 49
CONECT 12 74
CONECT 74 12
MASTER 0 0 0 0 0 0 0 6 74 1 154 0
END
COMPND
REMARK 1 PDB to MMOD atom-numbering translation table; the mmod numbers
REMARK 1 pertain to the .dat file from which this file was created,
REMARK 1 not to one created from this file:
REMARK 1 PDB: 1 2 3 4 5 6 7 8 9
REMARK 1 MMOD: 1 2 3 4 5 6 7 8 19 /
REMARK 1 PDB: 10 11 12 13 14 15 16 17 18
REMARK 1 MMOD: 23 24 25 26 30 31 32 33 34 /
REMARK 1 PDB: 19 20 21 22 23 24 25 26 27
REMARK 1 MMOD: 35 36 37 38 9 10 11 12 13 /
REMARK 1 PDB: 28 29 30 31 32 33 34 35 36
REMARK 1 MMOD: 14 15 16 17 18 20 21 22 27 /
REMARK 1 PDB: 37 38 39 40 41 42 43
REMARK 1 MMOD: 28 29 39 40 41 42 43 /
HETATM 1 C01 UNK 0 -0.579 -1.681 0.616 0.00 0.00 0
HETATM 2 C02 UNK 0 -1.566 0.560 -0.170 0.04 0.04 0
HETATM 3 C03 UNK 0 -1.162 1.032 1.249 0.01 0.01 0
HETATM 4 C04 UNK 0 -2.199 0.552 2.293 0.00 0.00 0
HETATM 5 C05 UNK 0 -1.649 -0.811 2.760 0.00 0.00 0
HETATM 6 C06 UNK 0 -0.340 -0.968 1.960 0.01 0.01 0
HETATM 7 N07 UNK 0 0.044 0.417 1.782 0.19 0.19 0
HETATM 8 C08 UNK 0 -1.653 -0.989 -0.246 0.07 0.07 0
HETATM 9 C19 UNK 0 1.272 0.616 1.044 0.01 0.01 0
HETATM 10 C23 UNK 0 -0.901 1.274 -1.354 0.38 0.38 0
HETATM 11 O24 UNK 0 -0.195 2.368 -0.946 0.59 0.59 0
HETATM 12 O25 UNK 0 -1.037 0.929 -2.512 -0.45 -0.45 0
HETATM 13 C26 UNK 0 0.440 3.093 -1.986 0.07 0.07 0
HETATM 14 O30 UNK 0 -1.609 -1.430 -1.593 0.59 0.59 0
HETATM 15 C31 UNK 0 -1.789 -2.754 -1.882 0.42 0.42 0
HETATM 16 O32 UNK 0 -2.125 -3.580 -1.053 -0.45 -0.45 0
HETATM 17 C33 UNK 0 -1.523 -3.209 -3.279 0.00 0.00 0
HETATM 18 C34 UNK 0 -0.997 -2.329 -4.230 0.00 0.00 0
HETATM 19 C35 UNK 0 -0.765 -2.755 -5.540 0.00 0.00 0
HETATM 20 C36 UNK 0 -1.059 -4.064 -5.914 0.00 0.00 0
HETATM 21 C37 UNK 0 -1.581 -4.946 -4.971 0.00 0.00 0
HETATM 22 C38 UNK 0 -1.813 -4.523 -3.662 0.00 0.00 0
HETATM 23 H09 UNK 0 -0.884 -2.728 0.852 0.00 0.00 0
HETATM 24 H10 UNK 0 0.374 -1.778 0.044 0.00 0.00 0
HETATM 25 H11 UNK 0 -2.605 0.931 -0.328 0.00 0.00 0
HETATM 26 H12 UNK 0 -1.090 2.146 1.298 0.00 0.00 0
HETATM 27 H13 UNK 0 -2.229 1.262 3.154 0.00 0.00 0
HETATM 28 H14 UNK 0 -3.233 0.480 1.883 0.00 0.00 0
HETATM 29 H15 UNK 0 -1.434 -0.778 3.855 0.00 0.00 0
HETATM 30 H16 UNK 0 -2.361 -1.651 2.584 0.00 0.00 0
HETATM 31 H17 UNK 0 0.429 -1.522 2.552 0.00 0.00 0
HETATM 32 H18 UNK 0 -2.651 -1.286 0.167 0.00 0.00 0
HETATM 33 H20 UNK 0 1.203 0.272 -0.011 0.00 0.00 0
HETATM 34 H21 UNK 0 1.546 1.695 1.056 0.00 0.00 0
HETATM 35 H22 UNK 0 2.105 0.067 1.538 0.00 0.00 0
HETATM 36 H27 UNK 0 1.178 3.787 -1.521 0.00 0.00 0
HETATM 37 H28 UNK 0 0.992 2.401 -2.667 0.00 0.00 0
HETATM 38 H29 UNK 0 -0.320 3.686 -2.550 0.00 0.00 0
HETATM 39 H39 UNK 0 -0.751 -1.289 -3.968 0.00 0.00 0
HETATM 40 H40 UNK 0 -0.350 -2.053 -6.284 0.00 0.00 0
HETATM 41 H41 UNK 0 -0.880 -4.399 -6.951 0.00 0.00 0
HETATM 42 H42 UNK 0 -1.815 -5.985 -5.264 0.00 0.00 0
HETATM 43 H43 UNK 0 -2.228 -5.248 -2.942 0.00 0.00 0
CONECT 1 6 8 23 24
CONECT 2 3 8 25 10
CONECT 3 2 4 7 26
CONECT 4 3 5 27 28
CONECT 5 4 6 29 30
CONECT 6 5 1 7 31
CONECT 7 6 3 9
CONECT 8 2 1 32 14
CONECT 9 7 33 34 35
CONECT 10 11 2
CONECT 10 12
CONECT 10 12
CONECT 11 10 13
CONECT 12 10
CONECT 12 10
CONECT 13 11 36 37 38
CONECT 14 8 15
CONECT 15 14 17
CONECT 15 16
CONECT 15 16
CONECT 16 15
CONECT 16 15
CONECT 17 22 15
CONECT 17 18
CONECT 17 18
CONECT 18 19 39
CONECT 18 17
CONECT 18 17
CONECT 19 18 40
CONECT 19 20
CONECT 19 20
CONECT 20 21 41
CONECT 20 19
CONECT 20 19
CONECT 21 20 42
CONECT 21 22
CONECT 21 22
CONECT 22 17 43
CONECT 22 21
CONECT 22 21
CONECT 23 1
CONECT 24 1
CONECT 25 2
CONECT 26 3
CONECT 27 4
CONECT 28 4
CONECT 29 5
CONECT 30 5
CONECT 31 6
CONECT 32 8
CONECT 33 9
CONECT 34 9
CONECT 35 9
CONECT 36 13
CONECT 37 13
CONECT 38 13
CONECT 39 18
CONECT 40 19
CONECT 41 20
CONECT 42 21
CONECT 43 22
END
HEADER MOLECULE
COMPND COPPER, MULTILAYER
AUTHOR A. W. MAVERICK
ATOM 1 CU UNK 1 -1.278 -2.214 -6.261 1.00 0.00
ATOM 2 CU UNK 1 1.278 -2.214 -6.261 1.00 0.00
ATOM 3 CU UNK 1 0.000 0.000 -6.261 1.00 0.00
ATOM 4 CU UNK 1 2.556 0.000 -6.261 1.00 0.00
ATOM 5 CU UNK 1 1.278 2.214 -6.261 1.00 0.00
ATOM 6 CU UNK 1 -1.278 2.214 -6.261 1.00 0.00
ATOM 7 CU UNK 1 -2.556 0.000 -6.261 1.00 0.00
ATOM 8 CU UNK 1 0.000 -1.476 -4.174 1.00 0.00
ATOM 9 CU UNK 1 2.556 -1.476 -4.174 1.00 0.00
ATOM 10 CU UNK 1 1.278 0.738 -4.174 1.00 0.00
ATOM 11 CU UNK 1 -1.278 0.738 -4.174 1.00 0.00
ATOM 12 CU UNK 1 0.000 2.951 -4.174 1.00 0.00
ATOM 13 CU UNK 1 -2.556 -1.476 -4.174 1.00 0.00
ATOM 14 CU UNK 1 -1.278 -0.738 -2.087 1.00 0.00
ATOM 15 CU UNK 1 -2.556 1.476 -2.087 1.00 0.00
ATOM 16 CU UNK 1 0.000 1.476 -2.087 1.00 0.00
ATOM 17 CU UNK 1 1.278 -0.738 -2.087 1.00 0.00
ATOM 18 CU UNK 1 2.556 1.476 -2.087 1.00 0.00
ATOM 19 CU UNK 1 0.000 -2.951 -2.087 1.00 0.00
ATOM 20 CU UNK 1 -1.278 -2.214 0.000 1.00 0.00
ATOM 21 CU UNK 1 1.278 -2.214 0.000 1.00 0.00
ATOM 22 CU UNK 1 0.000 0.000 0.000 1.00 0.00
ATOM 23 CU UNK 1 2.556 0.000 0.000 1.00 0.00
ATOM 24 CU UNK 1 1.278 2.214 0.000 1.00 0.00
ATOM 25 CU UNK 1 -1.278 2.214 0.000 1.00 0.00
ATOM 26 CU UNK 1 -2.556 0.000 0.000 1.00 0.00
ATOM 27 CU UNK 1 0.000 -1.476 2.087 1.00 0.00
ATOM 28 CU UNK 1 2.556 -1.476 2.087 1.00 0.00
ATOM 29 CU UNK 1 1.278 0.738 2.087 1.00 0.00
ATOM 30 CU UNK 1 -1.278 0.738 2.087 1.00 0.00
ATOM 31 CU UNK 1 0.000 2.951 2.087 1.00 0.00
ATOM 32 CU UNK 1 -2.556 -1.476 2.087 1.00 0.00
ATOM 33 CU UNK 1 -1.278 -0.738 4.174 1.00 0.00
ATOM 34 CU UNK 1 -2.556 1.476 4.174 1.00 0.00
ATOM 35 CU UNK 1 0.000 1.476 4.174 1.00 0.00
ATOM 36 CU UNK 1 1.278 -0.738 4.174 1.00 0.00
ATOM 37 CU UNK 1 2.556 1.476 4.174 1.00 0.00
ATOM 38 CU UNK 1 0.000 -2.951 4.174 1.00 0.00
ATOM 39 CU UNK 1 -1.278 -2.214 6.261 1.00 0.00
ATOM 40 CU UNK 1 1.278 -2.214 6.261 1.00 0.00
ATOM 41 CU UNK 1 0.000 0.000 6.261 1.00 0.00
ATOM 42 CU UNK 1 2.556 0.000 6.261 1.00 0.00
ATOM 43 CU UNK 1 1.278 2.214 6.261 1.00 0.00
ATOM 44 CU UNK 1 -1.278 2.214 6.261 1.00 0.00
ATOM 45 CU UNK 1 -2.556 0.000 6.261 1.00 0.00
CONECT 1 13
CONECT 1 2 3 7 8
CONECT 2 9
CONECT 2 1 3 4 8
CONECT 3 1 2 4 5
CONECT 3 6 7 8 10
CONECT 3 11
CONECT 4 10
CONECT 4 2 3 5 9
CONECT 5 3 4 6 10
CONECT 5 12
CONECT 6 3 5 7 11
CONECT 6 12
CONECT 7 1 3 6 11
CONECT 7 13
CONECT 8 1 2 3 9
CONECT 8 17 19
CONECT 8 10 11 13 14
CONECT 9 2 4 8 10
CONECT 9 17
CONECT 10 17 18
CONECT 10 3 4 5 8
CONECT 10 9 11 12 16
CONECT 11 10 12 13 14
CONECT 11 3 6 7 8
CONECT 11 15 16
CONECT 12 16
CONECT 12 5 6 10 11
CONECT 13 14
CONECT 13 1 7 8 11
CONECT 14 22 26
CONECT 14 8 11 13 15
CONECT 14 16 17 19 20
CONECT 15 11 14 16 25
CONECT 15 26
CONECT 16 24 25
CONECT 16 10 11 12 14
CONECT 16 15 17 18 22
CONECT 17 16 18 19 21
CONECT 17 8 9 10 14
CONECT 17 22 23
CONECT 18 24
CONECT 18 10 16 17 23
CONECT 19 21
CONECT 19 8 14 17 20
CONECT 20 14 19 21 22
CONECT 20 26 27 32
CONECT 21 17 19 20 22
CONECT 21 23 27 28
CONECT 22 26 27 29 30
CONECT 22 21 23 24 25
CONECT 22 14 16 17 20
CONECT 23 17 18 21 22
CONECT 23 24 28 29
CONECT 24 25 29 31
CONECT 24 16 18 22 23
CONECT 25 15 16 22 24
CONECT 25 26 30 31
CONECT 26 14 15 20 22
CONECT 26 25 30 32
CONECT 27 36 38
CONECT 27 29 30 32 33
CONECT 27 20 21 22 28
CONECT 28 21 23 27 29
CONECT 28 36
CONECT 29 36 37
CONECT 29 28 30 31 35
CONECT 29 22 23 24 27
CONECT 30 29 31 32 33
CONECT 30 34 35
CONECT 30 22 25 26 27
CONECT 31 35
CONECT 31 24 25 29 30
CONECT 32 33
CONECT 32 20 26 27 30
CONECT 33 35 36 38 39
CONECT 33 41 45
CONECT 33 27 30 32 34
CONECT 34 45
CONECT 34 30 33 35 44
CONECT 35 29 30 31 33
CONECT 35 34 36 37 41
CONECT 35 43 44
CONECT 36 27 28 29 33
CONECT 36 35 37 38 40
CONECT 36 41 42
CONECT 37 43
CONECT 37 29 35 36 42
CONECT 38 40
CONECT 38 27 33 36 39
CONECT 39 33 38 40 41
CONECT 39 45
CONECT 40 36 38 39 41
CONECT 40 42
CONECT 41 33 35 36 39
CONECT 41 45
CONECT 41 40 42 43 44
CONECT 42 36 37 40 41
CONECT 42 43
CONECT 43 35 37 41 42
CONECT 43 44
CONECT 44 34 35 41 43
CONECT 44 45
CONECT 45 33 34 39 41
CONECT 45 44
MASTER 0 0 0 0 0 0 0 0 45 0 45 0
END
HEADER NONAME 23-Apr-10 NONE 1
TITLE NONE 2
AUTHOR Chemical Structure Services at http://cactus.nci.nih.gov NONE 3
REVDAT 1 23-Apr-10 0 NONE 4
ATOM 1 C 0 0.414 0.765 0.999 0.00 0.00 C+0
ATOM 2 C 0 0.414 -0.765 0.999 0.00 0.00 C+0
ATOM 3 C 0 0.999 0.765 -0.414 0.00 0.00 C+0
ATOM 4 C 0 -1.000 0.765 0.414 0.00 0.00 C+0
ATOM 5 C 0 0.999 -0.765 -0.414 0.00 0.00 C+0
ATOM 6 C 0 -1.000 -0.765 0.414 0.00 0.00 C+0
ATOM 7 C 0 -0.414 0.765 -1.000 0.00 0.00 C+0
ATOM 8 C 0 -0.414 -0.765 -1.000 0.00 0.00 C+0
ATOM 9 H 0 0.756 1.394 1.822 0.00 0.00 H+0
ATOM 10 H 0 0.756 -1.394 1.822 0.00 0.00 H+0
ATOM 11 H 0 1.823 1.394 -0.754 0.00 0.00 H+0
ATOM 12 H 0 -1.822 1.394 0.756 0.00 0.00 H+0
ATOM 13 H 0 1.823 -1.394 -0.754 0.00 0.00 H+0
ATOM 14 H 0 -1.822 -1.394 0.756 0.00 0.00 H+0
ATOM 15 H 0 -0.754 1.396 -1.821 0.00 0.00 H+0
ATOM 16 H 0 -0.754 -1.396 -1.821 0.00 0.00 H+0
CONECT 1 2 3 4 9 NONE 21
CONECT 2 1 5 6 10 NONE 22
CONECT 3 1 5 7 11 NONE 23
CONECT 4 1 6 7 12 NONE 24
CONECT 5 2 3 8 13 NONE 25
CONECT 6 2 4 8 14 NONE 26
CONECT 7 3 4 8 15 NONE 27
CONECT 8 5 6 7 16 NONE 28
END NONE 29
HEADER NONAME 23-Apr-10 NONE 1
TITLE NONE 2
AUTHOR Chemical Structure Services at http://cactus.nci.nih.gov NONE 3
REVDAT 1 23-Apr-10 0 NONE 4
ATOM 1 C 0 0.011 -0.566 0.000 0.00 0.00 C+0
ATOM 2 C 0 -1.285 0.246 -0.000 0.00 0.00 C+0
ATOM 3 H 0 1.925 -0.229 -0.000 0.00 0.00 H+0
ATOM 4 O 0 1.130 0.322 0.000 0.00 0.00 O+0
ATOM 5 H 0 0.046 -1.195 0.890 0.00 0.00 H+0
ATOM 6 H 0 0.046 -1.195 -0.890 0.00 0.00 H+0
ATOM 7 H 0 -2.139 -0.432 0.000 0.00 0.00 H+0
ATOM 8 H 0 -1.320 0.875 0.890 0.00 0.00 H+0
ATOM 9 H 0 -1.320 0.875 -0.890 0.00 0.00 H+0
CONECT 1 2 4 5 6 NONE 14
CONECT 2 7 8 9 0 NONE 15
CONECT 4 3 0 0 0 NONE 16
END NONE 17
COMPND
REMARK 1 PDB to MMOD atom-numbering translation table; the mmod numbers
REMARK 1 pertain to the .dat file from which this file was created,
REMARK 1 not to one created from this file:
REMARK 1 PDB: 1 2 3 4 5 6 7 8 9
REMARK 1 MMOD: 1 2 3 4 5 6 7 8 9 /
REMARK 1 PDB: 10 11 12 13 14 15 16 17 18
REMARK 1 MMOD: 10 11 23 12 13 14 15 16 17 /
REMARK 1 PDB: 19 20 21 22 23 24
REMARK 1 MMOD: 18 19 20 21 22 24 /
HETATM 1 C01 UNK A 1 -10.447 3.465 0.000 0.00 0.00 0
HETATM 2 C02 UNK A 1 -11.071 4.006 1.273 0.00 0.00 0
HETATM 3 C03 UNK A 1 -12.577 4.148 1.128 0.00 0.00 0
HETATM 4 C04 UNK A 1 -12.891 4.988 -0.105 0.00 0.00 0
HETATM 5 C05 UNK A 1 -12.200 4.411 -1.349 0.00 0.00 0
HETATM 6 O06 UNK A 1 -10.802 4.239 -1.130 0.00 0.00 0
HETATM 7 O07 UNK A 1 -10.803 3.104 2.323 0.00 0.00 0
HETATM 8 O08 UNK A 1 -13.072 4.770 2.296 0.00 0.00 0
HETATM 9 O09 UNK A 1 -14.294 4.984 -0.281 0.00 0.00 0
HETATM 10 C10 UNK A 1 -12.311 5.317 -2.577 0.00 0.00 0
HETATM 11 O11 UNK A 1 -13.660 5.466 -2.961 0.00 0.00 0
HETATM 12 O23 UNK A 1 -9.045 3.478 0.138 0.00 0.00 0
HETATM 13 H12 UNK A 1 -9.995 3.339 2.755 0.00 0.00 0
HETATM 14 H13 UNK A 1 -12.863 4.206 3.024 0.00 0.00 0
HETATM 15 H14 UNK A 1 -13.704 6.000 -3.739 0.00 0.00 0
HETATM 16 H15 UNK A 1 -10.793 2.419 -0.156 0.00 0.00 0
HETATM 17 H16 UNK A 1 -10.626 4.997 1.513 0.00 0.00 0
HETATM 18 H17 UNK A 1 -13.037 3.141 1.020 0.00 0.00 0
HETATM 19 H18 UNK A 1 -12.542 6.032 0.061 0.00 0.00 0
HETATM 20 H19 UNK A 1 -12.653 3.423 -1.588 0.00 0.00 0
HETATM 21 H20 UNK A 1 -14.475 5.505 -1.044 0.00 0.00 0
HETATM 22 H21 UNK A 1 -11.886 6.317 -2.335 0.00 0.00 0
HETATM 23 H22 UNK A 1 -11.738 4.866 -3.418 0.00 0.00 0
HETATM 24 H24 UNK A 1 -8.822 2.951 0.906 0.00 0.00 0
CONECT 1 2 6 12 16
CONECT 2 1 3 7 17
CONECT 3 2 4 8 18
CONECT 4 3 5 9 19
CONECT 5 4 6 10 20
CONECT 6 5 1
CONECT 7 2 13
CONECT 8 3 14
CONECT 9 4 21
CONECT 10 5 11 22 23
CONECT 11 10 15
CONECT 12 1 24
CONECT 13 7
CONECT 14 8
CONECT 15 11
CONECT 16 1
CONECT 17 2
CONECT 18 3
CONECT 19 4
CONECT 20 5
CONECT 21 9
CONECT 22 10
CONECT 23 10
CONECT 24 12
END
HEADER
REMARK Spartan exported Fri Jan 30 16:10:52 1998
HETATM 1 C UNK 0001 4.141 3.305 -3.641
HETATM 2 C UNK 0001 3.254 3.762 -2.621
HETATM 3 C UNK 0001 1.962 0.786 -4.295
HETATM 4 C UNK 0001 2.087 0.286 -2.965
HETATM 5 C UNK 0001 -0.217 -1.734 -4.949
HETATM 6 C UNK 0001 -1.104 -1.278 -3.929
HETATM 7 C UNK 0001 -2.397 -4.254 -5.603
HETATM 8 C UNK 0001 -2.272 -4.753 -4.273
HETATM 9 C UNK 0001 2.265 4.743 -2.925
HETATM 10 C UNK 0001 1.378 5.199 -1.906
HETATM 11 C UNK 0001 0.085 2.223 -3.579
HETATM 12 C UNK 0001 0.210 1.724 -2.249
HETATM 13 C UNK 0001 -2.094 -0.297 -4.233
HETATM 14 C UNK 0001 -2.981 0.160 -3.214
HETATM 15 C UNK 0001 -4.273 -2.817 -4.887
HETATM 16 C UNK 0001 -4.148 -3.316 -3.557
HETATM 17 C UNK 0001 0.388 6.180 -2.210
HETATM 18 C UNK 0001 -0.499 6.636 -1.190
HETATM 19 C UNK 0001 -1.792 3.660 -2.864
HETATM 20 C UNK 0001 -1.666 3.161 -1.533
HETATM 21 C UNK 0001 -3.971 1.141 -3.518
HETATM 22 C UNK 0001 -4.858 1.597 -2.498
HETATM 23 C UNK 0001 -6.150 -1.379 -4.172
HETATM 24 C UNK 0001 -6.025 -1.878 -2.841
HETATM 25 C UNK 0001 -1.489 7.617 -1.494
HETATM 26 C UNK 0001 -2.376 8.074 -0.474
HETATM 27 C UNK 0001 -3.668 5.098 -2.148
HETATM 28 C UNK 0001 -3.543 4.598 -0.818
HETATM 29 C UNK 0001 -5.848 2.578 -2.802
HETATM 30 C UNK 0001 -6.734 3.034 -1.782
HETATM 31 C UNK 0001 -8.027 0.058 -3.456
HETATM 32 C UNK 0001 -7.902 -0.441 -2.126
HETATM 33 C UNK 0001 -3.366 9.055 -0.778
HETATM 34 C UNK 0001 -4.252 9.511 0.242
HETATM 35 C UNK 0001 -5.545 6.535 -1.432
HETATM 36 C UNK 0001 -5.420 6.036 -0.102
HETATM 37 C UNK 0001 -7.724 4.015 -2.086
HETATM 38 C UNK 0001 -8.611 4.472 -1.066
HETATM 39 C UNK 0001 -9.904 1.496 -2.740
HETATM 40 C UNK 0001 -9.779 0.996 -1.410
HETATM 41 C UNK 0001 5.300 1.876 -1.994
HETATM 42 C UNK 0001 4.413 2.332 -0.974
HETATM 43 C UNK 0001 3.121 -0.644 -2.648
HETATM 44 C UNK 0001 3.246 -1.143 -1.317
HETATM 45 C UNK 0001 0.941 -3.164 -3.302
HETATM 46 C UNK 0001 0.055 -2.707 -2.282
HETATM 47 C UNK 0001 -1.238 -5.684 -3.956
HETATM 48 C UNK 0001 -1.113 -6.183 -2.625
HETATM 49 C UNK 0001 3.423 3.313 -1.278
HETATM 50 C UNK 0001 2.536 3.769 -0.258
HETATM 51 C UNK 0001 1.244 0.793 -1.932
HETATM 52 C UNK 0001 1.369 0.294 -0.601
HETATM 53 C UNK 0001 -0.935 -1.727 -2.586
HETATM 54 C UNK 0001 -1.822 -1.270 -1.566
HETATM 55 C UNK 0001 -3.115 -4.246 -3.240
HETATM 56 C UNK 0001 -2.990 -4.746 -1.910
HETATM 57 C UNK 0001 1.546 4.750 -0.562
HETATM 58 C UNK 0001 0.660 5.207 0.458
HETATM 59 C UNK 0001 -0.633 2.231 -1.216
HETATM 60 C UNK 0001 -0.508 1.731 0.114
HETATM 61 C UNK 0001 -2.812 -0.289 -1.870
HETATM 62 C UNK 0001 -3.699 0.167 -0.850
HETATM 63 C UNK 0001 -4.991 -2.809 -2.524
HETATM 64 C UNK 0001 -4.866 -3.308 -1.194
HETATM 65 C UNK 0001 -0.330 6.188 0.154
HETATM 66 C UNK 0001 -1.217 6.644 1.173
HETATM 67 C UNK 0001 -2.510 3.668 -0.500
HETATM 68 C UNK 0001 -2.385 3.169 0.830
HETATM 69 C UNK 0001 -4.689 1.148 -1.154
HETATM 70 C UNK 0001 -5.576 1.605 -0.135
HETATM 71 C UNK 0001 -6.868 -1.371 -1.808
HETATM 72 C UNK 0001 -6.743 -1.871 -0.478
HETATM 73 C UNK 0001 -2.207 7.625 0.869
HETATM 74 C UNK 0001 -3.094 8.082 1.889
HETATM 75 C UNK 0001 -4.386 5.105 0.215
HETATM 76 C UNK 0001 -4.261 4.606 1.546
HETATM 77 C UNK 0001 -6.566 2.586 -0.439
HETATM 78 C UNK 0001 -7.452 3.042 0.581
HETATM 79 C UNK 0001 -8.745 0.066 -1.093
HETATM 80 C UNK 0001 -8.620 -0.433 0.238
HETATM 81 C UNK 0001 6.459 0.446 -0.346
HETATM 82 C UNK 0001 5.572 0.902 0.674
HETATM 83 C UNK 0001 4.279 -2.074 -1.000
HETATM 84 C UNK 0001 4.404 -2.573 0.330
HETATM 85 C UNK 0001 2.100 -4.594 -1.654
HETATM 86 C UNK 0001 1.213 -4.137 -0.634
HETATM 87 C UNK 0001 -0.079 -7.113 -2.308
HETATM 88 C UNK 0001 0.046 -7.613 -0.978
HETATM 89 C UNK 0001 4.582 1.883 0.370
HETATM 90 C UNK 0001 3.695 2.340 1.389
HETATM 91 C UNK 0001 2.403 -0.637 -0.284
HETATM 92 C UNK 0001 2.528 -1.136 1.046
HETATM 93 C UNK 0001 0.223 -3.156 -0.938
HETATM 94 C UNK 0001 -0.664 -2.700 0.081
HETATM 95 C UNK 0001 -1.956 -5.676 -1.592
HETATM 96 C UNK 0001 -1.831 -6.175 -0.262
HETATM 97 C UNK 0001 2.705 3.321 1.085
HETATM 98 C UNK 0001 1.818 3.777 2.105
HETATM 99 C UNK 0001 0.526 0.801 0.431
HETATM 100 C UNK 0001 0.651 0.302 1.762
HETATM 101 C UNK 0001 -1.653 -1.719 -0.223
HETATM 102 C UNK 0001 -2.540 -1.262 0.797
HETATM 103 C UNK 0001 -3.833 -4.239 -0.877
HETATM 104 C UNK 0001 -3.708 -4.738 0.454
HETATM 105 C UNK 0001 0.828 4.758 1.801
HETATM 106 C UNK 0001 -0.058 5.214 2.821
HETATM 107 C UNK 0001 -1.351 2.238 1.147
HETATM 108 C UNK 0001 -1.226 1.739 2.477
HETATM 109 C UNK 0001 -3.530 -0.281 0.493
HETATM 110 C UNK 0001 -4.417 0.175 1.513
HETATM 111 C UNK 0001 -5.710 -2.801 -0.161
HETATM 112 C UNK 0001 -5.584 -3.300 1.169
HETATM 113 C UNK 0001 -1.048 6.195 2.517
HETATM 114 C UNK 0001 -1.935 6.652 3.537
HETATM 115 C UNK 0001 -3.228 3.676 1.863
HETATM 116 C UNK 0001 -3.103 3.176 3.193
HETATM 117 C UNK 0001 -5.407 1.156 1.209
HETATM 118 C UNK 0001 -6.294 1.612 2.229
HETATM 119 C UNK 0001 -7.586 -1.364 0.555
HETATM 120 C UNK 0001 -7.461 -1.863 1.885
HETATM 121 C UNK 0001 7.617 -0.984 1.301
HETATM 122 C UNK 0001 6.730 -0.528 2.321
HETATM 123 C UNK 0001 5.438 -3.504 0.647
HETATM 124 C UNK 0001 5.563 -4.003 1.978
HETATM 125 C UNK 0001 3.259 -6.023 -0.007
HETATM 126 C UNK 0001 2.372 -5.567 1.013
HETATM 127 C UNK 0001 1.079 -8.543 -0.661
HETATM 128 C UNK 0001 1.204 -9.042 0.670
HETATM 129 C UNK 0001 5.740 0.453 2.017
HETATM 130 C UNK 0001 4.854 0.910 3.037
HETATM 131 C UNK 0001 3.561 -2.066 1.363
HETATM 132 C UNK 0001 3.686 -2.566 2.694
HETATM 133 C UNK 0001 1.382 -4.586 0.709
HETATM 134 C UNK 0001 0.495 -4.130 1.729
HETATM 135 C UNK 0001 -0.797 -7.106 0.055
HETATM 136 C UNK 0001 -0.672 -7.605 1.385
HETATM 137 C UNK 0001 3.864 1.891 2.733
HETATM 138 C UNK 0001 2.977 2.347 3.753
HETATM 139 C UNK 0001 1.684 -0.629 2.079
HETATM 140 C UNK 0001 1.809 -1.128 3.409
HETATM 141 C UNK 0001 -0.495 -3.149 1.425
HETATM 142 C UNK 0001 -1.382 -2.692 2.445
HETATM 143 C UNK 0001 -2.674 -5.668 0.771
HETATM 144 C UNK 0001 -2.549 -6.168 2.101
HETATM 145 C UNK 0001 1.987 3.328 3.449
HETATM 146 C UNK 0001 1.100 3.785 4.468
HETATM 147 C UNK 0001 -0.192 0.809 2.795
HETATM 148 C UNK 0001 -0.067 0.309 4.125
HETATM 149 C UNK 0001 -2.372 -1.711 2.141
HETATM 150 C UNK 0001 -3.258 -1.255 3.160
HETATM 151 C UNK 0001 -4.551 -4.231 1.487
HETATM 152 C UNK 0001 -4.426 -4.730 2.817
HETATM 153 C UNK 0001 0.110 4.766 4.164
HETATM 154 C UNK 0001 -0.777 5.222 5.184
HETATM 155 C UNK 0001 -2.069 2.246 3.510
HETATM 156 C UNK 0001 -1.944 1.747 4.841
HETATM 157 C UNK 0001 -4.248 -0.274 2.856
HETATM 158 C UNK 0001 -5.135 0.183 3.876
HETATM 159 C UNK 0001 -6.428 -2.794 2.202
HETATM 160 C UNK 0001 -6.303 -3.293 3.533
HETATM 161 C UNK 0001 8.776 -2.414 2.949
HETATM 162 C UNK 0001 7.889 -1.957 3.969
HETATM 163 C UNK 0001 6.597 -4.933 2.295
HETATM 164 C UNK 0001 6.722 -5.433 3.625
HETATM 165 C UNK 0001 4.417 -7.453 1.641
HETATM 166 C UNK 0001 3.531 -6.997 2.661
HETATM 167 C UNK 0001 2.238 -9.973 0.987
HETATM 168 C UNK 0001 2.363 -10.472 2.317
HETATM 169 C UNK 0001 6.899 -0.976 3.665
HETATM 170 C UNK 0001 6.012 -0.520 4.684
HETATM 171 C UNK 0001 4.720 -3.496 3.011
HETATM 172 C UNK 0001 4.845 -3.995 4.341
HETATM 173 C UNK 0001 2.541 -6.016 2.357
HETATM 174 C UNK 0001 1.654 -5.559 3.376
HETATM 175 C UNK 0001 0.361 -8.535 1.703
HETATM 176 C UNK 0001 0.486 -9.035 3.033
HETATM 177 C UNK 0001 5.022 0.461 4.380
HETATM 178 C UNK 0001 4.136 0.918 5.400
HETATM 179 C UNK 0001 2.843 -2.059 3.726
HETATM 180 C UNK 0001 2.968 -2.558 5.057
HETATM 181 C UNK 0001 0.664 -4.578 3.072
HETATM 182 C UNK 0001 -0.223 -4.122 4.092
HETATM 183 C UNK 0001 -1.515 -7.098 2.418
HETATM 184 C UNK 0001 -1.390 -7.597 3.749
HETATM 185 C UNK 0001 3.146 1.898 5.096
HETATM 186 C UNK 0001 2.259 2.355 6.116
HETATM 187 C UNK 0001 0.966 -0.621 4.442
HETATM 188 C UNK 0001 1.091 -1.120 5.772
HETATM 189 C UNK 0001 -1.213 -3.141 3.788
HETATM 190 C UNK 0001 -2.100 -2.685 4.808
HETATM 191 C UNK 0001 -3.392 -5.661 3.134
HETATM 192 C UNK 0001 -3.267 -6.160 4.464
HETATM 193 C UNK 0001 1.269 3.336 5.812
HETATM 194 C UNK 0001 0.382 3.792 6.832
HETATM 195 C UNK 0001 -0.910 0.816 5.158
HETATM 196 C UNK 0001 -0.785 0.317 6.488
HETATM 197 C UNK 0001 -3.090 -1.704 4.504
HETATM 198 C UNK 0001 -3.976 -1.247 5.524
HETATM 199 C UNK 0001 -5.269 -4.223 3.850
HETATM 200 C UNK 0001 -5.144 -4.723 5.180
CONECT 1 2
CONECT 2 1 9 49
CONECT 3 4
CONECT 4 3 43 51
CONECT 5 6
CONECT 6 5 13 53
CONECT 7 8
CONECT 8 7 47 55
CONECT 9 2 10
CONECT 10 9 17 57
CONECT 11 12
CONECT 12 11 51 59
CONECT 13 6 14
CONECT 14 13 21 61
CONECT 15 16
CONECT 16 15 55 63
CONECT 17 10 18
CONECT 18 17 25 65
CONECT 19 20
CONECT 20 19 59 67
CONECT 21 14 22
CONECT 22 21 29 69
CONECT 23 24
CONECT 24 23 63 71
CONECT 25 18 26
CONECT 26 25 33 73
CONECT 27 28
CONECT 28 27 67 75
CONECT 29 22 30
CONECT 30 29 37 77
CONECT 31 32
CONECT 32 31 71 79
CONECT 33 26 34
CONECT 34 33
CONECT 35 36
CONECT 36 35 75
CONECT 37 30 38
CONECT 38 37
CONECT 39 40
CONECT 40 39 79
CONECT 41 42
CONECT 42 41 49 89
CONECT 43 4 44
CONECT 44 43 83 91
CONECT 45 46
CONECT 46 45 53 93
CONECT 47 8 48
CONECT 48 47 87 95
CONECT 49 2 42 50
CONECT 50 49 57 97
CONECT 51 4 12 52
CONECT 52 51 91 99
CONECT 53 6 46 54
CONECT 54 53 61 101
CONECT 55 8 16 56
CONECT 56 55 95 103
CONECT 57 10 50 58
CONECT 58 57 65 105
CONECT 59 12 20 60
CONECT 60 59 99 107
CONECT 61 14 54 62
CONECT 62 61 69 109
CONECT 63 16 24 64
CONECT 64 63 103 111
CONECT 65 18 58 66
CONECT 66 65 73 113
CONECT 67 20 28 68
CONECT 68 67 107 115
CONECT 69 22 62 70
CONECT 70 69 77 117
CONECT 71 24 32 72
CONECT 72 71 111 119
CONECT 73 26 66 74
CONECT 74 73
CONECT 75 28 36 76
CONECT 76 75 115
CONECT 77 30 70 78
CONECT 78 77
CONECT 79 32 40 80
CONECT 80 79 119
CONECT 81 82
CONECT 82 81 89 129
CONECT 83 44 84
CONECT 84 83 123 131
CONECT 85 86
CONECT 86 85 93 133
CONECT 87 48 88
CONECT 88 87 127 135
CONECT 89 42 82 90
CONECT 90 89 97 137
CONECT 91 44 52 92
CONECT 92 91 131 139
CONECT 93 46 86 94
CONECT 94 93 101 141
CONECT 95 48 56 96
CONECT 96 95 135 143
CONECT 97 50 90 98
CONECT 98 97 105 145
CONECT 99 52 60 100
CONECT 100 99 139 147
CONECT 101 54 94 102
CONECT 102 101 109 149
CONECT 103 56 64 104
CONECT 104 103 143 151
CONECT 105 58 98 106
CONECT 106 105 113 153
CONECT 107 60 68 108
CONECT 108 107 147 155
CONECT 109 62 102 110
CONECT 110 109 117 157
CONECT 111 64 72 112
CONECT 112 111 151 159
CONECT 113 66 106 114
CONECT 114 113
CONECT 115 68 76 116
CONECT 116 115 155
CONECT 117 70 110 118
CONECT 118 117
CONECT 119 72 80 120
CONECT 120 119 159
CONECT 121 122
CONECT 122 121 129 169
CONECT 123 84 124
CONECT 124 123 163 171
CONECT 125 126
CONECT 126 125 133 173
CONECT 127 88 128
CONECT 128 127 167 175
CONECT 129 82 122 130
CONECT 130 129 137 177
CONECT 131 84 92 132
CONECT 132 131 171 179
CONECT 133 86 126 134
CONECT 134 133 141 181
CONECT 135 88 96 136
CONECT 136 135 175 183
CONECT 137 90 130 138
CONECT 138 137 145 185
CONECT 139 92 100 140
CONECT 140 139 179 187
CONECT 141 94 134 142
CONECT 142 141 149 189
CONECT 143 96 104 144
CONECT 144 143 183 191
CONECT 145 98 138 146
CONECT 146 145 153 193
CONECT 147 100 108 148
CONECT 148 147 187 195
CONECT 149 102 142 150
CONECT 150 149 157 197
CONECT 151 104 112 152
CONECT 152 151 191 199
CONECT 153 106 146 154
CONECT 154 153
CONECT 155 108 116 156
CONECT 156 155 195
CONECT 157 110 150 158
CONECT 158 157
CONECT 159 112 120 160
CONECT 160 159 199
CONECT 161 162
CONECT 162 161 169
CONECT 163 124 164
CONECT 164 163
CONECT 165 166
CONECT 166 165 173
CONECT 167 128 168
CONECT 168 167
CONECT 169 122 162 170
CONECT 170 169 177
CONECT 171 124 132 172
CONECT 172 171
CONECT 173 126 166 174
CONECT 174 173 181
CONECT 175 128 136 176
CONECT 176 175
CONECT 177 130 170 178
CONECT 178 177 185
CONECT 179 132 140 180
CONECT 180 179
CONECT 181 134 174 182
CONECT 182 181 189
CONECT 183 136 144 184
CONECT 184 183
CONECT 185 138 178 186
CONECT 186 185 193
CONECT 187 140 148 188
CONECT 188 187
CONECT 189 142 182 190
CONECT 190 189 197
CONECT 191 144 152 192
CONECT 192 191
CONECT 193 146 186 194
CONECT 194 193
CONECT 195 148 156 196
CONECT 196 195
CONECT 197 150 190 198
CONECT 198 197
CONECT 199 152 160 200
CONECT 200 199
END
HEADER NONAME 23-Apr-10 NONE 1
TITLE NONE 2
AUTHOR Chemical Structure Services at http://cactus.nci.nih.gov NONE 3
REVDAT 1 23-Apr-10 0 NONE 4
ATOM 1 C 0 -1.049 1.569 -0.186 0.00 0.00 C+0
ATOM 2 C 0 1.717 0.715 0.155 0.00 0.00 C+0
ATOM 3 C 0 -1.635 -2.212 -0.674 0.00 0.00 C+0
ATOM 4 C 0 -4.657 0.896 0.691 0.00 0.00 C+0
ATOM 5 C 0 -4.065 -2.519 -0.433 0.00 0.00 C+0
ATOM 6 C 0 -2.792 -2.984 -0.745 0.00 0.00 C+0
ATOM 7 C 0 4.762 -1.453 -0.659 0.00 0.00 C+0
ATOM 8 C 0 3.241 -1.347 1.369 0.00 0.00 C+0
ATOM 9 C 0 -0.294 3.762 -0.536 0.00 0.00 C+0
ATOM 10 C 0 6.055 -0.727 -0.281 0.00 0.00 C+0
ATOM 11 C 0 4.117 -0.699 2.443 0.00 0.00 C+0
ATOM 12 H 0 -6.116 -0.586 0.423 0.00 0.00 H+0
ATOM 13 O 0 3.348 0.665 -1.551 0.00 0.00 O+0
ATOM 14 C 0 -2.243 1.917 0.716 0.00 0.00 C+0
ATOM 15 C 0 1.270 2.005 -0.544 0.00 0.00 C+0
ATOM 16 C 0 2.958 0.178 -0.511 0.00 0.00 C+0
ATOM 17 C 0 -1.715 -0.898 -0.270 0.00 0.00 C+0
ATOM 18 C 0 -3.338 0.903 0.522 0.00 0.00 C+0
ATOM 19 C 0 0.596 -0.284 0.030 0.00 0.00 C+0
ATOM 20 N 0 0.046 2.483 0.100 0.00 0.00 N+0
ATOM 21 C 0 -0.654 0.118 -0.131 0.00 0.00 C+0
ATOM 22 C 0 -4.182 -1.194 -0.016 0.00 0.00 C+0
ATOM 23 N 0 3.634 -0.844 0.050 0.00 0.00 N+0
ATOM 24 N 0 -5.176 -0.349 0.374 0.00 0.00 N+0
ATOM 25 C 0 -3.008 -0.439 0.056 0.00 0.00 C+0
ATOM 26 H 0 -1.370 1.771 -1.208 0.00 0.00 H+0
ATOM 27 H 0 -0.679 -2.642 -0.934 0.00 0.00 H+0
ATOM 28 H 0 -1.924 1.911 1.758 0.00 0.00 H+0
ATOM 29 H 0 -2.616 2.907 0.457 0.00 0.00 H+0
ATOM 30 H 0 -5.240 1.741 1.027 0.00 0.00 H+0
ATOM 31 H 0 -4.930 -3.161 -0.511 0.00 0.00 H+0
ATOM 32 H 0 0.816 -1.341 0.073 0.00 0.00 H+0
ATOM 33 H 0 -2.694 -4.011 -1.065 0.00 0.00 H+0
ATOM 34 H 0 1.919 0.915 1.207 0.00 0.00 H+0
ATOM 35 H 0 2.050 2.761 -0.453 0.00 0.00 H+0
ATOM 36 H 0 1.074 1.803 -1.597 0.00 0.00 H+0
ATOM 37 H 0 -1.230 4.137 -0.122 0.00 0.00 H+0
ATOM 38 H 0 0.501 4.484 -0.349 0.00 0.00 H+0
ATOM 39 H 0 -0.405 3.615 -1.611 0.00 0.00 H+0
ATOM 40 H 0 4.601 -1.373 -1.734 0.00 0.00 H+0
ATOM 41 H 0 4.842 -2.504 -0.381 0.00 0.00 H+0
ATOM 42 H 0 3.370 -2.429 1.399 0.00 0.00 H+0
ATOM 43 H 0 2.196 -1.100 1.555 0.00 0.00 H+0
ATOM 44 H 0 6.894 -1.180 -0.809 0.00 0.00 H+0
ATOM 45 H 0 5.975 0.324 -0.559 0.00 0.00 H+0
ATOM 46 H 0 6.215 -0.807 0.794 0.00 0.00 H+0
ATOM 47 H 0 3.829 -1.077 3.424 0.00 0.00 H+0
ATOM 48 H 0 5.163 -0.940 2.253 0.00 0.00 H+0
ATOM 49 H 0 3.983 0.383 2.418 0.00 0.00 H+0
CONECT 1 21 20 14 26 NONE 54
CONECT 2 19 16 15 34 NONE 55
CONECT 3 17 6 27 0 NONE 56
CONECT 4 18 24 30 0 NONE 57
CONECT 5 22 6 31 0 NONE 58
CONECT 6 3 5 33 0 NONE 59
CONECT 7 23 10 40 41 NONE 60
CONECT 8 23 11 42 43 NONE 61
CONECT 9 20 37 38 39 NONE 62
CONECT 10 7 44 45 46 NONE 63
CONECT 11 8 47 48 49 NONE 64
CONECT 13 16 0 0 0 NONE 65
CONECT 14 18 1 28 29 NONE 66
CONECT 15 20 2 35 36 NONE 67
CONECT 16 2 23 13 0 NONE 68
CONECT 17 25 21 3 0 NONE 69
CONECT 18 25 14 4 0 NONE 70
CONECT 19 21 2 32 0 NONE 71
CONECT 20 1 15 9 0 NONE 72
CONECT 21 17 1 19 0 NONE 73
CONECT 22 25 24 5 0 NONE 74
CONECT 23 16 7 8 0 NONE 75
CONECT 24 22 4 12 0 NONE 76
CONECT 25 17 18 22 0 NONE 77
END NONE 78
HEADER PROTEIN 05-MAY-09 NONE
TITLE NULL
COMPND NULL
SOURCE NULL
KEYWDS NULL
EXPDTA NULL
AUTHOR Marvin
REVDAT 1 05-MAY-09 0
HETATM 1 C UNK 0 -1.075 0.818 0.485 0.00 0.00 C+0
HETATM 2 C UNK 0 -20.084 -9.817 -16.179 0.00 0.00 C+0
HETATM 3 C UNK 0 -0.713 -0.346 1.456 0.00 0.00 C+0
HETATM 4 C UNK 0 -19.685 -11.316 -16.318 0.00 0.00 C+0
HETATM 5 C UNK 0 1.324 0.571 4.582 0.00 0.00 C+0
HETATM 6 C UNK 0 2.150 -0.422 2.437 0.00 0.00 C+0
HETATM 7 C UNK 0 -21.966 -13.277 -16.664 0.00 0.00 C+0
HETATM 8 C UNK 0 -21.411 -13.321 -19.105 0.00 0.00 C+0
HETATM 9 C UNK 0 -20.930 -9.245 -13.860 0.00 0.00 C+0
HETATM 10 C UNK 0 -0.272 0.398 -1.881 0.00 0.00 C+0
HETATM 11 C UNK 0 -17.605 -7.104 -10.656 0.00 0.00 C+0
HETATM 12 C UNK 0 -3.688 -1.419 -5.187 0.00 0.00 C+0
HETATM 13 C UNK 0 -7.197 -3.296 -7.958 0.00 0.00 C+0
HETATM 14 C UNK 0 -14.089 -5.242 -7.881 0.00 0.00 C+0
HETATM 15 C UNK 0 1.029 0.084 3.233 0.00 0.00 C+0
HETATM 16 C UNK 0 -21.125 -12.803 -17.765 0.00 0.00 C+0
HETATM 17 C UNK 0 -1.350 0.342 -0.884 0.00 0.00 C+0
HETATM 18 C UNK 0 -19.823 -9.290 -14.825 0.00 0.00 C+0
HETATM 19 C UNK 0 -16.638 -7.337 -11.747 0.00 0.00 C+0
HETATM 20 C UNK 0 -4.573 -1.473 -4.006 0.00 0.00 C+0
HETATM 21 C UNK 0 -8.014 -3.326 -6.733 0.00 0.00 C+0
HETATM 22 C UNK 0 -13.187 -5.516 -9.012 0.00 0.00 C+0
HETATM 23 C UNK 0 -20.123 -11.908 -17.582 0.00 0.00 C+0
HETATM 24 C UNK 0 -0.240 0.124 2.758 0.00 0.00 C+0
HETATM 25 C UNK 0 -18.570 -8.892 -14.489 0.00 0.00 C+0
HETATM 26 C UNK 0 -2.571 -0.167 -1.186 0.00 0.00 C+0
HETATM 27 C UNK 0 -15.311 -7.135 -11.542 0.00 0.00 C+0
HETATM 28 C UNK 0 -5.784 -2.084 -4.084 0.00 0.00 C+0
HETATM 29 C UNK 0 -11.851 -5.294 -8.909 0.00 0.00 C+0
HETATM 30 C UNK 0 -9.256 -3.873 -6.736 0.00 0.00 C+0
HETATM 31 C UNK 0 -4.199 -0.885 -2.811 0.00 0.00 C+0
HETATM 32 C UNK 0 -17.065 -7.742 -12.999 0.00 0.00 C+0
HETATM 33 C UNK 0 -13.701 -5.957 -10.216 0.00 0.00 C+0
HETATM 34 C UNK 0 -7.540 -2.746 -5.572 0.00 0.00 C+0
HETATM 35 C UNK 0 -2.930 -0.738 -2.378 0.00 0.00 C+0
HETATM 36 C UNK 0 -18.165 -8.484 -13.246 0.00 0.00 C+0
HETATM 37 C UNK 0 -14.749 -6.793 -10.348 0.00 0.00 C+0
HETATM 38 C UNK 0 -6.252 -2.750 -5.177 0.00 0.00 C+0
HETATM 39 C UNK 0 -11.189 -4.811 -7.807 0.00 0.00 C+0
HETATM 40 C UNK 0 -9.894 -4.441 -7.811 0.00 0.00 C+0
CONECT 1 3 17
CONECT 2 4 18
CONECT 3 1 24
CONECT 4 2 23
CONECT 5 15
CONECT 6 15
CONECT 7 16
CONECT 8 16
CONECT 9 18
CONECT 10 17
CONECT 11 19
CONECT 12 20
CONECT 13 21
CONECT 14 22
CONECT 15 5 6 24
CONECT 16 7 8 23
CONECT 17 1 10 26
CONECT 18 2 9 25
CONECT 19 11 27 32
CONECT 20 12 28 31
CONECT 21 13 30 34
CONECT 22 14 29 33
CONECT 23 4 16
CONECT 24 3 15
CONECT 25 18 36
CONECT 26 17 35
CONECT 27 19 37
CONECT 28 20 38
CONECT 29 22 39
CONECT 30 21 40
CONECT 31 20 35
CONECT 32 19 36
CONECT 33 22 37
CONECT 34 21 38
CONECT 35 26 31
CONECT 36 25 32
CONECT 37 27 33
CONECT 38 28 34
CONECT 39 29 40
CONECT 40 30 39
MASTER 0 0 0 0 0 0 0 0 40 0 78 0
END
HEADER MOLECULE
COMPND SODIUM CHLORIDE BIG CRYSTAL
AUTHOR A. W. MAVERICK
ATOM 1 CL UNK 1 -5.640 -2.820 -4.230 1.00 0.00
ATOM 2 NA UNK 1 -5.640 -2.820 -1.410 1.00 0.00
ATOM 3 CL UNK 1 -5.640 -2.820 1.410 1.00 0.00
ATOM 4 NA UNK 1 -5.640 -2.820 4.230 1.00 0.00
ATOM 5 NA UNK 1 -5.640 0.000 -4.230 1.00 0.00
ATOM 6 CL UNK 1 -5.640 0.000 -1.410 1.00 0.00
ATOM 7 NA UNK 1 -5.640 0.000 1.410 1.00 0.00
ATOM 8 CL UNK 1 -5.640 0.000 4.230 1.00 0.00
ATOM 9 CL UNK 1 -5.640 2.820 -4.230 1.00 0.00
ATOM 10 NA UNK 1 -5.640 2.820 -1.410 1.00 0.00
ATOM 11 CL UNK 1 -5.640 2.820 1.410 1.00 0.00
ATOM 12 NA UNK 1 -5.640 2.820 4.230 1.00 0.00
ATOM 13 NA UNK 1 -2.820 -2.820 -4.230 1.00 0.00
ATOM 14 CL UNK 1 -2.820 -2.820 -1.410 1.00 0.00
ATOM 15 NA UNK 1 -2.820 -2.820 1.410 1.00 0.00
ATOM 16 CL UNK 1 -2.820 -2.820 4.230 1.00 0.00
ATOM 17 CL UNK 1 -2.820 0.000 -4.230 1.00 0.00
ATOM 18 NA UNK 1 -2.820 0.000 -1.410 1.00 0.00
ATOM 19 CL UNK 1 -2.820 0.000 1.410 1.00 0.00
ATOM 20 NA UNK 1 -2.820 0.000 4.230 1.00 0.00
ATOM 21 NA UNK 1 -2.820 2.820 -4.230 1.00 0.00
ATOM 22 CL UNK 1 -2.820 2.820 -1.410 1.00 0.00
ATOM 23 NA UNK 1 -2.820 2.820 1.410 1.00 0.00
ATOM 24 CL UNK 1 -2.820 2.820 4.230 1.00 0.00
ATOM 25 CL UNK 1 0.000 -2.820 -4.230 1.00 0.00
ATOM 26 NA UNK 1 0.000 -2.820 -1.410 1.00 0.00
ATOM 27 CL UNK 1 0.000 -2.820 1.410 1.00 0.00
ATOM 28 NA UNK 1 0.000 -2.820 4.230 1.00 0.00
ATOM 29 NA UNK 1 0.000 0.000 -4.230 1.00 0.00
ATOM 30 CL UNK 1 0.000 0.000 -1.410 1.00 0.00
ATOM 31 NA UNK 1 0.000 0.000 1.410 1.00 0.00
ATOM 32 CL UNK 1 0.000 0.000 4.230 1.00 0.00
ATOM 33 CL UNK 1 0.000 2.820 -4.230 1.00 0.00
ATOM 34 NA UNK 1 0.000 2.820 -1.410 1.00 0.00
ATOM 35 CL UNK 1 0.000 2.820 1.410 1.00 0.00
ATOM 36 NA UNK 1 0.000 2.820 4.230 1.00 0.00
ATOM 37 NA UNK 1 2.820 -2.820 -4.230 1.00 0.00
ATOM 38 CL UNK 1 2.820 -2.820 -1.410 1.00 0.00
ATOM 39 NA UNK 1 2.820 -2.820 1.410 1.00 0.00
ATOM 40 CL UNK 1 2.820 -2.820 4.230 1.00 0.00
ATOM 41 CL UNK 1 2.820 0.000 -4.230 1.00 0.00
ATOM 42 NA UNK 1 2.820 0.000 -1.410 1.00 0.00
ATOM 43 CL UNK 1 2.820 0.000 1.410 1.00 0.00
ATOM 44 NA UNK 1 2.820 0.000 4.230 1.00 0.00
ATOM 45 NA UNK 1 2.820 2.820 -4.230 1.00 0.00
ATOM 46 CL UNK 1 2.820 2.820 -1.410 1.00 0.00
ATOM 47 NA UNK 1 2.820 2.820 1.410 1.00 0.00
ATOM 48 CL UNK 1 2.820 2.820 4.230 1.00 0.00
ATOM 49 CL UNK 1 5.640 -2.820 -4.230 1.00 0.00
ATOM 50 NA UNK 1 5.640 -2.820 -1.410 1.00 0.00
ATOM 51 CL UNK 1 5.640 -2.820 1.410 1.00 0.00
ATOM 52 NA UNK 1 5.640 -2.820 4.230 1.00 0.00
ATOM 53 NA UNK 1 5.640 0.000 -4.230 1.00 0.00
ATOM 54 CL UNK 1 5.640 0.000 -1.410 1.00 0.00
ATOM 55 NA UNK 1 5.640 0.000 1.410 1.00 0.00
ATOM 56 CL UNK 1 5.640 0.000 4.230 1.00 0.00
ATOM 57 CL UNK 1 5.640 2.820 -4.230 1.00 0.00
ATOM 58 NA UNK 1 5.640 2.820 -1.410 1.00 0.00
ATOM 59 CL UNK 1 5.640 2.820 1.410 1.00 0.00
ATOM 60 NA UNK 1 5.640 2.820 4.230 1.00 0.00
CONECT 1 2 5 13
CONECT 2 1 3 6 14
CONECT 3 2 4 7 15
CONECT 4 3 8 16
CONECT 5 1 6 9 17
CONECT 6 2 5 7 10 18
CONECT 7 3 6 8 11 19
CONECT 8 4 7 12 20
CONECT 9 5 10 21
CONECT 10 6 9 11 22
CONECT 11 7 10 12 23
CONECT 12 8 11 24
CONECT 13 1 14 17 25
CONECT 14 2 13 15 18 26
CONECT 15 3 14 16 19 27
CONECT 16 4 15 20 28
CONECT 17 5 13 18 21 29
CONECT 18 6 14 17 19
CONECT 18 22 30
CONECT 19 7 15 18 20
CONECT 19 23 31
CONECT 20 8 16 19 24 32
CONECT 21 9 17 22 33
CONECT 22 10 18 21 23 34
CONECT 23 11 19 22 24 35
CONECT 24 12 20 23 36
CONECT 25 13 26 29 37
CONECT 26 14 25 27 30 38
CONECT 27 15 26 28 31 39
CONECT 28 16 27 32 40
CONECT 29 17 25 30 33 41
CONECT 30 18 26 29 31
CONECT 30 34 42
CONECT 31 19 27 30 32
CONECT 31 35 43
CONECT 32 20 28 31 36 44
CONECT 33 21 29 34 45
CONECT 34 22 30 33 35 46
CONECT 35 23 31 34 36 47
CONECT 36 24 32 35 48
CONECT 37 25 38 41 49
CONECT 38 26 37 39 42 50
CONECT 39 27 38 40 43 51
CONECT 40 28 39 44 52
CONECT 41 29 37 42 45 53
CONECT 42 30 38 41 43
CONECT 42 46 54
CONECT 43 31 39 42 44
CONECT 43 47 55
CONECT 44 32 40 43 48 56
CONECT 45 33 41 46 57
CONECT 46 34 42 45 47 58
CONECT 47 35 43 46 48 59
CONECT 48 36 44 47 60
CONECT 49 37 50 53
CONECT 50 38 49 51 54
CONECT 51 39 50 52 55
CONECT 52 40 51 56
CONECT 53 41 49 54 57
CONECT 54 42 50 53 55
CONECT 54 58
CONECT 55 43 51 54 56
CONECT 55 59
CONECT 56 44 52 55 60
CONECT 57 45 53 58
CONECT 58 46 54 57 59
CONECT 59 47 55 58 60
CONECT 60 48 56 59
MASTER 0 0 0 0 0 0 0 0 60 0 60 0
END
HEADER PROTEIN 25-AUG-08 NONE
TITLE NULL
COMPND MOLECULE: 184
SOURCE NULL
KEYWDS NULL
EXPDTA NULL
AUTHOR Marvin
REVDAT 1 25-AUG-08 0
HETATM 1 N UNK 0 2.066 -2.269 0.129 0.00 0.00 N+0
HETATM 2 N UNK 0 -0.352 1.181 -0.413 0.00 0.00 N+0
HETATM 3 C UNK 0 2.542 -0.987 0.731 0.00 0.00 C+0
HETATM 4 C UNK 0 2.489 -1.212 2.267 0.00 0.00 C+0
HETATM 5 C UNK 0 1.783 -2.566 2.444 0.00 0.00 C+0
HETATM 6 C UNK 0 2.170 -3.317 1.164 0.00 0.00 C+0
HETATM 7 C UNK 0 1.723 0.195 0.320 0.00 0.00 C+0
HETATM 8 C UNK 0 2.616 -2.630 -1.204 0.00 0.00 C+0
HETATM 9 C UNK 0 2.288 1.493 0.336 0.00 0.00 C+0
HETATM 10 C UNK 0 0.364 0.083 -0.061 0.00 0.00 C+0
HETATM 11 C UNK 0 1.521 2.611 -0.035 0.00 0.00 C+0
HETATM 12 C UNK 0 0.180 2.427 -0.411 0.00 0.00 C+0
HETATM 13 H UNK 0 3.587 -0.824 0.438 0.00 0.00 H+0
HETATM 14 H UNK 0 3.506 -1.278 2.666 0.00 0.00 H+0
HETATM 15 H UNK 0 1.958 -0.426 2.811 0.00 0.00 H+0
HETATM 16 H UNK 0 2.114 -3.088 3.347 0.00 0.00 H+0
HETATM 17 H UNK 0 0.697 -2.426 2.484 0.00 0.00 H+0
HETATM 18 H UNK 0 3.194 -3.699 1.242 0.00 0.00 H+0
HETATM 19 H UNK 0 1.485 -4.144 0.969 0.00 0.00 H+0
HETATM 20 H UNK 0 3.695 -2.803 -1.157 0.00 0.00 H+0
HETATM 21 H UNK 0 2.421 -1.821 -1.910 0.00 0.00 H+0
HETATM 22 H UNK 0 2.131 -3.532 -1.581 0.00 0.00 H+0
HETATM 23 H UNK 0 3.263 1.631 0.620 0.00 0.00 H+0
HETATM 24 H UNK 0 -0.106 -0.822 -0.076 0.00 0.00 H+0
HETATM 25 H UNK 0 1.934 3.546 -0.026 0.00 0.00 H+0
HETATM 26 H UNK 0 -0.402 3.223 -0.680 0.00 0.00 H+0
CONECT 1 3 6 8
CONECT 2 10 12
CONECT 3 1 4 7 13
CONECT 4 3 5 14 15
CONECT 5 4 6 16 17
CONECT 6 1 5 18 19
CONECT 7 3 9 10
CONECT 8 1 20 21 22
CONECT 9 7 11 23
CONECT 10 2 7 24
CONECT 11 9 12 25
CONECT 12 2 11 26
CONECT 13 3
CONECT 14 4
CONECT 15 4
CONECT 16 5
CONECT 17 5
CONECT 18 6
CONECT 19 6
CONECT 20 8
CONECT 21 8
CONECT 22 8
CONECT 23 9
CONECT 24 10
CONECT 25 11
CONECT 26 12
MASTER 0 0 0 0 0 0 0 0 26 0 54 0
END
HEADER MOLECULE
COMPND "123" YBa2Cu3O7 SUPERCONDUCTOR
AUTHOR A. W. MAVERICK
ATOM 1 Y UNK 1 0.000 -4.290 0.000 1.00 0.00
ATOM 2 BA UNK 1 0.000 -0.602 0.000 1.00 0.00
ATOM 3 BA UNK 1 0.000 3.703 0.000 1.00 0.00
ATOM 4 CU UNK 1 -1.912 -5.976 1.943 1.00 0.00
ATOM 5 CU UNK 1 -1.912 -5.976 -1.943 1.00 0.00
ATOM 6 CU UNK 1 1.911 -5.976 1.943 1.00 0.00
ATOM 7 CU UNK 1 1.911 -5.976 -1.943 1.00 0.00
ATOM 8 CU UNK 1 -1.912 -2.603 1.943 1.00 0.00
ATOM 9 CU UNK 1 -1.912 -2.603 -1.943 1.00 0.00
ATOM 10 CU UNK 1 1.911 -2.603 1.943 1.00 0.00
ATOM 11 CU UNK 1 1.911 -2.603 -1.943 1.00 0.00
ATOM 12 CU UNK 1 -1.912 1.551 1.943 1.00 0.00
ATOM 13 CU UNK 1 -1.912 1.551 -1.943 1.00 0.00
ATOM 14 CU UNK 1 1.911 1.551 1.943 1.00 0.00
ATOM 15 CU UNK 1 1.911 1.551 -1.943 1.00 0.00
ATOM 16 CU UNK 1 -1.912 5.704 1.943 1.00 0.00
ATOM 17 CU UNK 1 -1.912 5.704 -1.943 1.00 0.00
ATOM 18 CU UNK 1 1.911 5.704 1.943 1.00 0.00
ATOM 19 CU UNK 1 1.911 5.704 -1.943 1.00 0.00
ATOM 20 O UNK 1 -3.823 -5.723 1.943 1.00 0.00
ATOM 21 O UNK 1 -3.823 -5.723 -1.943 1.00 0.00
ATOM 22 O UNK 1 0.000 -5.723 1.943 1.00 0.00
ATOM 23 O UNK 1 0.000 -5.723 -1.943 1.00 0.00
ATOM 24 O UNK 1 3.823 -5.723 1.943 1.00 0.00
ATOM 25 O UNK 1 3.823 -5.723 -1.943 1.00 0.00
ATOM 26 O UNK 1 -1.912 -5.704 3.886 1.00 0.00
ATOM 27 O UNK 1 -1.912 -5.704 0.000 1.00 0.00
ATOM 28 O UNK 1 -1.912 -5.704 -3.886 1.00 0.00
ATOM 29 O UNK 1 1.911 -5.704 3.886 1.00 0.00
ATOM 30 O UNK 1 1.911 -5.704 0.000 1.00 0.00
ATOM 31 O UNK 1 1.911 -5.704 -3.886 1.00 0.00
ATOM 32 O UNK 1 -1.912 -2.875 3.886 1.00 0.00
ATOM 33 O UNK 1 -1.912 -2.875 0.000 1.00 0.00
ATOM 34 O UNK 1 -1.912 -2.875 -3.886 1.00 0.00
ATOM 35 O UNK 1 1.911 -2.875 3.886 1.00 0.00
ATOM 36 O UNK 1 1.911 -2.875 0.000 1.00 0.00
ATOM 37 O UNK 1 1.911 -2.875 -3.886 1.00 0.00
ATOM 38 O UNK 1 -3.823 -2.857 1.943 1.00 0.00
ATOM 39 O UNK 1 -3.823 -2.857 -1.943 1.00 0.00
ATOM 40 O UNK 1 0.000 -2.857 1.943 1.00 0.00
ATOM 41 O UNK 1 0.000 -2.857 -1.943 1.00 0.00
ATOM 42 O UNK 1 3.823 -2.857 1.943 1.00 0.00
ATOM 43 O UNK 1 3.823 -2.857 -1.943 1.00 0.00
ATOM 44 O UNK 1 -1.912 -0.300 1.943 1.00 0.00
ATOM 45 O UNK 1 -1.912 -0.300 -1.943 1.00 0.00
ATOM 46 O UNK 1 1.911 -0.300 1.943 1.00 0.00
ATOM 47 O UNK 1 1.911 -0.300 -1.943 1.00 0.00
ATOM 48 O UNK 1 -1.912 1.551 3.886 1.00 0.00
ATOM 49 O UNK 1 -1.912 1.551 0.000 1.00 0.00
ATOM 50 O UNK 1 -1.912 1.551 -3.886 1.00 0.00
ATOM 51 O UNK 1 1.911 1.551 3.886 1.00 0.00
ATOM 52 O UNK 1 1.911 1.551 0.000 1.00 0.00
ATOM 53 O UNK 1 1.911 1.551 -3.886 1.00 0.00
ATOM 54 O UNK 1 -1.912 3.401 1.943 1.00 0.00
ATOM 55 O UNK 1 -1.912 3.401 -1.943 1.00 0.00
ATOM 56 O UNK 1 1.911 3.401 1.943 1.00 0.00
ATOM 57 O UNK 1 1.911 3.401 -1.943 1.00 0.00
ATOM 58 O UNK 1 -3.823 5.958 1.943 1.00 0.00
ATOM 59 O UNK 1 -3.823 5.958 -1.943 1.00 0.00
ATOM 60 O UNK 1 0.000 5.958 1.943 1.00 0.00
ATOM 61 O UNK 1 0.000 5.958 -1.943 1.00 0.00
ATOM 62 O UNK 1 3.823 5.958 1.943 1.00 0.00
ATOM 63 O UNK 1 3.823 5.958 -1.943 1.00 0.00
ATOM 64 O UNK 1 -1.912 5.976 3.886 1.00 0.00
ATOM 65 O UNK 1 -1.912 5.976 0.000 1.00 0.00
ATOM 66 O UNK 1 -1.912 5.976 -3.886 1.00 0.00
ATOM 67 O UNK 1 1.911 5.976 3.886 1.00 0.00
ATOM 68 O UNK 1 1.911 5.976 0.000 1.00 0.00
ATOM 69 O UNK 1 1.911 5.976 -3.886 1.00 0.00
CONECT 1 22 23 27 30
CONECT 1 33 36 40 41
CONECT 4 20 22 26 27
CONECT 5 21 23 27 28
CONECT 6 22 24 29 30
CONECT 7 23 25 30 31
CONECT 8 32 33 38 40
CONECT 8 44
CONECT 9 33 34 39 41
CONECT 9 45
CONECT 10 35 36 40 42
CONECT 10 46
CONECT 11 36 37 41 43
CONECT 11 47
CONECT 12 44 48 49 54
CONECT 13 45 49 50 55
CONECT 14 46 51 52 56
CONECT 15 47 52 53 57
CONECT 16 54 58 60 64
CONECT 16 65
CONECT 17 55 59 61 65
CONECT 17 66
CONECT 18 56 60 62 67
CONECT 18 68
CONECT 19 57 61 63 68
CONECT 19 69
CONECT 20 4
CONECT 21 5
CONECT 22 1 4 6
CONECT 23 1 5 7
CONECT 24 6
CONECT 25 7
CONECT 26 4
CONECT 27 1 4 5
CONECT 28 5
CONECT 29 6
CONECT 30 1 6 7
CONECT 31 7
CONECT 32 8
CONECT 33 1 8 9
CONECT 34 9
CONECT 35 10
CONECT 36 1 10 11
CONECT 37 11
CONECT 38 8
CONECT 39 9
CONECT 40 1 8 10
CONECT 41 1 9 11
CONECT 42 10
CONECT 43 11
CONECT 44 8 12
CONECT 45 9 13
CONECT 46 10 14
CONECT 47 11 15
CONECT 48 12
CONECT 49 12 13
CONECT 50 13
CONECT 51 14
CONECT 52 14 15
CONECT 53 15
CONECT 54 12 16
CONECT 55 13 17
CONECT 56 14 18
CONECT 57 15 19
CONECT 58 16
CONECT 59 17
CONECT 60 16 18
CONECT 61 17 19
CONECT 62 18
CONECT 63 19
CONECT 64 16
CONECT 65 16 17
CONECT 66 17
CONECT 67 18
CONECT 68 18 19
CONECT 69 19
MASTER 0 0 0 0 0 0 0 0 69 0 69 0
END
VGhyZWUuanMgMDAzQAQBBAQEBAIkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAA
AAAAAAAAANPMIEEAAAAAAAAgQTkzH0EAAAAAAAAgQSwzH0EAAAAA/v8fwcfMIEEAAAAA/v8fwdPM
IEEAAKBAAAAgQTkzH0EAAKBAAAAgQSwzH0EAAKBA/v8fwcfMIEEAAKBA/v8fwSwzH8EAAAAAAAAg
QcfMIMEAAAAAAAAgQdPMIMEAAAAA/v8fwTkzH8EAAAAA/v8fwSwzH8EAAKBAAAAgQcfMIMEAAKBA
AAAgQdPMIMEAAKBA/v8fwTkzH8EAAKBA/v8fwQAAIMEAAAAAzcwgQQAAIMEAAAAAMzMfQQAAIEEA
AAAAMzMfQQAAIEEAAAAAzcwgQQAAIMEAAKBAzcwgQQAAIMEAAKBAMzMfQQAAIEEAAKBAMzMfQQAA
IEEAAKBAzcwgQQAAIMEAAAAAMjMfwQAAIMEAAAAAzMwgwQAAIEEAAAAAzMwgwQAAIEEAAAAAMjMf
wQAAIMEAAKBAMjMfwQAAIMEAAKBAzMwgwQAAIEEAAKBAzMwgwQAAIEEAAKBAMjMfwQAAIEEAAAAA
AAAgQQAAIMEAAAAAAAAgQQAAIEEAAAAA/v8fwQAAIMEAAAAA/v8fwQAAf4EAAAAAgX8AAACBAAB/
AIEAAH8AAAEAAAAAAAAABAAAAAUAAAAFAAAABgAAAAIAAAABAAAABgAAAAcAAAADAAAAAgAAAAAA
AAADAAAABwAAAAQAAAAAAAAAAQAAAAIAAAADAAAABwAAAAYAAAAFAAAABAAAAAwAAAANAAAACQAA
AAgAAAANAAAADgAAAAoAAAAJAAAADgAAAA8AAAALAAAACgAAAA8AAAAMAAAACAAAAAsAAAAIAAAA
CQAAAAoAAAALAAAADwAAAA4AAAANAAAADAAAABQAAAAVAAAAEQAAABAAAAAVAAAAFgAAABIAAAAR
AAAAFgAAABcAAAATAAAAEgAAABcAAAAUAAAAEAAAABMAAAAQAAAAEQAAABIAAAATAAAAFwAAABYA
AAAVAAAAFAAAABwAAAAdAAAAGQAAABgAAAAdAAAAHgAAABoAAAAZAAAAHgAAAB8AAAAbAAAAGgAA
AB8AAAAcAAAAGAAAABsAAAAYAAAAGQAAABoAAAAbAAAAHwAAAB4AAAAdAAAAHAAAACIAAAAjAAAA
IQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAAD
AAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAA
AAAAAAAAAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAA
AAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAAAAGAAAABgAAAAYAAAAGAAAAAgAAAAIAAAACAAAA
AgAAAAcAAAAHAAAABwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAUAAAAF
AAAABQAAAAUAAAAGAAAABgAAAAYAAAAGAAAAAgAAAAIAAAACAAAAAgAAAAcAAAAHAAAABwAAAAcA
AAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAA
AAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAA==
{
"metadata" :
{
"formatVersion" : 3.1,
"sourceFile" : "box.obj",
"generatedBy" : "OBJConverter",
"vertices" : 36,
"faces" : 25,
"normals" : 8,
"uvs" : 0,
"materials" : 1
},
"materials": [ {
"DbgColor" : 15658734,
"DbgIndex" : 0,
"DbgName" : "",
"colorAmbient" : [0.0, 0.0, 0.0],
"colorDiffuse" : [0.8, 0.8, 0.8],
"colorSpecular" : [0.8, 0.8, 0.8],
"illumination" : 2,
"specularCoef" : 0.0,
"transparency" : 1.0
}],
"buffers": "box.bin"
}
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ViKb+4SqREREavNjOVIVyoiU+GvQAGgL99qlWMojWkR4EP7KX+/17evz02exlnteKGJMVau95BptMDynOkqaQtKKsFbfcn34e8WLiHgcTVujMFxJ8TlXmopHRFZaIICQCF0393B//fN3g6A1QFvrx+PteH5K6MUcLjHA7ZiSpD6mD9MU7txbykRSpDI+vQ+m+rnJ0+T10y///H7+j//8x//8/77+2eJf//z5+enBZcjMxzt28urtNectLggirWr7O81RdJdNq1AG5Y9lPy+Gc4SUyBYXmQ56sW91iZZV/vhO7McZ27OzDc053d/Lixz3bKdx3IPV9no+0eOpOb9GK0UZVi1Tx45dq2oBumOLVPBxDrQWIrCebJLF/7+Fi6Eakgg3iNA92FoGY5SeZ4EnpvuAqoBSPxVTwhkRqghe+BZQwn3MOd6/P55Pa33mOwNUsyuAYbzeH4/DRSg6BD2JRBktL+L0zIvIpUHa0G6mTlFhs4cIxTTmhMAZknWY7c9BAwj3AuCEt97GcDPNXMrpng5+RlhumoWApb57RuAcaK3146eff7aj5+Mzw1WY+wUkWTfXOaopIE1GSjseAs2ddEJhUdevUqT13gRvvf/p0/H7t5/+/o9v//Wf3376r2//9qdPn788VyLfPZqB14RxB27VDbAayAu1udarOyPspspYqHi5Z+Jgva3co9Ill2AOsOUWH72LpS1L0gqGiXLEK8STUo71lmzRBfdPVgQrJnltwqweoQjS6QmsRDVD+ypc7wLuaiEzNRMzY4yP77SWJu7ATddUoXLronSn8BynqHUVF9HeCKCZeKg1VctOth/PXGbNcwjFtLyWiGC4JFrIZx69r493zmG92/H8eP9w/50RvXf0Z37mH9++erioka+ffv7p2XOy6ZBFMMkZm2YHGlUVAunPXp7iACa0JatirzXTk1kz5RwliUy61LUTvRkpWZvF1uqpBcnpImJVWWVAGmLOpoajSyYbQHvrEpXCAFWhuM+cbQtE6PnMagw7HrRGbTEnw9NckbICBBI4+UnxaPanz4/v7z/98/fv/88/vn75+9//7efjp5/fUOrXKh52BGzc7AYMaXEtvvasMvfzvGrBP87yS0qga4C/l7pXVMs+a24cLKyAzp0atmX8lNhQErpvFtGai+broDdLWlkty6y44IGMwhelLDl5NiSEgQsFDTXc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
+2s5zF+2kt+BM3qxHoflSTdpMbSptbH/2Q==
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
KdP/2Q==
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
9afKFspbn//Z
/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIA
AhEBAxEB/8QAHQAAAQQDAQEAAAAAAAAAAAAAAQACAwQFBgcICf/EAEsQAAEDAgQEAwUGAwUGBQMF
AQECAxEABAUSITEGE0FRImFxBxQygZEIFSNCobFSwdEWM2Lh8CRDcoKSogk0c9LxU2OyFzVEZJXC
/8QAGwEAAwEBAQEBAAAAAAAAAAAAAAECAwQFBgf/xAAzEQACAgEDAwIEBAcAAwEAAAAAAQIRAxIh
MQRBURNhBSIycYGRsfAUQlKhwdHhIzM08f/aAAwDAQACEQMRAD8A+X21A706KBFe0ZDaVGDQoEKh
FGlFSAKFOoRTGIjSm06hSAFGlSoAFKlSoAVKlSoAVKlRoAFGlSoAVKlSBoAQo0hSoAW9GgKNACo0
KMUAKlRAmkBQAh1o0opUAKlRpdKAEKVGlQAhTgNRSG9OAoHQQmnAUhRipGCKMUaVAAilFGlQAAIo
0CaBNOgDNCaFECqJsG9KKcBRiqQhuWaUU6KB1qqExm1AntTopRVoQ2jFGKMfSr2AbFGKdtQpioUU
qQmjEUwFSilRqkAqNACaIFMRUNA06KEVwmgCKEUTSNMBsUKcaW9IBtKKMUqQwRQUKNI0ANpUjSik
AqFGlvQAIo0qVACoUaVACpUqW9ACpUqO1ACilFKjQAhRoUdaAEBRpUaYAAo0qNACHpSiiNKKTBBg
GOhoAHSOlGjS3oECKUU6KUUgEKeNaAFPFBSEBTstAU4CgYjTSZpxFNIigAExQJ1p2WiETQBHvTgi
alS33FOgUwIgilkipwIoEU0gojCaGWakyzQOlaITI1CKaTT1U2KpIlg8qVOikdKpEjaVE6U071QB
J6UNzSAogUxCFKjFECnQAiiBRjyoxVDABTgO1EJinBNUIokUCKcdqBrzjQbQNOIoEa0wG0qMaChF
MBUIo0ImkAIoU470iKAGdaXWnEa00ipAEUtqNCgBUqVKgBfOlSpUAKl1pUYoAQ0pUqIoAHSjSpUA
EUaAp1AAoxNKjFMQd6UUgAKMUwEBNECkKNIBRSo9aMUxgijE0YpRSAQ+lPFNAp1BSHAU8UwGnA0U
AaBFKaJooAAU7amhVHegB0xREUyKOtUkA4qppUKXSoyapIVji5TCqgT0oZqpEthmkDTZozpVIkM0
qFGrSAVIClE0YpgKKUa06KITVIBsUQKdEUQKYAAogUctOCKqgABTgmKcluty9l3C9txLxSlu9cth
Z2jDt681cuFAeS2gqyAjWT/I1GSaxwc3whxjqaic8O9NNPIptcJbG0qMRQNAgUoo0KoARSo0qQDY
pRTopRRYDIpHUU+KGWkBGRSp5FDLSAZSpxFCKAG0utGKQoAUTSpb0TQAhSFKlQAqNCiKYBFEUKNA
g0RQ2ogRTAIogUIpwoAIGtEDWkAKNACpUgKcBQMbFGNaMUaYAiiKMUooKFRobUaEgFTo0ptGadAH
LT0iKZIo56KAedKYo0CumFVUKwqUSIqMmkTQqkiGwzNKaFIVaQhUYmkBTgKqgEBTgKQFOANAAApw
FEJp4TVANiiBTwinBE0wI8tOyeVShAo5QKAIwipAinAURrVAAJrs/wBnbB89/fPuYbaYg9foGG2S
LkqzBalDOsAaBIESTqdh1jjiU16e+yBwhiNy1iWOEcnCra4Ci44khLjqWylISepGdX6V5vxLJ6XS
ykdfSY/VzRic+49+zyG0qd4aCw+0jMuyfczcz/01d/I7964ZdWrtpcOMPtrZebUULbWmFJI3BB2r
3NmKLhCLiUqW0kpc3Sv51zr2kcDYTxrY3b9yx7jilqgqRftp+JIGyx+YfqOhr5Dovi0oP08+68n0
PV/DYyTnh2fg8rxTTV/FMKu8HvF2l7buWtwiMzbqcpg7H0qkUxX18WpK0fLtOLpjTQmjQqyRTSpR
NDagB1KgTSpMYaVKiBUgCJoZdKfSoHRHloZakihFAURxQy1LFDLQIiilFSZaWWgCOjFGKNADctEC
KNKqoBRSoxRigQgKUUaVArCAKIoCnAUD5DTqFEDemMIFECaFEUDDFECkKIqhgAoxRilGlAAilFGK
Q60wBFKkTNCihCoTrSOlCnRICaBNKNKVUkSCkBNGKIFXQAiiE04CnAUwABFEJpwTTgigBoFPCacE
U9KaoBoTTwmnBNPAoQ6G5aIFPSiaeEUDojyUeWamCadFMVEIbJpwaqTWaImrEbx7I/ZVee0/iNFq
hSrXC2IXe30SlpHYd1HoPnXv/hrDcN4X4ctLWwZTZ4RZJCLNiN1dXD3Ud9e8184sC4xxzhon7rxW
5sQUlEMuQmCZOm243r2J7P8A2gX3FfsuwK9vnXH7soLLzrqpW4tBKSs+sTXxnx3Hna9Rv5OEvfyz
6j4PLDq0183cjuuH2X2jc8PqQpgmXLF0wlJ6hM/3Z/wnwnyrQuKrdz7mxZu3S4StlbTls54HrdRH
7djtWTucSvuC1tXuMYgXWVZGmLyyQVNpbSkklcjUkx4VVn0XeHcaYewq/aNjcuIHKuEHLGYSAD+U
kEeBWhr5FPQ1J7ntNWml+RwzEDhXFNgjDsaHvTLDSQziDQh+3IbRPmfETM6GuXcceznEeC3Q64U3
uGOKKWb9jVtR/hV/CryPymvQfGnA72Cky0GyhIQLxlBDbogDKsfkJAGh8J6GsVwu2t3E/u27SRav
KyKt3WwtlwEuKkA6JBKhp5V7vTdc8SuPHj/R5ObpVmdS58/7PMakEUyIr0B7RfYW1doXf4A2m1ui
SV2R8LTmv5D+U+W3pXCL2yesbl23uGlsPtkpW24nKpJ7EV9R0/VY+pjcHv47ngZ+mydPKpL8StQI
okRQrsOQaaUxRIoUDHCnA1HTgalgPoxQB0oikUKKBpxECmxQADQokUKAFSogUYoAaBSKafFIigVE
eWlFPIppqkIERSoxNECmTQIpwFIClQFBFHakKNA0hCnChFGNaYBpwptOimMNOptOFVRQqUGngaUc
tMBkUIqXL5UslMGQ5aBEVKU00pookjIppp5EUCJqqJYyjE0YoxVCGxTgIogTTwinQDQKeE09LdSp
RSHRGEU8IqQJpwSTQMjCYpwTUgbqRKKBkaUU9KIqQJpwTTAYExTgJpwTSiqAGSaITTgIohNAhoRT
ginARTHH22fjWAe3X6U21FW2LkeEgRXo/wBluMItPZhhVuFpDqnnNCdT41V5lOIFSiG2/wDmWY/T
erDmPYkqxbtDeOItmySlts5BqfLXr3r5v4rlxdRiWKErd/7PV6CUunyPI12PXmMM32EMLctim6tF
aLSU5kLHZQrXsMwOyxBx5/D3H2r/ACKKcNuHhylOFOUKST2GyTWRteKVCEuK5Suqk6pPqKvi0scW
KXUFFrebyj+7X6fw1+fxk0tz7ScN9yzh2P3WHWbjeLNt2yFEpGGvrzPpbzBAiZzST8J6VDc8M2qo
vcEbQ5y1SbI+FSFD+AnVJ/wnTsaqcTY6jhjDnb7G7JTxsEh1q4ShJfa1ABQTod5AOmlUMKxZb+FM
4vhV1d48y6Q23eNANG3AASEOIO2pJUTpVpSS1L/hg6vS+S89fFdq6hRUVNqJcQpMONnsoVxjjrhe
x40xe7PvHueKIyoYdX/cupypOVXYyrQ/pFd+9+wjihDbdxcN22ItJCW8QtVZkkGQAqehg+FXyNc1
424Dv8Pul3LiUMpcAyXLYJYWex6oJ00PyJrs6bO8eTUnT/f5nNnj6kNMlaPM+MYNeYHeuWl9brt7
hG6VjcdwdiPMVjyK9C2WEN8TXLGCY9aB4JBU0XCQtsiTCVjcEAeXrXO+NvZZdYChy9w/Pe4anVYi
XGB/iHUf4h84r7DpviEMrUJ7S/sz5vN0U4LXDdf3OeRSipFJimlNeueWMHWkKdlpZYoAQ3pwoDSj
UspCpUqVIYDSg04CaOWgKGgU4CjQO1ACoE0poUAxUAKNGKpEgijRilFUgANaMUYogTTAFKjFICgB
CnUKMUAKnCm0RtVgOFPSKYKkSKdAh4GtPCaSKkSmqooaE0cnlUoRTw2TToCsUVGpFXS0aiU3VJCZ
SWmmEVZcRFQkQadEMZE04JmiBT0imIQRUiU0UpNSJQallASmnhNPS3UiWzSKoYlFPCKkCKIRQMaE
08JpyUU8N0CIwmadlqQN0ssUwojCaOSaaq6aTomXD2QJ/wAqgevVpTPhaT/1GubL1eHFtKW5cccp
cItFOUSSAB1NVn71DaFFsF5Q6J2+tVw25eKAQOaqJlw6AelTJsufo6SlIEwDXk5fij4xqvudEemv
lkKXXrpIObKk9EaR86SWEJVqYB6jc05oBTOQElIJgg05DQTOXevJyZMmV3OVnXCEYrZFV10sKKQN
JmkVhI/E8EnSDSuH0KTCsoIMedV/eCr4RsNzoBUUDe56yxjDPdHMyFB5k6tvI2UPWqtpd3FmSpHi
ROqTsaxamMQuMfvi9iD9u0hyOU0VIzkGZVIgyOsfOsw6yVoGXQg6BO6q+Va0Okz7mDeSNyRnhitl
xJhbmGYkym8s3UZF2tx1H+FXSosB4ORwuwtvArl1yzzLUbZ0ytAVuk/xDSsRdYNeWbKXXmilMfEP
ynsrsfWha47cWUBzMtKTpBhQpxk6pPYzlii3qQr22T72r3JxeEOOLzOsW6Qlq4kAKH+EkCJ2E1ms
L4uuLJ1dhf24aaX+G3YPr5inUmB4CZBEmADpodqIxWxxpH+1DM7/APWbELT2kdasLQtrD4cy3Viq
RnGpRuCQd0KiqbTq0c7hXBDd8Mtqa97wZCXCz4k2a9FsK10TPTX4Tv0PStSdxJLmH3aI5N42hcoI
iFAHQjofI1PwjxA3i+GpxDBFvO2LJIcQtsqvUKG6T0WiCNuiQIE1sTl1hnErS/eOXaX60hKnUAKC
h0S4n+R2MwdK3UnjdS/f3Ob6lcTzZxBwG1fBV1gQIcjM5h61SrzLZ/MPL6TtWhLbKFKSoFKgYIIg
g137iLgq44duUL5eREwhxsktud4PQ+RqXiLhbCOJsOZRdNli55QIukAcxCuoPcHsf0r6bpviWhKM
9157r/f6nhZeh9S3HZ+P3wee8tAisrj2Bv4DiDtq940pUQh5KSEOAdRNY0ivo4yU0pRdpniSi4vS
yOlTstCK0IoFEA0QKQqAEKNKlQUKgZp0GiE0AR5aMCpAielHl00BHFECn5aOWtEiRkUop2Wjlp0A
yBSin5aUUUA2kKdQinQCFKdaMUcp7UAMG9EUcvlSiqEEGKkQZqKnpNWhlhFWEJqs2atNHamOywhu
amSzNJhMxV1pmaC0rKZt6hcYis0LXMNqgetYG1UgaMA83FVigzWSvGspqioa1RixgRFPSinJHlT0
pNIEJIinp3ohJ71IhqTS2LoSDUydaKGKerIzqtaU+pqG0t2MCU08AVWcv20DwIUs/wDT+9RuX7hQ
SkBImPCM5rin1mGHMr+xqscn2L3w69KjVetJJCTzD2QJqgUOvjPHMSnVRcVt6DanqYyMB9TsCYCO
ledk+JvjHH8zePT/ANTJV361AhIS3HfxGoDnutCFqXOgd0HrFNdft2ggspC1D4ztRexJb6syQWlR
ATG3mTXm5OozZfqkbxhCPYc2wpTvJfWEgb5TE0U3LFm6Scy0IkAxNUFOJ5x5zgWSYJQJNFLqs3gR
lA2Lmv6Vz6fJWqiyL645qiwhPi1gdB60xy5SteUrWkR01J8vSmJs3HYmSP8ApFWU2RYQpQKQQOgq
qRO7ImA8G48IB1zL/pUC0POrIU7mTP5dBU4caEJUrOroNz9KkSy+58LJaQfzvHKP60XRVJ7FIYep
RJBypntrU6bS2YEuKH/Masm0SE/iXC3P8LKco+poC7trcw2222r+I/iK+ppa74DSkeqOLCpWOvns
Ej6Csem4U23BVKQZg1b4iWTjN1KQYVtWNVqBB8wDXyiWyPvI8GW+/wCxwniFFq7eNYdzbRotpCi4
XFlIKitJ0O+wM7VcvsKtbxrmS3blR0fYOe3X69UHyNU8cs7W5aZF4yy6x93HMLm3LjZUAvLJT4km
YgjSRrVPh/hxywsLZ+yu773W8sioW1xDqQsNNqJQ6k+JJKyCg6jSun0k8SyWeasso5XBGLetnrZ4
/EhYOx0UKy2FcSu2YLbyykKEFxIkEf4h1rB2NssLcceuXXHCVQhRIQkTsEnass1hyLq3UpbyWiFZ
RmGm35j0npWT22OyrjqlsZHA8CwyxU87hKW8PcdXzcjSiGlLMTl/gOg02qLEEKVeKbfCsMu1kZn2
kw3ceTqQPENdxrqd6w7zd5gr+gLYIkTqlQ/nV2y4rTcFNveIStAOiVnT5HpV6nJ3yYPGkqLzOIXO
EW6LbGWWnWHEwpR/8s4OgbUdZ2OU9Z2rE4/wu5dI96whReS2mF26h+KkdND8Q8jr2Jq9jDOJIdsn
MJi6sOZ/tdq4AVZTGsHeI+JOoprFsu0XzbBxagNrVa/Gk9Slw6r/AOE/rVRendHNKN7M5LfpUhi4
YxS0FxYOOFWVQI5ZndJ3Sa1zHvZhd2tqLzDFqv2CM5ZIAdQk6gwPi07V3S/tbHidtQuP9kuo1dLe
Un/1EdPn8jWCusLvMHWWyjTKEpAMgxrKFdfQ616/T9dkxP5fxR5mTpYZPr/BnnBSSkkEEEaEHpQi
tp9oYbc4ldW0kALQlSiEwSrWZ861jL3FfZ4snq44z8nzeSGiTh4GxSinRSitGZ0NpwFGlSAIFOGl
NFGqSAdPlQMxSoVaQBpClNKapIkUkUZmhSp0FhgmhlNOBpa0AAImnhsUBT00DQ4IApZaQNEzU0MY
pIqNQqVU1GTWiEyOiDRiaEVZJKhUGrLS6qAVIhUVVBdGZtXAazNqkLArVmbjKazeG36cwBNDRomZ
9ljNpTnrAxtVuybDzYWnWO1ZxFgH8PNwlOZCPiI6UjdKznGM2haExWDySa3zjZq0tLBh1NwypTmy
ELClfQa1onP7IUfXSs5Z8eNfNJIxeNt7IclkkVIlmB/Oqqbtbg0IHkjX9aetoJ8bpURGxM152T4l
jjtFNmscEmtyfmtIMZpPZOtI3ZGiGvms/wAhVRb6QmBIA6Cmh5wmQlITMeM6158/iGaf0qjZYYrl
2WjdOKnM6EDsjT/OmsNZsxRqJ3JqqrmLBGpHdO1OafU2CE6ielefOeTJvN2bxUY8ItvMBpKVKIIz
CQkUxGIstPZ2WgUHRIGn6VE8p24TlMhBoOW6wlISYJ0OURWSRTbvYRunVJcSlaUoVqQdJ8hUCVBR
MFSlA/CkeEVKLKRqqeveilDaFBGeSeidSfkKrgnfuQgHTwoT001JqVu3W8RnzLH+M7/KrSbR+ApD
BQP4nTkH9atIwlTUquLoJT2aEfqaTnFDUWUjZgkyQhI7aCnsNNLVDKVPq7Npn9atOO4TZmSA+sdV
Ss/0qrccSgpystQkfxbfQaVNt8Ibpcsu+63AylXLYB0lZzq+g/rTnrW2ZRmuHlv/AOFSghP0FYNd
7e3xhtKss6ZBApwwm5c8TrqUfOTT0v8AmdCtdlZkHMXt7VBSzkRP5WEhP1O9Y53GlKTDaMh7xJPz
NTsYVbpeSFZ3SdSZgVkFWrLDZUyltsCPERJPzo+SJVTfsYQNXl3rlUR/Es6U9vC85IeuEiN0oE1a
cuCtfxEA6a61KlIbVBiSBtT1MSgnyensUbdxe9ucQsEKubcwVFkZsvy3/SsYhU6eexqS4wq54evi
q0uHFN6ZLlsFIUPWrKsf97UPvG1buidC6n8N31zDQ/MV8w144PtoSpGJ9ozGI3F3gLmFX5srtFtl
SAopC8ywmCdu+9WPZFxBiGLXybK/wxFqli0K0XLWZCXkQhAlHwlUJBKt6qY1dNXOLW5Q+MlutKEh
zQ5EqCpnYncRtWzezjm4baBm6BaUhlRyKc0nKnUCP1Bg7V3Ol0rj3PJp/wATq7GvyUPLGhGY/vV0
3dza4E87bNe8cq5QtTC3AhLnQAkgg77HSqbg8ajvJrK2i0I4bxFwkZUOtKIkd/PT5GuKKuaPUyus
TKtnxnheJsXTHuy7J1DZcVZvtkggaEp3jXqCRWAS5b4igu26XQ3EhTqYn9dfWsvw3ZJuwgqlKF2t
wUgSnQkagdPkYrFNLISBMpA61tkjGEmonJ08pTinJlyzxW7wtSACVtiDkXuPSs8jFbPGEjOrlP8A
cCD8x1/esey9ZXl4uydu2feciVoYfWASCnUgx4demo7xVDFMNFo+EZwhydErICp+R19RWXfc2uMu
Cfim/Vg7Fsu4ZceQ++i2F5anxt5pAKv4wDHhV33q03euWFqE3YRc2CyE8/dtRnrpLajO0RWPtMau
LMFDw5qDoZ1kec6GrjXuz7ZdtnVMZhDrAJKVidR5eh0rS00kc8oNNs597RfZ85irq8WwhZuUJR+L
bK/vE+Y/i/1vXKXbRTailSSlQ0IIgiute0vHrjhviM22Gs+52xaQ4EqGZMncJB0A0G1cyvLl29fc
ffcU684cylrMlRr7H4dLN6SU609vJ8v1kcfqPTz38GLW3HSoVCDV5xsmq62iDXtJ2ea0QUhT8vSh
FaJGdAAo0YpZT2qgoFPSgmilBqVKYplUMDGlPTbTvUyKnQmaVsaRAi0Sak9yR2q2hsDzp2TyqNTK
pFBVmO1M92SDWRKNKjUkHpTUmKioGE9qd7sDtU+UDpR0HlVWBW927UCwupTdspJBWJqpfXLhCOQX
FBfVAPhrnn1EYK7sekkcYKkphMECD51H7se1G0L7ZhaXFJPVW9W0FbhVCBoY1P8ASoh1mJRtuh+l
Jvgp+7ntR93I3q0VqSSDkSR5T/OgEpdPieO3QQKT+I4Y+WUunmyoU5abnTtIPprV0WbU6wox3k1G
FBCSkCAK55fFV/JD8y10vllcGTolWn+GnpcWkwBB31NMaW0FLKwVHPGX/DT13SUIWEMQAoQSPhHa
sJfEcz4SQ1gguTLYXxJiWHgKt3dI35YUB9aDl/id0lxtd26EO+NbZdORQ9BA+UVi3L551x0ZkoC4
kJMz6GkW3HyCOarSJ+GPr0rinnzZPqkdCUVwidTLKEtqW8Al2Zy6ZQPMVXW+yEKhMuTAUR+WiLQp
gEtoI6k5ifUUfd1GYWcvkIBrCirZOy6hXMUpIZBOx0I0FNcfadSptK88jTKJ61ALFGXMr5SdqelD
OcJQpS50KWwSf0p0hW+5G4sJVGUiNNSE/wCdNStZ+EQOhSn+Zq5yeX8FvlJ6ukJP9aY4h1IBWtDc
bZRv8zStBTAEEwVJE91qNBbiEEBSxPYGajW8wkguO80/wklQ/kKYMQQhRLbUDy8M/Si32QfiWEIc
uEnlNKI/iXCR+tWBZqUfxn0NZTqEgqP1MCqHvt68YYbLY7oEfqaaMMuLh2HHPGdYKiSaW/d0G3ZW
X1uYcwYWtT5H8StPoKYrHmmUZWGOWn/AAn9qY3grYBU4skJ31Aqe3t2UupyNJKe6hMVHy99ylq7b
FH7xurkkNgp/4Rr9aKsPvLhQ5zgSpX8apNZO7KkIVk38thUTQVykuKJyaanprTUu6Qabe7IWuHQC
OYtTityE6RUiGrdhRShkAjqrU1Zdum9Uh3JKfiSJJ8qjZaulsrCLZSgo6LjKI+dK2+WOorgsMHMy
J8vKqrmZLkJTlAM6a09uzunEZSjIB/EQP86t8thjV93Mvbt8qS2ZpyUS4lpKTmK1bbU8XAc/CDal
iJyp32q07yHiElsLI2GpipRbuqbhltCAdNCBTk0FGOZsXnCVS002fyrOY/QUDhKEmVv+Ab+GKfct
XKCGwseeUgx9KiNipf8AeLJo3e9k0vB3THMq8Zcsn8TuH8jaHFIZccbCFZj4VAGDrB7/AEq624lx
BBhQOgUdSKo8RqS1j17lUtWdcqK1Ewew7Cq7FwUjTwnuK8SStI+qxSSszN3hmD3Dwt2r9yzucoM3
SCW3JG4IEj5g0G7HHcCQkwbjDswlSSHmY9R8P6U7GeMsOwS+w22ftC4l+2RzVtpU6S4IIlA20V0k
+VXsKxnCsSc5+BYgWXuvubgIPqk6x6gUqko3Wxlqi5ON7ojaVh16YW4vD3ySQuOY0ddJjUfrV+Th
eD3SVuNvBx1pSHbdwFJGbXWNPmPWtRRevP3DhuLZNuJOyjmzZjIKSNPrWXsbS8dtw5ZOAOhzMmF5
FK06ToY7VlWmSZ0N64Ou5k+F3kLWygfCbe5I3AMlOv8ACfUR6VrSmgNjlPcVadxm6srtRuLYMXeV
QK0I5SiDEyn4TMDWOlEWKbnKbV9u5URq0fA4Pkd/karJLVLUZ4VoWllPi3DU3t3ZtuNpcSbdJTm7
hCtRtB9DPlT72yRZX7S4zLVasnMoyfgE7+cmreMlK7u2ESE2+VQ7EIVIO/6j503iBYXdMSP/AOMz
qP8AgFa5H/44IwxJPLNkbLturltOFAW4lSglSgkmD0/1FFdqm0uEFC41BGuvoRWA4qwxNzhWHO6p
cStzItOhGo+f61mLSz5L6QvxrW0yStWpkpE/U61nKCjBTvkuM3LJKFcGhe126duuJmkLJyN26Mon
uTJrRyjQ9a3b2sI5fFcf/wBdv+daXOtfbdF/88K8HynVf++f3Oj8L+yizx7B2r1d+8eYMwKAlCYP
SCCZFPuvZBhaLhTJxG6Ch0hJgR6VmOBceTh3Dlsytp9aggHwIkCsjdYii9Wp1tlWcmDnERp614M+
p6hTlpm+T2YYMDhG49jTnfYzZNiVYk+B0lKf6ViXvZ1hbU/7beED/CmP2renb9TCVS2oICYJB289
6wj94y6tJQ2o66nUj6ULrOqrebIl0/T9omIufZbZs26nE3T8hMiSn+lUF+zpDcy/ciBKpaR4R069
a3rEbtxVi8ktODwESY7eta+7fPlyQ44UqQAcwidtN62/i+oS+syeDDf0mCPATaCQXrkEDWW06HoN
6argZKf97cTtqhI8X8O+9Zdy+eSglbzySuFajciq5xB914w+6olwKAga/wCf6U11fUv+cyeHD/SY
48GAGEuXCjsPAkSeo36VE5wxym8yVPqnVOiRIG9ZlZvEEkl465gdAQesa/vVJ1q7Q2lSluJyBQIk
de2tV/FdQ/52R6WJcRKSsLYaTIddgDaR/SmrtmG28xU5lPVSwP5VecvGwgk26oETqn+tYe4uF3J5
fKTkk66afrU+tnfM3+YtGP8ApH5GVSUhR8ubTEtWyyYSpXqo1AlDjeZJbCgNPik/Wrdo6sMlo287
kKJO/wAhQ8mV/wAz/MSjDwQ+4trC1jIhKY0VuZoKs2Wioc1slKgnRA1nr8qmas3lrVmInTUpIIpy
cN+LMsIP+BH7VOuT5YUuyKilWyYzPmM2UlKY8P8AFUPvFsVDNzF75gJ6bVkfu9IjxrMbRAiqV5aJ
YcASTkOwn+lCoHZVTdNKAy26lEpJJ7nv8qci5ytZggNyANfzedJLLagZyIG8qVRT7qiRzUKIP5da
uiL8lNTgWtRMqJ7UkW7khYbJkfm0mrfgVPKQ8R/hSYoi3W8YTbKUf/uOAfuaeyJ5IEBSE7NtzuSu
oy2pSpKwZPRNXRYvDUJtmj5rJ/lVN5SmtFXCCf8AAnb9aE0+AdohFspa1AKVlCvTWpUWyUSVhJPd
Zqou5SCczy4J6E/yFBF3bhJHIU4qdyP61e5naLnvKGjCXECOiEyaXMccMBDyjE+IZR+tRC/eIhqz
KR3M/wAqUX9wsAFDRjYb0tyvsWkJeA2aaHckqP6VGtxCT+Lc/JJA/aTVdWHOKI5z6lEiQBOtTKwq
3ZYQ4VZ82pCjEUrXke/ganEbFkyWeeRp4pI386D2Nv3ACGWQhM6BA/pU9iywt5IS2MpH8PX5099S
mVwmYOug2pfLfAU65KKG79xQVJb8yQKnGEvXKFuuPKeCRKy3Kso8+1WmLllkZVFJQFQT3r6c/aY+
119n64+zBxTwDwDd2lxjWKYU1aNM4Hgq2WEuBTajnd5aUwMp1k61z5M04SSjHktRj3dnzAGF27Qm
FOED8xirNsyjMkpShtI0JSJn61Cp9dwkoS3oR8S9BNRBp9IB57aVA1ru+WGy4RcvxyjKSSCY16Uy
2Wlp8KcWE+ZIEfKokIt1q/2h5T6yZASogfpUHvFoSMjGaNjG/wBaEtqC97Lty83ctFLKs6krk5EE
z5aVE2+/boQBbqkfxGog/cqQeW3kbnYf5VGu3uFIzlcdwBqKpLsJvuWXr1RSsOvBnN+VAzK9Kahd
o4ACl7L/ABuLgH5CqtraqL5z5lKO2tZQ2IbaSVBISo5hG/WhpLYS1PcLN2y2fwGVZojNH9atJuLt
6By0jsVyqn2rKEiUgaVet2y4veQNTWTo0SZj3bO6eBzvKHkjQUbThsXCvFJPc1sNswl0lITr3rN4
ZgT90tAQgwe1Ck1wbwxauTULXA127jiQjPGgOWf9fOsxbYZcNgJKlgdgsJ/YV0ew4BvoShNqtZBK
lKIgAb0274Ru7YFbraGvUE1lKafc6lg8HKrrDvdH3EufiKnNmnvWPeXk+FKRW447YLF45IB0HwiB
WsLwm5vL5DFq06+4sSlplsrUT5ACatSVWzmcHq0o6VjVxmxe5PxSo/uarocGkEoPntUmNW909jSG
rHDri+UpClOBopBRCuxid6tN8MYwtIIwu5SrSEKCZ/evNa2R7kXZT4seT978I+MCNSrOUx4kjcbU
72V2SS288G0h3kZUulsSNNsw1+VSY/wzxE/iGB3Vtgl4v3GQ4ErQhR8QMglXlV7gDA8U4fsnm73C
nkvqQUAIQgqEpOuYL2n510aorp9Ke/8A04nGT6nVW3/DDMRagNaKUFEqOupJJJ1M6ms61iuG4fgv
vN/kyIfAPMBjUEakEQBMz5Vj18L40pRAwu4J7yn+tQY7wljF/wAJYjZIwt1d46tBZz5REHxazppX
PpUpK2dblKMGkuxvf3hhOJWY93vDdWuxbcSHgkRulQOnyJrR1vNOuqLLbzbIPgLxBJ89Nq13gDgD
ibhrG3Lm6sHGG1W7iUlp1KpWQMsgH9a2JOD4m0kNqtXyrUeJaSonzlU70smOMJVF2ThySlG5Royn
umK2rYdLIv7cDorOUTuNPEk0525t8XCV8z3R1CA2EOgqToIAzDb5irOHvPtXISbC9CA2gc1GVKgY
gx4tRp1qjiP3jd35V7k4oEauulKVEAeRg+tYOMmbRaTKnEOZvCrBtQ1Q4vMpOqdddxWWSkLu7fpm
YtyCP+FNYtFtdIWpTanLdSAQpLiPAR5kSPrFX2Xy46j3pss3CQkJLcZSBtptEdqJyuCj4FCNZJS8
mg+2RpLfFqZUAkWjZJ7aqrBYfwVieJ23OZbbSk6ZXnAlXkY7HcVnva5nueLEZElRFsgeESdCqtHv
7zGuQ0hjEbq0Q2MqEJUUJjtI/wA6+s6f1f4bH6TXB83n0LPNzT57HVcHbvcHw5DC7Jt8okT7ymrD
2IXAXC8JbCt9LlP9K0XhbC7rFbMOXmJYilJBhZulDXqI2Pr51K/hSU5WvvK/U4RmKDcq0HrNeU46
ZNN7ndGbcU1x+H+jO3vEaCpxpWHBCxoZeSR9axx4gbKQW8PnL/jBH6Ctn9lf2ZuOvbXh2OXvB2E3
uM2uDqCb177wbaDZKFLHxrBMpSTpNczewxhkD/artAiSC+QaacXwZSlP91/o2g8RLuGlgWiAY/M6
P6VIMb5qsqLRp0gflfSY9YGlagvC2goJN1cpMEnM+TpT2cCbczKbuXpkAHmqEzVUiNUzPXWKPLUZ
w9EbAB0f0qmvFVQr/YQCBuHB/SsSrCGllUXr6giQSHVRI6VWVhjBXlVcPk6A/inSqVENyMwu8WoA
FlvxaZS5/lVS6uDGVYaT4p/vCR/+NUn8Is2UpzPPqzSQA8SRHftULuGWKAMxcSk7ZnCZNCjEluX7
/wDwy3vagA4HrLtGdR3HaKYL5bKYTcWaQoTJQs1iDhNiWwooVAkklZ/SpsK4et8axixw62ZTz7x9
q3aU44QkKcUEpnykiqqKJ+YtHG3EiTc2wST0bP8A7qavFObBViLTfmGxp+tdP+0b9k7iH7L2L4Jh
3FysIunsXt3rhhWF3LjqUhtYQoKKkJ1lQ2muR2drYqWCq1bKZ1kGaE4yVr9Cfm/bLSMTtZJXiywe
sITr6VXdxa0LhHv76kx3A/YUVN2ocARaN7iSU6U675DK0hNuhJWogQkACPlRtYU/3ZVOK2QPhduX
P+ZVRfeNqpRi1dd10zSf51edfShpKkJTICQdvnT/AHtCLdZKgVjNCc8QadhTKib8ABTOEJA7qQP6
UOdiLiyUWyUFXSYqZrEG2w4248lYUE6naoWL0NupU4rmQSBAkCj8BfiNcRiCkypxlA9Zq7gvCeO8
R3Bt8Nt77ErjSWsPtXH1a7aIBqlcLKiXEtOFKkiBlygV6C+yP9rV37Ll1xXdtcML4hexli3abQu/
FqhotKUqVeBRUDm6RWOaWSGNyxRt+OCoqLdSZ58VhYbcWh9x9Lraihba05VJUDBBB2MzU9nhti4p
xKkqJABSc2ho47i7uN41iWIPNNW5vbl25UnMVBBWsrIHeJqFleQBSb1pGZIB8JJGtbfNW7J+W+C0
2i3Q82lu2bAKwCVCZHzqfEFtsOobaZAKjuBED6VQuHmGwFe9PlSvEkhMdfSgcRZQkZmn7nWZdJIn
0mKWlvcq0jIt27LlkArIFhK4UsxJqvYKtkOoLqvDlgxJ1rFHF3E3CSywGlKVurX96ySLu9XbKXzU
uELCQCmQBG4ocGuQUk3sWF2fvD2ZDD7jZRDZICQD6k7b1ALFxbaEO5GE5SCp1Wk/KnAXa0pKrg+g
qhi1rnGQuOLI11OlEU26sG6V0WWbFKwksXgJB2Q2pVWFYXlazLK3uWJJUopAk9qx/DrLrd82kLUW
5AAOoFdVxm1FxgVqrRtCVwsJAGYxpIB12NRknoklZeOOuLdHKzbLQ7LNpmMyIOlScnGHxCWFQfnW
3IaYQqQCenQCrjDjCFQloFXmSaTy+wLG/Jzm8tL5tWR9amlnXLEVBbMLbuEoWC6SIA6k1sHE1+h3
FlBKkCEpTCY+lV8FS67ijIQkLVzEkSdq6FJ6box0LVyZX+zWLO4StxGEXKGk6qdDCoA7zFYpNkGV
BISqdoCDXsn2dpvzwtfoPumU2qsySFzGUzrNcwDNolwFDRKhspaxv3ivKx9W5OSa4PTl0qVNM4U3
kOZvUeah1p9lh95id4LSztHbu5c0DLSSpR+n716l9mnstc9qPEnutswGbNocy9vloBQyn/3HoP2A
rvpTwx7P8O+4+HLNllhMh+7KErefV1le+/QaDpU5OuWPZK2OPSauWeH8C+zxxFiZSLq4asnD/uGU
l50euXQfWt8sfsrNWqAvEcRvCY1SspQR8gFGvUVpiDiLUhtIsWVGQlpHjX5wP3NWLNaSsFLJVP53
TmP02rzZdbnn3o649LiXazyRc+wjBWwTaYy4XNQBJUJ+aRWq4v7LMawJC3mgL60G6mhCh8q9gcX8
KLt82K2qQlpZ/HbCE+E/xbbHrWBtrA3ICQgFXfKKcetyRe7sb6bG+1Hnfg72ZcSY4tsWfDeL3WcA
hTdg6oEd5y16/wDYN9jjinG3Wl4rgN1h1sqCpV4jlEeYB1+UVuHsG4yusExlnArl5bTCyRb5lSG1
fwpnYGvaPBeJOchCyrOkjVRVM10x6v1paZbIwzReCFw3OfYd9j/hy1sA244FPFoNlQRpPU/pXMuK
fsCniPEXHX+JbbDrEE5Gra0Lq4/5iBNeubHiBrEb+4s20qDrDaHVKPwkKKgI/wCk1LesF5sgulHm
kCvQy48Khqwnjx6nPGVSZ4f9mn2MPZ23xVxTbcQYa5xSvC123u7l64ppGVaFEhTbZCVapqm9wLgX
Bf2gMZtMBwfD8Hs08NWqks2TCUJSfeXASIG+m/lXozgyxbtfarxpaFfODtraXKnF/EfE4gJgaQB5
TrXJOLmrZr7TuPW/MSlR4Ws1AbR/tT1fJdbOb6eTb/do+m6KV9TXt/g+buAuYvY3lxcO3uBouXEc
r8e8U1pmnaD271sBx/FwhIF9w8QB4pvyJ+cVjsPsLdV8SbJaXgJAEKEH6its4ysn7XAMPOC2Nq7i
SyA6hVshwpB3Kk6V9FJRbV9x1KMW/BgF8VYmQALrhhEflVih/wDbVJ/ibGC4VpXwxtlgYtvr5prc
n7WxFmyDa2guS0nmZGUwlf5pEH6VWv04ap1Atre20EmG0wD16UoqHgbU/Jp7XFWMrUqVcOJSBucV
n9k05fE+MATz+Gde+KHT/srZ7teHIuUqZt2S0VpBKUghIimi8sE3IUWGjbq3TkBA+cU/k8Bpn/Ua
r/aTHc2cP8MEQUwMUIn/ALapv49jSpzOcMnXf71Mj/trcjiFgi6nlslmTCQ2II9YqP7ztUqWos2/
K1yygf0q7jxRGmf9Roq8cxzPAf4b/wD9Q6/9tV7jifGlNhPMwEAa6YkT/wD81sltjd07xFiDd3Y2
owkIBtnFMpCirqJ6/Si/e28ri3YGsg8tP9KpqK7ELU/5mazb8SY0+h63btcLvOYhQKLXEJWJnuAK
1MYniWA3KEKeubBIUMtvfIJaB7A9vQiuoMJw+8sHg7YsvKKtwgJPTqKLeFsOWgQxdLabykqYuIea
G86KHlXNLMotrTsTLFJ76jlnEHFakcXWF/etJbCUIClWyuYhYkj11nbWt1xC5avfZ/xC6hpPOaQC
kranKYAmCI2qviPszssTtmb1uxQbV0Bxu6wsylfUHIr+UVkuBbu7trrFMKULS4tuVnLjqFNGTKQl
QAMSAe4862n1GOUIuOzhX9mc8ITjKSlxL/RzLCcTeRhrDCHW/DJIOhEnUmm32JMW6goXrAuAmNAa
fxHa21lxjfNttNWhahBbSoKSDAmD1E/vWBvbhIuSSc5I/LGn6V3xrI9fnf8AM4ZNwWnxsdh9jP2r
uNPYPg2P4ZwpjGH2trjpBvW7qxTcZoQpAykkFPhUa4+rEWbhwh28bSDEZE1VXdIEzm/Sqz90jIfC
SI2NaqCXBi5mTU6lJ/8AONBuCArJqZqH75W0sBq5QUAgyG6Y0wE24yPAHLJTpHpUKbkgRGUAdKpJ
MTbHKxMNBXLuIB1IKD26UXMQQUlzmqClRJLWmlEcy6d5TLS7ha/hS2kqJ+QqX+yuKpMfdF2HDrqO
npNHyLlk/M+Cp94tqGtwoqgpkI0ih94tkw68SnuG9vrTlJctnAy80pladSlaYim3akhAPLJzST5V
VIm2P97/AAzL6lJUIgNjrUdrirtjfsXdq++y8w4h5pxCIKVpIUlQ06EA1IENtshIeMZYidKrruEp
VER86aSYm2jZfaH7XOL/AGq31pe8W8SYvxFc2jRZYcxB0ucpBMkIEAJk6mBqd61y1uWXiWwh4OnX
QwTUCrxPYD50bRaXHc5B0Gka0aVGNJUhJu+Sw+sW6uWph8GIjPr+9NS+Eo0tFOCZBWudfrVy8CUl
tSEhRWmTm6VCyw/c3LdtbMruH3SEtNtJKlLUegAqU1RTW5R96Ul0pTbIGn+8Gapkc5SglDLSVETn
iP0rreAfZv4pxxlN1cXNphaiAeWsFxQ/4iISPSTSx72B4jhrC3LfiHDcQuwCCygKT9FCQPnXK+sw
atKkr/E6F0uarpnInG7pYz52wdtqFm++HCguLBMkqSOv+oq5iVjeYRdOWd6wu1fbHjQvr5juPMVD
hmci4ghXiSJV8667Wm0c1PVTLNzZuykB91QIkmNfSohhxIlRcUPNVXLpS+WiYMTBB3rHi7XlnKkd
dSTUJujTSmR3NgwkQUJnfVU1LgTare8CkmUAjTQ/vVB+5cWrMSkTpAFX8KWnnCSomdhNXK9O5mkt
XBn+ILYtYgpbqsy1ISpPXQisS44ESkaRvNZjiVZN2kpXm/CT8U6dhrXWvs3+xOy40U9xbxSzn4ds
neUxarOUXzw1IUf/AKaevc6d65JZY4cfqT4OpQeSemJzbhH2RcXe0a394wTAHbm0Tob94hlhJ/41
QD8projf2VuPbu0LlyrC7RKSYh1RSrr8QTH/AMV6vXxgsoFvhtuyxbsJCUuFADTI6JQgaegFYpab
jFHs9wld2r/6t0oq+idk/rXhT+JZZP5Ukj1YdFjS33PFPGHs04k4EKV4rYhVqk5ferZXNa+ZHw/O
tAvXea+4SqZVX0fRhiLhhbTrDK2l+FTRaSUqHYiNa8f/AGmvY637Nsfs8Vwy35GB4tmCGkzlYfTq
pA/wkHMB01HSvR6Lrlml6c1TOHqumeOOqPByzAxFwyeby0l066A7Cun3K0HBAA9zcq0nKSCOuumt
czwIpS9bktFai4roP510e6I+6SpLeTVPjMaV0595oyw/QzUrpwi5MLUEkA5U6RVDFnctg7vJjWT3
q1fqy3OX/Ak/pWLxp6bMDoVCphbmjpaisbddjCEbGIE7xWe4dWU4k0oOFtPMEkATWvZsykidJ0rY
OHA196MB1OYcweGCr9K75/SzzV9SPYvs0tUrwZ5H3i6lCrdRkXAAVKTpHWuZvuvBaWkIyqWoJSlK
dVEmIrpXssNk5aZTh7riC1rFpmG3pWC9ndgL72rcKWr+VxhzFGQpoGZhc6j5V81ilplOz6GSuKo7
9iNin2LezXC+FbJQGM3zfvGIXCRCitQ8X0+AeQNaThaiXGswl5f93mE5U/xH+Vbf7UQ5jXH2IqWs
lKFhoDskDX9ZrWeGLJzEL959ad/hHYdAPlXBq1XJmiVbG54ZZFafESe6jqSe9bNhtmhKtAJ2mquD
4WQ0NIHkNa2fDcIAlZ0jqazbNCNOHtvpW043nQsFKkHYg1zu8wBWE4q9bJRCUK8BPVJ2rtFhhkKz
LE66VieN8Ay3Fpc5dFpLZ26aj96zkxrd0c2sbJ23xKzuxo4y8lQ03Eivb3Ctyhq3ZzLUCUjKkiI8
q8tWuBj3cORKpG+vWvR/CClOtomEZQBlJkj9Iq8M3qMOojcTJ8EXWK3vtLx63XcW9q2nC7N1KWUF
wlJdfAMqgA6a6V0O/wANdfaI+8LtBjdpaUfsmuM+z44jce2viFq5xYtoHD9kpKbNlCPD7zcAAlWY
n10ma6fi2CJeZOa+xNfmm8cR/wDiRXsLLFYa3/M+fywvNV/2ObcH233P7a+K2FXl1dKdwm2cm5eL
ikjnLEDy1rLYzwjhDmNvYsuwYOIutpZXd8oF5baSSEFW8AkkDzrTeBLdjC/brxU2lV4ta8GtyDcX
Ljp0fVMZySNxtXQcWuhlUCk69SP615m0obnqfNHJa8I+MOAYuvD8UW6takoKBlyrzARpFdZXxsz9
22iTcpKskHTWvNlnfhF4oiNvyLPetTxzjTGrG/fbaxe7S2l5aUNhzwpSIgDSvpJdL61b8F/xiwrd
Hp/EOLGlSA8BJ6aVgH+IAVnKsaGuI8C8Z4hiGOlq+vXbhgNLOR2CJ0g7Vu19jlu0w64SAEiY71m+
n9N6Waw6pZI6kbPiGOruLctJc5cmZCso85Iqlb4oplsoDoeUpcyleYAetc6N09jZdubh1LVqjcuH
wJ9BRtb6weJGG4i26+2Jyjwn5eX1rb06VGL6jezpysWKQMqoA86gXiqiNVCPWtKseIS82pLvheQc
qk9PWsJxxxHc2mFtLtLhbC+aAVNnWIOlKOLVLSVPqVGLkdIOKKIKivbsaoXmLKUPA4oHyMzXGlcV
YkwjMrFLlwKR+RxOivpW02GMOP4VaOOOFbimwVKUdSfOtZ4XBWc0erU3R2r2b4gp7DrsLUh1PO+B
1IOuUbVs2KYdZ+4OuptRmKSYaUUzp1Gog61zX2X3iXMNvMygoi5Scp2+EV0h2/zON2VugKdWnKBO
0/zr5/Mqys9TE9UE2S8GYKxe4Xbt2DrmGoQyEtsPGUpEaHN5dCRWt+zPDnr6y4qxAraUtVwUpJPw
oQFJEfQn51teF39zaOrssRkXZEhxSQnmCNoHWO1YL2JJauOEeJM3xB5f7KrObfpTfuv1DZTgjg/G
zzn9vMcKi24vmpBOw+EbVqt6oi71SlGYbp61sfH6QnjnHoQFgPJjy8IrU3XMj4lOU9+9fT4F8ka8
L9DwM7qcvu/1KQyqSB1ppSkHeIB1pyLZ1I6fI0Cy4hRUSAIPWuruczarg2BgEqQgoQQpMQfSqGF2
L2L4lb2Nt4n3l5EpI0Hc+gE1kcPtwu4aTyZnpOtZv2R2oc4vfUR4mLd1SRGxkD+dc7nojKS7Gqjr
lGPk29VgxwXYMWWHo/FeBDt3HjcI39BroKoYki6RapQp5xGZfjbSsj/qI1PoNBW68W4cbdyxMRy0
rUDHXwgfvWIs7RXMBjQd68ZT1fMz1XCnSNcsOF2MaS+m4t8zQTAcBOZKp6Gd65/xHhT3D+KPWNys
lSIKFAQFJOxr0fhWFl1KABI3ArnH2h8ERhd/gNwBkXcMOJVpvlWI/wDyNdHS536vpvuY9ThSx61y
jmrpXkSIRttNYu4gPHSdKvuzGUtp16A1QeQpxYUCDpEmvYjweW+SJUZelWLFeXZQSY69agVbriZA
HWrOHIOYjQxAM1T4C7aoyd/Hu9qT4xlVoncbV3v2DcCsYPgTOPXTee/v0lbWYassTAA7FcEk9gB1
rg+NJKMKtFkAAhYBT30r3r7NuDk3HBVjcts/gtWrSQI0ASwg/wA68H4jmePAku7PT6LGp5W32NXv
XH79Y5gKLaIRbpEJI7qjp2FU12b615EjKgD4G/CB8hXQ7Thty6smXcoUXGkuTPcA/wA6hHDJCtZB
O3nXziyI92mcD9sPAQ4k4Pub9LU4hhran21ndSBqtB8ok+orzdhyQtl9Rbz/AIiYy7DQ19DcU4SD
nDWKBSJAtHswI/8Atqr554Z4cPV4yiXU6D/hr6P4bleTHKHhr+54fXY1HJGXmy2/4UDwlO4rEqXC
PlWTu3PAAlRUfOqibUKSZTp617MeNzz7pmMUZjtNZbBkq5oIUAJ6iqTlsEqVoIFXsISA6CWsxnyq
5P5TJbyM9xQ+VIsFHKpQtsspEGQo7/pXvnD+C0cO8BcLcPMICGbLD2VOBGkuqSFrJ8ypRrwDjiSn
kkNhshEwDvrX1VtuG14vgRvUp05AVPo2k18z8TlpxwS9z2+iVzk2coscELgZS2Tyk7D+JR3NT+y3
izDvaNw89imH29xbNNXb1k43cJAWlbZgzHfQ1mONC7wP7Hsb4jQpDbmH4Su5bWsaBzl+D/uKa8Xf
Y74z4qZ9t+HYdaN3OJ22OPKTijJlXgIKlXCj0KDqVHuR1ri6fpn1GDJlT+n9s6c3ULDmhj8/tH0B
wnhtL7KyloEkyO1cc+3ZwgLf2Aov3GxmtsWtcigNirOk/oa9TYNw4424EtwlJ361x3/xCsNNv9lm
9UpJCk4xh4BG3xqrPo//AKIfdD6mX/ikvY+YeChXMtQlUDMrpJ3rojzS/uVRLkgKTKcv865rg2Q3
TAWknxGQEk9a6ZFurB15GilYKYUWyOvevqc/1I8XD9LNZVhwffK1pJOUAegqdnBbZ9CStpC0gzqQ
datIHikmT51ZYCUoGkaSBWTlXBojnVyw2m6cKUJSAswEjzrI8L5xituEICzzZ1VAqhcKKn3So6lZ
P61kOFkqVituEuFALu4AkfWu6T+Q5I/WezvY+rEnGQlu0tFQ0SQp5QMR5JrDey20I9tPB4T4T96N
SFbbmtj9jOGPuNNxi1w0XGyPAW59IKawXs5WGPbNwiFqKcuMtJUdp8cV8vF/NOj6Nr5Udz4ywxX9
rMaWZjnOHQeRrDcA4UlxVzAJgDrtW+cZsH+0uMGE5ea4PM6Gta4DQEPvo7pGteeuDSt0dCwHDkht
QnZPzrYLGyOQwCqTGoqlhJ5TJASVEjeK2TC7d1QGsDfzpsGWsOw7KyrMBpQ4mw1p3DLXMkKUHdIG
2lZywsc0grBPrV3GsHQ5aMDmwOZOh8qh8GalTRolng4NoqEwBqK23hjiJ4HK62hLgVslZUB+1X8P
wNCrVYlERvOtc04XxoIW6Hn0FaXCNEDofnU49nZo6mmjMezzDrrFfbfj/veP4q6FcPWjgRZui2CU
m6fhA5YBgeZJ1Mmui8WcLYEm2Iuk3lwepu7+5V+7lecuAMHtLz2y4t75eYrfBfD1u9+PfupGt07p
CFJGUdExArcOKcM4NbZcF1ZYWsjrcrSo/wDeo1pln82m/BisVy1Fn2TWWEYP7X+LEWFuhtLuFsGU
urWBDyp3Ue4roeN8YWGCPRdv27KHElH4i0o/U15y9kFzw9b+1riU4exhrbAwlBV7sGwgHmiJy6T6
1D7W+JbzD+GOIsUwHD8OxPGlX1naWrNxh4vMyleHKhsalRCjt1jStIKU5LGuWOcYq5s+YTGJJDiS
ktkx+WqLls884+UvoSXVFRUUGdelY2yd5K1SemxqZWLMAkF1CVDoT1r7nTp+k+c1qX1GVwdh7C7g
OG45iAkoypBq9jOIl20CZOqtZ0rDt4qy4Qht1C1bwFVHiFxmQmCR4u9ZNNytmqkoxqJbxNbuJ4TY
2DKkNc1whRWqAdzqflVO04VxOxxOwBXa263mUXjLhu2yC2VlIMAkgkg+EgKgTEa1Eq/TaIsHVqyp
Q4TOXN0PSqbGNMffNo8G0MIaASpxpskuHU51JJInUDSBCRpvXTjj8tHNkktds2xL0Yq+EmEgFMDr
rVfHcPVjFqlku8vKrPmKZmqTd2BiLqp0M1ZexJpkZnHAgbeI1x04tNHW2pJpmF/skY/82NP8H+dZ
dts2dmy0F58icsjyqNeL2xGjzZHrUbj6HEJUhQIOxFW5Tl9REYwj9J072TXBFheoJWnM+NUpkfCN
62XHsaVh7OI3MqbSFNtFwaZQqfORJEVrXsdUVYZiIhX9+AClUflFZXi/x4VjDYTndLtvlSZKjq5M
edeHNL+Iarx/g9aLrp7Ng4fxm7dwZ5FwXnH8JvUIbW/JWGlpCggk6mJME9CKvewcOvcH8VpScqw8
sJVGxyr1rBYZeoDXEaUFKwLu1GZCysSGEjc+YNbB9nt/NwxxYQd7hR/7V1y9TtiyV5ReF3LH+JwD
jp5+44wxN26CS+stqWWQEpP4Y1gfKtWWvPcJgH/m2rb/AGjBKeO8dAltPOTASOnLTWmqH44AJInr
X0mDfHH7L9DxM+0393+pbUqBsND2qG4USFCE7dau4JguLcSG5Rh9ku8VblCVpbkqJVtCQJrK8b+z
Xij2fJw08SYUrC1YnZtYhaodcSVOMOpKm1wNgQJgwdtNa3Srkyu1sMwUA3zP4bpHkdf3rZ/Yjbi4
47xJvQRaPkA7/EN61fCngzeMqDjiYjWP8q2j2JXPI4/xJyErC7V/VXXxCuHLfpz+x14q9SH3O2+0
PDEtrtUzKg2ox5Zk1rdnhgWtGhgiNK2Pj7FW7rkOBvKeWpB/6k1icExBBLcpV6nWvFhqWM9p1qN2
4cwAkNjKdhoR51y37XmFHDn+EVZY5iLnfyU3/WvQXBN5bPvNJdSFSpP5YrlP29ywi54AQwjKPd7t
ao/9RofyrPo5N9XFP3/Qjq0v4d/h+p5adQBB5ahHY/51CmQEzBFWFmASFORHUH+lZ/hnFOHsCw1N
5jvC6uJUuPrbDaMUcsigBCSNUAzqrt0r6q2lsr/fufPbXzRrapyK70y0SVOqlIXHyrd3vaNwMEr5
XsrZSD8PO4ju1x6wRNapdXdrf4rdXNph4wy0dXmas2nVupZTHwhajmV6nWhau8Wvy/w2Hytqnf5/
5RbxtAGA2Sg3kJ5gKpGugr6s+wPhJOI+w9u7LYMMuAQO1q3XynxhSfuO0QnPmBWTmmIj96+z/wBl
DD2rn7Li3XE+JDb+vpatmvnfikHPFBLyz1OlyLHJv7HPMI4USzw3hTxbAz2LEme7YrFvYG024lOQ
SJ1iupsptWeEsFczJn3C2MSJ1aTWi3N+wi5WEQqFd5ivmUfQJ2jGXeCt/wBlcaBTmJsbnQjb8JVf
KaySRg7eUgAuJJneYNfX925t3OGcZSsJ1sbkQP8A0VV8fbYf7A0MgX8Jk+lfS/COMn4f5PG+Icw/
H/BNeJJaRmUkielQsraBy8xH/UKsPSkNKCAkhQg6VsTP2hePbKzFpa43hzTDRPwYLZcwSZMrLOY+
pNfQKM5L5K/F1/hnjuUIu5fv+6NMeyFasq0nXoZqXCyhL+q1D/hre+G/bJxnxRi7uH4rxAu8snrG
8D1sGGUIWkW7hghKB1ArRMGznJqPh60/mSan/Z/8QlpbUo/v+5mcYcS6hspUtR5ceLpX2k9kmEDH
PY8jEAAQq1UdtvwEH96+LuJBakshUfBpAPfrX2s+zRxKzif2aWrhASSph9BJ01SylJ/UV898SipR
hfuejgk4qTXscc+09wwpf2ReMV5W2wjAW3sy1FI8PLVpAJJ00HUxJG9ePP8Aw1nbZ7223zTwKbhz
ArhLagmQpQdaUQT08IPrFd5+3b9oy34O9jWG+zqxHMxviPCWPeCEhSGLLKkKzTqFLIISRtlUa+eX
s84oxXgjinC8YwfEnsKxOzuUOMvNTB8QISrX4TsQZBBIrXoOnlPoZx41cGfU5dPVRlzR95sEwRLi
0nwg7zXB/wDxMMJFr9kTFHAZjGMO+X4hrpHsb9paOOeCsEx0KabXe2yXHWWllQbc2Wkeiga53/4l
GIou/sfYqgEqJxjDiJH/AN0153RUs8U/J0dVq0s+Q+CJc94t8uXRSonrrXUEc77ifUrl5BlmAZ3r
l2EBIumQVHQmQCdNfKunWqbf7kenmczQpKs8bj5V9F1H1I48HDLPD59n2GXAPHuPcRYUzcWyLizT
w/hjN2pySoKCy46gJiBBEzPSKy1xxt9n+wSRbj2l4yQdFOjD7QH6FZrKeyr7NnH/ANpziKywDg33
Wzt7TDU3F5iOItn3ZpQWoISpYQpQUrxZREHKe1W1/YS9rGKezvGeI7PCxeXGF4s9hP3KyHTe3Cmn
Mi3GxlCSiSTJIMA6UKOHSnklV+5DlkUmodjm+I8QeyjGrPEbHh7g3iO2xBdo85bYhieNIcDLiUle
YtIQAoQCInrWh8N8k4lbl1Ob8TVME6eldp49+x9x97GXHcUxBCMawhvCLi6vL2yCg1ZktqSG154J
UCRMA1xrhpZZxG3ARn/E/igVpGWOUW8UrX3v9RNTUl6ip/Y9g+x17hjkhN3YIWQkzOHrXGnkg1h+
AlIa9snCMoIbONM5CUHbm6dNPnV/2U4vfWaG3GsOSoEZZ96y6/8ATVThIOO+2DhRwjKVYyyYCpA/
E2nrXz62nP7Hu/yo9P8AGd0j+1GLthCYL7niJ1+Hetc4GeS1dOkKE5RE1f41UlPEuKuJBJLqyRO5
y1rHBD7guVCEg5e1ebHdG97o7Nh18XEEFcwK2LDrghW+p2ArUMIcV7olQUEnWcqa2WzbdDLZ1JJ1
JPnQxM3HCXSSTCp8hV3G3kotbcLQs+MbqAGxrBWyuWUpGUH5k1PxIEqwq3UQSQ4NdB0NQ+CK3MxY
Yq01bOjKicpj8Qk/pXnjhnFl267gKcdcUpxRB5sdT2ArtVu7btWCipbLcoJlair+lea8DxRbSXUo
JgKUEkT39aMXLNIqjAYHacM2/tSv14sm2UycEZcUq/fLkuG5cn41H6VuGI8Q8CsWyw0eH2lJ0hSW
EkfIia4hwjinDeHe2K855whm1GBoz80NRzueoqkn8/frXQcT4+4WAUhF/hWugLQRt/yiurLjepc8
IUJLST+yXGMFe9pnEjlgvDHGxhSEyxyikK5o7aTVf2sYrjR4AxU8Lm6Vi9vjNk/buYSVG4aWmZUn
l6jLI1G01gfZ3xNhV17RcZXbXts4g4aE6KSmDzB3ru32eOIGrbjO4dbbbuXE3ClTlBQElhQOvrG1
PX6E1ka4r9CZR9TG0j5ChzeCT61jL4y/NWW15ldvOqV4ZdMV9/Hk+Lm7RawhcXcHbKTWXvHJQnY6
1g8LJF1/ymsndrgJ9azmvmNMbqFEi8rqLVCwkpzmQrbY1iCgIc3EgjasiFwElSsmQZgqdBOn86g5
jSSeW8CpUf62oi6QpK2ZNBKrknQzNNxI/geVVrB5blypJOwMGp8SALJ12rOqkje7gygkwN5rJsKl
hG2iRWMRAiBWRYUOSg9IokTDY6z7HHsmF38qQAbkA5p/gG1dEwLhVjiC/wCLTcYo1h6MOs/fMiiM
75SHPA2DoVbmJGw71zP2Q3IbsMRGfKC+NMubXJW04PiKVcb41h11iD1g07aoDj7CigFJzJUlUAkh
U7RXgZVWaUvH/D3MbvDFfvuQ4C7zP7WgqUSnEWwCsAEgJI1jStm9gFwU8PcUo0MvKJ0n8q6xbtlg
mGIxRGD3S78XQTdPXGeUBSF5CIKQQfEPrWW+zbaC9sOI2lOFOe4CcyfPODXF1LU8GSS8o2w/Lkxp
+5xL2ipA46xyVlv8RBGb834adRWnqMvpOYK12rb/AGhJcRxzjiXCM6XUoVPcJA/lWoKBTcAEg+df
RdP/AOuP2X6HjZ/rf3f6mQ4TxW6wbGbi7sn3bW6ZdadauGFZFtqTqlSVDUEEdK2fjfj9zi7hDArS
9Td3d3Yttss3l3d81aWA2fwogDKFlagdwFZSTE1pmBXzVlf3Lj8htZTqWisHSmvrtXra3LbjnOQh
KFNlsgfCZM+tdTVyv98HPGVKjMYY5nuWc1w2E+lbN7HGUue0G6SogpNu/wCPodRWq2BWlbJBQIje
s77Nbw2fGzzhiVNPpJG1cORXCaXg7Me0435N/tuJr/iFq9RiLDTTlorKjlNqbKkqKVAkEnpBnsaz
WABBUgqVAzDeuY8J4k7cWOMOuOFa+aACpROgCQBPkB+lZywxl1giHEwP8VcE8dXFHbDLw2emeDH7
Rl9GbKDvXMftzXNtdDgNbGpSzdpUf+Zo1hcJ4nuUlKw4lI7hdaZ7fMeextvh8O6hlDwBKpmSj6bV
zdLgcOpjL7/ob9TNSwNL2/U5okgp0eBnrArtv2afZfwvx9dWN1xSw5f2NvjltYrsSrK04i4ASpSl
JIUCmJEHfeuIICwiYGnU12z7N+NIs3MPsnCltN1xNh6lPKVAQEnWvV6yU4YW8bpnm9NGMsqU1aPW
PDv2GvYw+08hz7wvhaNP2KXH34NwpaUFFwsJgBxEkJAhJ6g14M9rPBVh7N/anxRwvh13cXFhhN8q
0YfucpdcQkCFKygCdegFfRPB+KLHA1XbbLy7pDVyoJB8I+FJEnrXz89u9+cZ9uPG942UJD2JuLAG
2wryPhXUZs2SSyybVd/ud3XYMeKMXBVuatiJQvBbYBwuEKX4SNtN6+v/ANlfFFt/ZjumkuArDTp5
WcBUG0a1iZivj9fOKThTDalAgKUYjuK94+x3iR972NEoWsEBSdDA0t0VXxS1ii15ZPRxU5NP2O5M
4+hXC+GFa3UA2NukDNpo2mtPu8dYTcq/2ogE7EzXMbb2o3owiytX1sXNu2yhtKXFQpICR1rBX2Ms
3xW4zcIakzkW4NK8GOFntaqR3Z7ieyb4fxUc9SybR8DUDdpQr5atAJsGAcwUY0TMRFewr7Gn2sOu
khxABYcEhYM+E142s1qdZyhYGVQ0PpX0PwvG4qf4f5PH6+VuH4/4MmEJcVbIlRBcAMzoJFfT3hL2
Veypv2F8KuDhLD132DOvO2t0sEuy7cQsuE/3oymAF5gnpFfMVKy0u0lSTLonTzFe9/7RGx9k2EhF
+kZY5rSVpzAc7RUbxNZ/FJZIqCg6uw6KEJuWpcUbF7b/AGSezfAPZRjzuB8OWtovBcMvncOWkqKm
HHUKzqzTKpk/FMdIr5qYQlJcTKCdNdK9+e0bitjHfZHxc6nFrcxhtyhTThUHNARsBGp0FeB8GKAp
ClLMnoCK2+FubxTeRt7mfXKKyRUfBkMZIQ0hTLSkeEhRIivdP2UPaxjFl77w5c4o8rBmsBcuGrHN
LSHFrjNH8VeGsUKQyAXgo5FaaV6R+zi8brinF2VvKZQeGmVeEJGc8xYAJIJA3MAiYEzFV18VLD9v
+C6R1kryYL7da7TEOIeAb1CB7yvAgy+tJEqyKGWT5ZlfWvOOCWjL2M2DawopW+gHXpNdg+1fiVse
KOH8PRdJuLizw0c5CAfw85Ckgk9SBNcZwi9Rb4raOqBCUPJUT21rv6NSXSxXsc3UOP8AEP7n19+z
Em1wn2W8ONsPNM23u+cuO6kqKiVfrNYb/wAQvHMOvfsn4ras3vvFx964eQBATHNM6Vxf2P8AH67j
gDCmLbEEtC3SplSVoOigomNfUVgftT46/iHsOv23LxL6PfrQkJRGuc9a+ZwXHqYp+f8AJ7HURUsc
pLweMcBStV60lIBgnUmuqtpuE4DcApaKSEyc5n4h5VzDhl9hq9bLzgSMx1UvLFdNfvLJzBFJaukh
Up8CLiZ17TX0nUfUjycH0tnp37JH2i2fs+OWqFYNeYuriK0tLObV5tAYKbp4Bas51EObDXQ1629l
/tcNlwxjRdCXUvY/ib5OxlVyo18ycFvha3PAq3F+BTrQGxICbo/1r11wrjTQ4Zv8i08tWLX4TCtR
+OqvnOruFNPz+p6mLHCd2vH6G8/ae9omH497COPbdLLqXXMHuEpUtAIkgdelfKHBMysTYyryjmEf
DJFerfaT7c8D4u4W41wCzvnXLpixfTDiMiVxCVZT116eVeTsCuLdq9bW9yvC9J5uwHmK9b4fCUMU
9a/dHD1bi5xUGep/Zui/WWG0Yktsa/7hB/lVfgy+Wx7TeGnnHFLDWKtE+EAaLrFcC41wyGWS9cYc
0EyFK5mses6VjsCuGlcb4K5bKlBv2iCiSPj3rkauUnR3p1FHrLih9ly5deSrMHVKUpJOokVq/CGN
tMXr6ENkFAgGZmrmP3TRdcZzo5jb2RRmJg1o2BXduMSuP9tS0vqlXTXaa87GvlZ0S5O7YVxG6q3H
4ZCZ3mIrYrXi9bbIlIVH8RrkOG37Puyf9vSR11mr6b62cyzfgeWtDQJnYGuPAVhQbSFRrrWD9oPt
Ku28HaDcJJciB6Vp9m5ZhQKr0zFYnjZTTuGMpReZiXe3kahoexdR7Q7x2zcDixIQdjFc14exuzaw
8FCrYLJ1Mo3nWa2TCcJsVtKN1elwFJ8CNPrXOrTiaztbH3ZlPJDYKQgNkEmeulOC50oq/Jr/AAbx
ZhVn7WLp9b7LbBwYNEttEjPzyT8KdT51v2K8e4WXYbuXFgJmUWz3/srh3D/tJwLDfaM7eXOJ8hhO
GC1UvKsw4HiSnQVul57ZuF30qSnGOYSIA5a/6V6WXC3NOnwv3wcePItLVrlmR4K4wtB7TLl1LpIX
YqSeY2pOucfxCvQfsSvE8Q41jXu92n3pDjbbRMjMS2tRjy0rx9g/E9ljXGqnbK9lDFsVKJSoR4h5
V6I9gnEgHF1xcJcCkl5EqTO3Kc0ExXL1kKjfsb4ZWfNJDqgdiPlTmE827QVfDMmayIUQKId8h9K+
71+x8d6fuY11XKu1qQJE9KeLpS0oSUkZSayHO/wppvOj8qfpRqvsGiu5VduQpgtgGSIkjbWqyEw4
kyd+grJ+8EdE/Sgq4UU7D/poUq4Q3C92ystz3V1KkyCRRexVTyMpR85NSc0ggxr6UV3BXAOvypfd
BT8kLS1OLAJGpAhJ3rYMftRhlhhTiUwLhpcweqVkfsRWES+pGwIp5v3yACtZjYFW1RJNtMpNJNG6
8CcT/cuD3kNlSzcJITnymMtbJ98YdjGLYi+7ePWJum2wpTTPNUlQOoEEaamuTjEHk/mP1NH7zfnQ
x561yS6bVJzWzZ1R6ioqD4R2fCcVasPZ3cPF1y7u3r11CBklSkgApzaykGK1rhXizEuGuI0qsb6+
sGXSVrbY1KlAkpKkmR1P1rnhxK6P+9V8hFJ2/ubghSnFAjQFPhP6Uo9KlqvuD6i9NdjI8VY+/jHE
2JXly7zHFvqgkAECY6AD9KxCL0h4LScw61CpKSSSJJ6k0wISPyiu+MIxSSOKUpSdmaavAG0pA1jo
d6rvYlywoBMGseANooFIJgifU1Kxq9ytcqovt4o41GRY06Gs7wdiaLHiIKdQS0G1jwxOorVAlI/K
KkDpBnr3FKeNSTXkqGRxab7GzWuN3OCWNytu1bubd9zVZXoOkQOulFjjq6aTAsmPIwRFa0Hjt/On
pecTqCQP+I/1qPSi+UUsslwzdrT2jXyngU4U04EiB8R+W1Y3jfjC5x9uxD2HosOQlQhIPjkjuB2r
XxfPp2uCn0Wf61C/cKuNXVqdjbMon9zSjggpKSRUs8nFxsAxLMUjKB02rpPssx5FjlcdOUWeI217
l/jCZ0FcxCUA/AmrNvcLaV+EMqv8JIP6GnnxLLBxJw5XjmpPc9HM8euYr7dXccdLtnhd1ZqbZYcf
ASp7IkaInfQ6gVxj2nY4HvaTxHcNzC71ZH6CsCu5fdcS464QtIhKluGR6a1TeKFrUopC1EyVE7mu
bB0scUlL2S/I6M/UvJCku9ls4uu6YlYClNmAYjQivV3APtiRw97MTYN2wXdlrOgKUAFDlJT/ACry
M2UgEBCYO4rIMXrqG4SQE7RzCP51PV9LHqIqPFFdL1LwNvmzrz/2gb95ttv+zYEISCtzrpE/DWNe
9t184I+4mJAndQP7Vz23vLp99KEGVqO/MJ+e9K/fdtnsnMDhiTKz/WoXS4U6Uf7s0/icr31f2R0l
v293zFu82cCtVhbaklRJ0kEdvOuOOXjrCAVoKQsSJG4rInFroA5XSmRBAcOoqqq+WZCghQPRSQRX
VhwwxXpjycubNPLWp8EmHYuee34dUqB0G+td0svaEwnEgT4n3METbq2zEpu84H0JrgDZQ2ZCBPrV
+2dSHQ83KbgbKC1JV8jNR1HTxy+xWDPLH7npXGfadw3h/CvELVzh2IuYrd2d1ZtvNOJLORYlOZBI
2VrMTXmexxRNsCc5S5GkJEfOrD+NXS21suP3WRQIUg3KyCPQmsZy2pkAj50um6dYYuL7ldRneWSk
jI3WNrdYSVJSpa8yZGmn+jXTPZ/7WU8D3txf5Fum4wxFohKTEKSsmCegM71yTIyoJCs2m2tWUlJa
DYuFobBkJVqJq8uGGSOl8EYss4S1IvcSYm7xJj+IYotJQu7eU6UlZVE9JrHi2WDp+9SptpHhfCvQ
Caepgj4nsvqitE0kkjN23bOz+zP2iNcN2AYbt04m/dXATy3HlNBMIEa5SNSDUftQ+0exx37P7nhx
jh/3Fbtwy97z7yFxkVMZQOtcps3TbtkC6UghYWlbXhUkjz1qfE8Qexa2DFxfvPNghWVSUbjbUJBr
gXS4ll9Rrv7nfLqJvHoX+DAWt+u3cLkDQ6EpBrZ8H4rublw2j3L5YQVAIRrI1rAnDGVmOafpVyws
G7Z7mJckwU6DuIrtyLHJe5ww1xZ0Z7iBAt+DXQP7hwghWhBD+bvXeeEOJXLnBrxSLgpadxK6dCZH
5nSa8v2F47ZoQlN4QlAhKVsNrCdZ0zA9azLPEd6hvK1ioaBVmgWjUE9ToBXi9R03qpJP9f8AR7GD
OoO5I2v2rcNsWKMXxa3BLTjKluxBKVdfka43ZLZZUCpTSlJ1hTWY1uGK3N1i1m/bOYq0G305VxZo
SSPUGteRwglLmZOIJnvkiuzp16ePTOW5y53rnqhHY2PA/aJiuEONizRaFsEApcaiQd9t627B+OEW
HFVm0UrSkXrSzlRCU+IHQToK56zw06CnLftwI/Ia2AYa45fpu2rhtDiXEuAKSSJEQD9KxyY8cjaE
5pHevaB7UrXh1+7vFpef/HDxQgakfFGtc+wv7R2C2TyluYVd3HMEwhSRHrJrXsR9/wAdXcLvHLF5
b+jg/ESCNtgrSsb/AGEtbhplosWBS0CEZXXUnXXUzr865cWDDGNZOTpyZcknePg6xYfal4ZbaGfh
/FFeaHGx/Org+1Xwtok8P4mATupxGh+tcnY9nloUJAYtARuBcux+9O//AE4bWuPcrVwTOX39wBXr
KTT9Dpvf8wU8/hHY7X7W3B6Ff/seKnKYUByyP3qzjH2uODcQs0NNYPiaFJVm8SEQdD51xB32a51r
WnBUBJM5WMVUlPyHLpw9nuGstxccO3/M6qbxYn6eD96l9N0z8/mh+rnXZfkzrTf2sOGWmlNownEU
qUMuYoRH71oWP+0hrDsGvb61UHX0JKkIykEE7HURodY6xWsucAYWpybeyv2FDUIub1tSSex0Bp3F
mB4pecO3FtaWClKWAClspVmP1rTHgwQmtHfyRPLlcHf9jQeA+LcSw/i1m+TiCEOOSl1Vy0lxCkmS
RlOm+ukRXYHPaa6/M4pgRJ0I+7mRPrNcFssIxDDcbbtHLVxu9T/uSJVqNNPSs2vh7E1OZ/u9+RuU
tGvV6jDDJNO+3seZ02aWODi1e/udR/tnb2mI2t0heGOOOK5Ti7S2Shak7xodprrnsg4yZF3iNyxc
80262VFJEEpyqCjH/MK8wWWD4pb4lavDDbpQS6kkBlQ6gHpXW+HLxfDz+LJcsr1LV7bhsPMNczKc
wJ0HkK8jqenThpW7PVwZbnb2R51yA7qT9KapImNPrUqrpuILWXrMCmcwrmAv5f8AxX0e58/sNy6x
4fqaHKPRKPWTTss7hYPcqimZUbkj/qmmSAoKf4PrQyzoFJo/hDufShnbIiF/WmIaUD+NNIpHVQPy
opWgbtg/81LnAHRIHpT3FsAIB7GiW/KPlQ507z8zQzpJ1THzphsSZQOqR5U3w9V/pTM6f4P1pwSV
f7v9aVBYTyx1n5UAtI2SI8waeEoTOZQB7AzTFKbEaKV+lADTBMeEegpu+xn0FPzjogfOgXJ/+aok
GQka/rQyp/i/SkSO31NCR2/WgA+EdSaWYDoPmKRI/hoFQ7UCHZ9NFR8qbOu8/KiEk/l+tPPLSNdT
2FAxmpMAk+gpxbUPiOX1pe8RolISPKmFYUSSJPeTQLYMoHc0Q5rvHoKaCP4fnSkdgRRQx4UNdVUs
46k02Rr4RSkT8I9KKDclQv8A4qnZfSJBKx86qBeo0FW7HK4/4kICECTImT0HzqGtiovczFov3Jgr
JUlak5pPQbx/ryrEvXCnnStS1yoyYip728AYM5SpaoiNIG/61jvecwjIjy0rOEeWaSl2RKpwaiVV
EpQ7mmqeJ6J+lNU6T2+lapGTY8EHvTwod1A9wagC6dzCOgn0p0KyyLgFGVQKvXem8sK+GT5TUHMJ
HT6Ug6oGRAqdPgdk6VBKtc3yqw0+EgStcb6f/NRMvtqADqZPerBtVhGdpKHUnTQaipfuWvYPPRlA
lU94/wA6lbuwg/EvyESP3qmH4OqG9f8ABTkvCTLbYE9RU6StRk2r1gjxtEzuUeE/vFNUq2cyhKnE
d8+v7VSFxEHltj5Ul3BOhSjL5JAqdJWolWhEnKpKvQ60ktidQRVUuA6wJ9Ke2+UkQQmaeli1GQaI
CdFLjyP+dWhcuARzFKED4kg1jGroJIkDtJT/AKmrCrgIUkKBb0kbEVDiaKSL3vCZALQVBiQmKeFp
QR4Va+hFY7nKJhDqVHTQiKcHlpKtS4QdsvSp0FajMNrQZgknsQNquWqiVnKZSNJCh/OtfRfPIICz
rAhJT03q0m/caIHgeAgDwyk67VDxlKZs7LjqSkjnx3AB/nWRtb5xKgMwUIzQtKY+citIbxZ4QEJQ
JMAhGgk9e1W2+I7sOHKG3gjw+JEg1DxFrJRvLWLupWsJbbKkgyDoJ+Q71krXErpKEqFmXB+UIVrP
np16Vz+24mXzmxyrdYUdgCkz6A//ADV1riwjexQlCfjKHPEdp317VDxexrHM/J0O2xkqU2j3W4K3
DooIStM9uh+VWbfHgdmgoz8L7RSRp5JIrn7XGJZQQ2otI10ctkqjoYKSD1rO2PHD9y3+G5hK2iEh
XMYyKSBvCSRP1rJ4V4Nlmfk3BV++FNoOHWzq1anxtH9CAaeoLugsu8LqU0N1JtwrT/lFaoji3GWX
z7pa2rgBzQLVtSSnYaAnoTTT7Sr/AAhw5sOsGHCCjlm0KNOyYIjXWaj0fCL9byZSMEQ7zXOFGmX0
68xTBSR896tNY1gOYAYOttB0BzqB+k1hV+2XFW4bbTh7SEH4xbarjSFDNB2/Wnve1S/vWnCtvDEK
RMkWqEkEQQIgU3ib5/UlZUuP0NgTi+CLTKrS5RAnR1W0+dIY5gLcZWnEr/hc1I+tYJr2qMIcKVYR
hzgKQdAsQepidPlNSj2iWN+CpeE29ssCYaSlYnb8w0+tR6Psaet4Z58O2lyhPogj+VRqSCNbnN5Q
RUA6DUx1704SVRBJr3ao8G7EGknd5OvkaPJQn/ejUdjT0MvOriAnrKqAaCT4nBvMDTWixV7DCylI
1dH0NItJkAOJOnY05a20iYUvSmm4yiEICR33p7i2C3aKWDlWO2xoKtyjdaR601Tji0wokjsKZp8u
ulPcWxKGmx8To+VIhoDQp+ZmoZ10NIkSe29FBZKokjRaQPIRTVJzfE6D6zTDrudPOmFRPXpToTZK
W42Wmly/8afmajzfOlJMQZnvToLHlAmM6ZNLICPiTTIJHenBCldAkT1NIVgyj+IU4NFQ0UD8qfkQ
2BJ8VNW4SdNPWgPuN5WXVRgUgUgHKRPnUaiSoKMmgSDHXzmnQiSSr84jtQAB/MB600A6kDShGn+d
AD4H8YpAJ/jFNiB/nQA0JnXyoEPgT8YJpQDpmHrTI6T86MEdqBkiUp18YoafxCKZPUCTSzHrt50D
skQgKIAcAJ203q8wxywEgmfISCf8qqWyTmzxrsPWra7gtoJ0lIKQRpqe9Zy32LjS3ZHcct5f96Ql
IygZCYqvkbjR0x/w1Eo66mkJq0qIbskytpn8Qn/loQgj4z/01GDMd6UkTvHlTFY+Ej8xPypQmQJJ
nyphVEHqaJUYB116xQA/KiB4leelFKUdz9Kjzagfy2pxjKYIny3ooCTKjSVEfKr1i+y3KVuqKY0G
X6VjgqCAQIp+bYEA+lS1exSdMygbYvEHWFdT1qJVk20k51FI6QiRPaelUm3ClRI0IrIMXhUMrmWI
8oP1rOmuDS0yNCbWVBTy0nuESP0qKWVKAK1QNB4elW37JICFIKcy9YggD+n7VSKShRzaL6gihbg7
QAEiRnJ+VPQQYGfrv+9RZ4USoSPSKKViRIjrV0RZMmArVUgeWneikpMA6nXYQaiIkpmPoafnMSNV
bEDy8qmirJMrakq8XhAkHtUiXOWAUqOUaZSdahU6AqTIMRoPpvS56UuEFOcAmBsJI0NFWO6Msh9t
Tf4pgqTzBlSf5bbfr51Oi1ZeUltD6EZ/EkZgqZ6TWHzt5gFpUdNzoSexq03cCRzR4h+YQDA3jv8A
Ws3HwWpeTMnB12SVLdW4pvPywQM0q67dtNKmFjhJWrm3jzCcxEJZzKRESNh3HWsZh95cMuNo9593
YWr+9XOSCYk+WtZVXED1lccm7tG7pTaxmcBIKgNgflBEftWbUjRNE6sGwtLri1Y2dUkSi2UZVsB/
n+9ZO2wXAbtJUriB1tISM4as1DKI2JI302qghGEPkNulyxcIgISVHQ6p0IPWB0OtZhjhW6Rhb9xZ
3LDq2czDiFqUkpUUQCSnQHXQkjQkRvUN+WaJeEWsKwDhZ9lK3eInmLpZUkIdsySgJRmKinUx9Kls
MG4GtSsXWL4o0sogpXhGZCifILkDUAHvG9YK64exRl90XOEvpZUhKWnlJlKIglRUJHQ7nuaqMO3G
IP5UuFRTmhaX8xKkpSBCjqNkx3BidqVXvZV12N5Thvs/GHNe6Y9ilqE3AQ647ZS43M6ZAsHcHXXX
1qS7Rwy3cKt/7XYteNNqOQ/diSl0kgiSpzQDvWpM3dj92AJvPdlhQTBt1OBXhKBKtIIBEzrG3arR
92cKuZZllllPNUtKSguqChmyrEykjUCBooHzqdPuVq9kbfeW3BjSHEOOYmtRTncbGDtpQkbZipLv
iTPUCsa/bezVVupz3nE0XC06NIZKUrUP4SVGQemgI7Vr7eMNN210IctW1gusKtjGZSlAKQs6FQyg
b7EbA1VW3aOsIuXn2XHxcENWrra0lTaUkBRcAywSIIMGB86Wl92x677Izi8K4Ovm2zYYndWjr0gN
ulMCDscydOnXXtQd4RBQhNrcPYikGUotXWnDrvCcw/brWESpLrjVy5dotmbhotktgvALHx+DLmAM
6AbbbVTbw9paHCW1/eDJTy2Et5eYgkCSdMsQe516RT0tdxal4NCU4whfhbLhPUzp9aau7cJBSA2D
tAqU2kHVzTzG/oOtNTbpUsjOQAYkiu20cO5Atbjh1USn6VEpJJ0ECKuG1AMFah55d6HuzY+JwrUd
apSQtLKakkbj+dAE/XtVxVkjLJWZ3iRNN90QpMhRPzFVqROllWB0M0gBm0k+UVZ93QIAUZ8ztSLD
aTOcx60akLSyqfM70J1OsmrKmmxCc3Tp0pvKRB8UjzO9OwpkOYnXeh3GwPerAYbG6gB11pwDbewB
I7mlaCmQBpR12HfoakFqEzmV06HSnlwEdI9aCuWqCSPOVTSthSI86EnwjN86YXVHbSOiakAbywDq
fOm5GwCAr1piIVCOutAnapsqJE9fOjkaO5geu9VZNEE0ddyakSEEwDA9aBCCSevSgBk6UoI10+tP
OUk7D50QhB0lM+tFhRFMf50UqkzAFSZEAnxDTzpQmdxr50ARiIAmlI0jpUgCO+h86KUpJMEAetAE
YVrBJHpRRqQmd+tPS2iZOvzpyEobUIUPWlY6JUqgkAQBoPI1HdKgIQVaDeacgpBBk+k0nEhZVME6
EeLekuSuxWG0/TWiSdjFT5Gtenzmjy2gN9eomnqJorwJMHUa0FCEgzM96s5ECdo9aby09CB86NQU
QwQBpEmgEb6aVPlEfEBHnSCQRuAPWiwogkTJO9ECJ9N6khPWCKXhkCRM0WKhhSBEnUdRRBgbjTuK
lyNJTqqT605PLIiUx012pWOiMFWWJ0GtPkgT/oVM0WEaLIMDUpMn5U78DROZMzoVHT5ilZSQEXbj
RgyUfTL5irBc5jccwLSTJnb/ACqNLluFDNoAZJQes6UxLrQeUpJOs7io57FIatlScxSqDMgHcVHn
USDm101+UVKbgERmk+ugp2ZLiwFKHQiOpqk33FXgag5Ak54JMTrOlNzqkqPiT0k61KENCDmCoGgJ
inISgvhPgyqOkmAPn0pWh0RhxZWAYIB76d96KCEL0CiJ8Eb08qaU4rwgJOsTHy/1pUuRpbeVOVzJ
JAJIgUXQVZBzEBWWErCdQlcwU61O26tLscwlafiJEmeunWdKmbs2UrbkZ0wJhcGevy+VWm7a1Ry1
k5ClWwUTPQA9vrUuSKUWUlRbhxKlBpTYypABIVrBg9CfP6Cp2L51tlQQpTKCrMSknMSRBHaAD171
mLHBLdwFa3XPc0IC0KUM4QZ1lOhIntHWprPBrR5laFWiVutqzJUh1QL6fIz0nbfpUakXpZRQhN6h
kryW8BaghajKRpqkGJG+gJMg1badu0AutIdDhSlJbt1Ag5ZKlE98usmR1JNZ6z4Ws/dm3bhrMjQl
MrDY1MBaSQUnz0nTU1nMA4Zs7/JeWeG3L4cuOQq1t9FuoUlQBAVuBrtrE1m5o2jBsxXD/tBxbAbh
S2+VeMhQSW3wC4Uk5c0SCIkCUkA61ull7SOHsSsl2fGfCaWrdxtY+87C1RzSsKABKiAcpKcplUGB
ExT8L4BwG6adDmG3rrTCVuwErWUESBnSFAwZSAQTE1ulr7HuHcJtMO4hCF4hZC2Ut6yfxAlQUoHO
Asoy6HXKrcK6zXNKWPwdUYZPJrmEcF+zTibGS3Z8Q3lm04c2Rt5LAbWUlKglDsSN5UDIgx2qvfew
K5t7Ry9we4YxK0dZHLDmZpRCCEmF+JuSAZhQABG21dQw/gnBE4NaXTfDmGuLtAhlDV88p+0bQ5Li
HAhJQvlk6HNmImIiK23hnCMPPEQQzwFh7ZZLb4etrl8MpUNlNMq0ypIByJIB6g1k8rXDZssSfKPJ
eKez3FeGL11vF8Mdwy1ZcWpL3JU6gtnLORxMogfEDPQie2tXdzyrhxSW3UkrJQtuVoXAIUpMmCNZ
1nTTrr7e424rU3crvLDErHFAtI517dPOEtuZsqSpogFE7QoEEdzXMsVssAxpd+cTwTCkqRbrU44E
utOlRIBcCkJBAT2gggVpHPf1Iylgr6WecrfDObbuPs3LKmnUBYyIOYqUY1QBIMkgCIidKq23Jfum
w44FLebS2p5lchCwNDPWNBPSK7PinBXBdry7iyatL9vIhKBg7zqwpUbq52VaVfIDWNaqY3gNnc4b
YtvOBxCUNslClPZ2QgGAEoGVYSPDM5tY6Vr6qZl6TR5zUtJ3mOyjTVEA7BOmgGsVM08GlSlvVXVW
lJ6+UsGUhtI/Kk712HEQKMzOvnUcgGY02k1OXkq1KdR0BppfhHlTRJCewH060JO5kftUgen8o9Cd
6JeBMkZSNqoRCrXcKg9xQgzAGvl0qbmeL4ZETM60BcTrAykTvvQIhIMeXpvTcnlrU5uoIASJidel
N58geEknc01ZOwwN5joCY6xSKSCd/wB6cp6UgDUztNAOlXT5U9w2GqaITqDTcok7z6VKHpVqJI7m
kXREZAPOd6LYbEQRIn+VLlkEjKfpUgfKVaAeXUCkLkZjAPnBo3FsRFBjUGgWiEyNqmVcSSQAJ705
NwjJHLJI2k09wpFbllO9IJnefpU3PGeVCR2mk4+kqJCCkds0zRuKkQ5KGUHerHvJKYk/WgLjxSdf
KaNw2IQ3rvSKNY/lU4uEkHMD5AGmqfBOyo6TRuGxEB56Ug3Om/pUvPEzlg9fOj7xEwNO1FsNiIt0
g3NTC4ChGUeR60g8CAO+4othSI+XlGsRT+SI7DuNqlS+CkaSB0o8zYqOZQOmu9TbKpEJYJMDWOtA
tZSNAfSrC7kEkZQe8U03GY7iDtpEfKi2FIhLUHQamoyiANdqtreGUAE5iO0gmog6nTQAjptTTYmk
QQD50shO9Th9M6pH0o81GmknrpTsVIr5NKRRFWS+gjQSPIUQ83lJKJpWFIrpE7gxTg2DsR8qss3i
WkkBCVSdQUjT50m3UzpEb7a0rY6RFy1ZdQQfMb05LQJg+E+QmpjcTqqExO1PW+nMCAqSBMkfpStl
UiFDBIP5kjpRKEmNd96sNXIAhTYA/hCd/X/KnO3iFlKsqEkCPAZFTbKpFRTaQqCZ9aAZGUqj5irA
uQVapE+XX1phePLUmQArpO1O2KkRhAJ1MelPSACeh9KeLhGaMh2AgECP60Q+kpKFEkzoDS3GBDaS
kykk9DGnoac2glwRGh22p7dwchJAG0nNv/WphdBZLkGd1GAam2Ukh7aihkkpSo767xVkLQtDXNZK
kp08W8nXfr86Zb3qGnwpSQWCSIEFQn1HSp7K5PMQtDjjimknlJSAoqM6JidARM1DstFuxeUy2823
zFgJACArpM+Hr9POr2F8lp0haVL5+gCds3eNidz6+VVucE2BDwDbgUVJYUkgJMbiNewiI86sWjxt
0IKFFKVo8bbiU5RpuCJg/LyrNmiMmyHQNF+8ZE5FFQlShEFIIJjSIPSsul1xxlt1do4qxQoNONhe
ZAnTMsQADHfXQa1Rsmwu2Zz2efMSCp1CSEyIT4RBGkwZB0rJ22IM2L7xQ4u4aWQA6yglCCOwJOfr
IUSJG4rNs2Rt2GXpwsMs218/b4m03yEF+4CUKbkEICsiuiRuE5o0JrcsEx+1Ny+wrD8q315L60Lo
S40SNFtZVJCpJJEgKBgyYitBRja2ynCLZRWhRSfc7pIUhhwg5DnI8IAJhIPUETFXMSnhtlaOJVML
SSWbUm4WXkyJOUjxKJkACQNdTXO1Z0p0dww7i42RuG7fm3mHBpLbb7i1OuJcSjKee2tJDggjwgxE
xB1pt9xX/aBq4w5RuFoWEPs2y7hbbbh8Mqt3QdASCC0tRiNK0LhviNVlg1tf4fbJKLZshTb1weUE
GTDjbmpiDoSdoFZy0as8ftWsVwOzGG26loUptZloj+JtopKgklW+nltWDVHQpWbhhmFLxZw3rVm4
poNF66bZjmMuRDja0BcOghO++mla9jFjZ4m9b4jht37tiLULaZv23GbdwBMkJCtUKg6FRjw796P3
3dqxS9wBm9uLrE22A595WCW3H7EpJHLUSUqUHCpIyqJIy/lqNeL40jiCz4fC7i8xAHM++9auIbbb
gFalJWQUCVZdDuRHQ0U0GpMt4jwhc8SMPX9+43d4glIQpxCW7S9QCDkK3myG3EkASdVeVairhW3a
+8FPsuYa40UrUy687dW5XMHK4rxIJkqBJHzrO8QWeLYDaX164lV1hbRKvc1XPLRmVojlpSMwckwJ
JJ1rHrsWcVtFY+l3EbbEFJIlpBCEGAVJU6VDYflUn51Sbrkl0eN3AoJCiSCD1VmJFMU1OqdUq1nY
mmuO5yttRJ9KQOVWb8nftXt0eDaClJXKfhKdxNMBGc6ExtFOV4jmAjypJgjqCDBFUIaolwggwoUP
jJAI32NIqKfDlgHrSCQCSSJ86OBDFEzAJI70JMyrQfrRzEwqJPQzQSIJka71RIgcoMGPKlmAQDpm
7bUFkJEgxHTvTjEzI+WsUxCBBEeIE9TQMjTSepFNSd+ip6Us0KgmZ69aACTlImDJ7U3MVQdkzSIP
5aEkidAO4FMQ4wRodtdqH5ZP60gQZB0oZgTBOnnQARoAdzRCpEFX6Uwn5p8hRzRrvQIR0pdYJg0i
c9DQmKQCgA6UvpSJ0jelp6igAjalv8qRUJoHTc6UAGesUjtO9D50hr2oAd0ml11oTPl50gTOkUDH
wAddR5U4EADWQem5qMSIIgz86IzQYHyoHZITAnX12pZ1KH8wBTJBMEk9usUiQBAmekGlQWKTrJPz
ps+U+VOznLB/zpvTp896Ygjy+lImev1oE6RvSCj/AJCgBfoPSiCD5GmyBrHyNOCoHXXtQA8nc69t
ackgd0+WwpiSJhJANFKyoEajyJgUhksj8pIkdN6IMEgAajWTrTJBABIT8v6U4LzAEJGmknt3qShw
VmJI8Ud9qJc5qvEQoneBH7U05T3VrodqCQqIPhA2zHf+lKgH7SJCZ03pphJAGv8AKmqORWWRrrE5
h9aO+gMDz/zpgJQTGqpBpwcLewkDampUdJgHz0mnKhQ2MdxqBQBKSCBlTvrqdqkVKWkmZIJ0SdQP
OqwUhsiCTtoN/oafkJcEQlKgVJUsZc0ee1TRSZkeUHLNx91aW8sBIiFL0+o+dTMrcBtwmcoGXcR0
0mIqnz1It0v80PurHwqVmWADoD1FWEEG3UHSkiCtMORBnfzPr9KhmiZm7W9F7y2WzyrgEjM4YRlk
aExMb9Y22qxYuKsHmuac6gsJC2kpX49dAB31/WqFjde8WLrXLQ7KRynXQRkE6gJ1n5EeVWcNuXLR
zKyVXalEIKikuFKcwkQJKQdtBWTRqn3Nos37jF7pTBuLhl65a53KSiVqHhUoKV8UAJnQiANzUVyc
t1nwltlxtRzodByBHQEQdTOpEAbT2oYfYffay3eXCLGzcUEqZQpC3ZkeB1IKTqdYiY3qd/EreyfX
Y2dtbKv3H+QHHpXyEgeJS0rGUdPCDPqDWXejb3L9vz8NsLBtlBuXX1qIyvIUUOFRz8wbqPXN20rc
rQ24t/vTHks4halKUvJ+FDCAco5eugJmTOb00FauuwTZoLr9sL675ixdXCm1KUkaZVBSMwQNoSNN
RV3B8Ta4gesr2xft7WyswAhhRBuOdOroQnUIE7T6jSs3vuaxdbG4WeJO8UcS2FneYFfOcOsoKbdk
qUhb6j8HMUT4QkHQOGD1NbZxXxliOBYsrCOGEoXiV0x7u7bYgENsNsR/eKUnTw6ZRmM5etafi+KN
4OtWHpxVDWJvsi4tGnFtsxOyytzLInbeYNMwW2f4bw+9tLvGPfHcS/GcWt4y8tCdHvElRJSPyhZA
G1YVe5unWx0/B8asfZnwE7de4/eKQjmKczfiquHdSJ0JK1HQgGJAO1Zf2ZcMX9nhlxit+zh7t5fA
Xl0jn8x9EfC0kLjMEp0hJGpPWuPYRxWMXt8StcYu7PEE2V2OUl9txVuyEjTlZQDmJMyEQk7Detns
8ax3jSwe9yxxzBs7iWim7cS1DWbKtevidSQFEAEEkCQJqHB1TNFJcozmJ++cb8fXzzNwLbCcAugh
hDOHpUi+dWASlSFK3aQoQoAEKUe01hvagMSC228Pt2WTjBDaUvKcdegiHFGRlBSn0G3yDTFlaWFj
w1wrfYZiFxbpzpYuUL96KM2qyUIKSoqk5iZO2tVeDcDxPHMUex7HbNNolDBTaYQ0FvFKAqVZlZ8z
a1ECWwB20IpJVv2QN9vJ4sAAcUQr/DSXqpImdRrRRAbGoE6jqTTHNFoOo3Ou9e/3PnnwTLJmBrPn
UTaiFKAMGTQOoAUSfICg0UhAJHU0UO9w5wVp1kzRUqBGs+oppA8JjWaGo8p3jSaYhoVKY7Uj8Qgb
6GnJGYrgQkGYpplSFQQny60yQ9Y6+VAHKII1FILnWN+qj/KmmAZMdjA/WgBGCqdknQ0pCgQdBROu
kHL9JpoJ2JMj9qYghUiOo3oSE+nWhBOsAEa+tEEESCT66UCETrpBPlrSgRrp5UAqNJ9NaRI1O3pT
AEa6n/OkDBgTSBTuYHlFIKj08xQAQQRO3rSmKXook96UyNvqaQCB0118qUA7GgJ/zpEzJnWmA7LG
9AjymlIpTS4AWUA0Rp0g96FO+WlAAA0GmtL01NI667eRpZdImKACCnvr5CKdoBr9QabGUd/KikED
QaUhjiZGkqT1O1IbeExTYCpnr1ijEwPiHYUDEdTqB6zTTM6HMKW40I070JAmfrQSEqHp6mlr0/Sg
QQJpDt+gpgHVXWaBMeVAKg6iiNddZoAcFA6nUA/OkRsQTr0NN06yKcJgkGR2NADgdY2PcU4KBG4J
HeowoJOpymnBWbUiR3A1pMdkvMJTAXBPkKSFFGuVQTtNMyAkQuCehEGkZSkgjN6VNDJCvNAML7aR
TCSuAdgetBH4ggEFXYjX5UUkggLUR5miqDkPQgjygGnJ1IgFKhoDMUm+6khweZg/KiHSgpidDPi1
oGJJVvGaO4kU5IUpGUKhsqkAHSac2M2XIo51TKfKhOeNM6dwNp9aQxyShDuUKSpI0/EBA/rVxjnM
ONMuk5QeejIAvXSJHUeRqB4NKZcWpK2nYGRIEpA851j605hSuWUJglyAFIXBJmpe5S5M5e31xeXD
l43l56QM7zP4SUH+EIIgjby1q3gGIjD1ldxyrV1Az5nUKK3l666TJ1O5gfKsFhzrIuDneCVp8EXC
dCOxVrqKzNohBdZNmyAlKRnunJIVrlBR1A3/AJ1k0kqNot8lm8vX761HNlQZVzEFxgKWrclKjOon
UGT1ismp+wurJVym5ssMuHSSbJ5hzljN1aOxOg0JkdJrC3ORptT6X22Al1JUGwA9v+TorvlPesjc
W4Xhqk8ta13XjF5ctBtQCdQE6BIHdImTsZNQ0jRNm34cwlfubt1a3trfOoQwtq6B91UwBBUkteIg
bnNJ6VaTi6bTh6wxFi1sbKxQ6EJtrlxp55CBJJDaQV+LodxMmtbw3EMVXgV8zaYVf22IrUlbC2CE
sZBqSpCpyKmCMkelTqcfwzEbZ5dy1e37yG1qOJMpbeUgJIyoG5SCD/OstPk2UvBlcG4kwCxwm9xP
E7IO3V044povJW06Wk/kaKgptaEz8Bg9xrNbPhKOIrm4U7Z2r1vgPufObcxCwafh1aAJRy9WyEFE
BCh006VpuGY57zjdxdptH2MesWQLd+3caU2gK8IzpWIIMz4UkkA6a11bD3GrnhjEHlYhY4hfIbdW
3buYetq4U+W8jaEIaUkxmMHMMoAnpWc/lNYb9zH3F5h9hwj9zYzfDE1Prt2ReWbsXdw6tWfOtDyE
lQBGVSEEQDqojU7zxJwyjF3uHbEYYzb4Stj7xtsYxBbtiym4QQEthKFOIWowTC4jcGtG9nl/c4vw
1Y3l+xxXid7hXMYbYbtra7t3VKQpLvgUtCygpMBUGIMGabd+0rDeG0YWCMSw+7cfRauWqnnrB1JM
/ilJKxAB6D9aycXqpGqlHTbN5sVvcN4FfYrxFc2jjjTi0OXtgyC2i3mUFS0FKyoHfQ6wRWqcQ4th
uJcNYZg7xxDiTGfc1LVi679QVygqAnK4mJPbUiJkTVbhV3FeD8R4lbUuyuODLp83jDl5bJxF27lY
EPZQFhICT4lIERoBNDFeIWOJ8Lv1cN2OCtvJUUt2zb3MaiQVuBDo+IAaAwdhS00x6rR5P2yk6Dp5
UxZh0KOkiBA2qQkTCQlMfOo/jVJOYJ2O2teyjw34HqUFJAA+ppjIBSQT1MAChlz66CilUJCNZBgA
DpR9gvca6oaJkp13pFUrhIE+Qk0VSOgFRpORJAMDv3qiXyFZKXJ6ERr3pbJkmPSgQDvp5mlJUepS
PlTFYkQQQITGuvWipCVCNfOoyqTGg66USomNzQL2FngEFXiHlJNMVPnI704AgkyEg96SYKZIM+Zq
hABkaUj3IkGko5dtuwoSDOhV6mgAlMiJAmm9YmB+9LWQDp50JkbTQIJ1EgmRtSABPn50DI30pdNd
TTAOg8xSkfShMjeiBrQMJUSI/ahr0EUQAesRQJBOhmkAY76miCR1phg7mnJO/wDOgBA66b96IMjU
0D3mjSYA9NaOYRrNLYztRCusUAEE7p09aED50jA8vI0s5A2gUDCCep0oR0SYpZpGtDckUCEYTvRC
lAb6U0gga6+lIGPKgAnwn+VLMflQMbmlJG2tMBwiDr9aA210oESJ38jQHfb1oAkChuSfnSBSdhB7
zTR0007ilE7fKkBIZiJkeW9IgpBIBHod6Ykp6j6U4CDIkjtQA4KhOqZ9DNJJE7kHsKRhImIA3jf6
UkqJPigjtSGEgSNlDoRvTiSopAXBGkkR9aarKAAQde1CDkmZAOxpASlWZI8IKh+YH60AoZFSYWnp
GppqEwgqyykbkGnT4cwMnYhXSgolQjnGYzJ/MG946mKlYQ4q4LDaedmOTKBBOulVwpTJbcSMiyZS
QYqYFx9svqBCpylwbE9vLSpGTvhwXRlK222lFvxGYPY/0qR5xtakLDaUFMyWRlMknSarIvnG5Dpz
AiJiSANqs2gVdNPkW+d5CQPCT4EAGZHXpr0qeCuSaxS1aNqUHFIdnRKxopJ6es7+VWbp5Ru2yCtp
lauWtu2P4mWNSAPCU1HlbZtBcOLUwUmQwpMpV6T8vkfKrmERdM3N26hdo6uUpeYBU2lKtIgdux3n
eah+TReETNLBVy1PIcZCDyjdsDKR0MaEKOxIJM+VbPbcU21vhyMIv2HlFLZcZFk8HmleLMhKmlAw
c3cj9q1xriBVthxQssuhkpSjmpBUVeo3B7x61NwzhAWXyu5Q05cxmbT4Q6mT4W1AH/Q71m13ZrFu
6iZfhu2VbApW0j33EChanmHyl5lZJzEyYA18XbTpS4lZfwTFMRKrlF5dOhu1ccVmfNskK+IKGYCM
ogoV10EVlccaZw1rD0hmxvLq4WbO3LL3jQ4UxmcTudQdo6elQcKYRjPBl5epZuLlp23bD711bBL7
BRspRQTOmaIg61nf8xpX8pnLqwxLiqwaxFm6sMSv2W0MP3+FOBFxcJzBKEutqAlWkTuSdag4b4mx
LCbfF8NViD1vi7Ti7cLdaC1WrROoStMozkbzsR3FN4m4nw25wa0vlGwu8VW7ldS7a8t0hehMJUFB
IEKEpHkTWe4VsHeFcOUi1bVec45/erV5bC3nCCUrWFZkyR+UlIUI1ms2/l3Rql82zDwrx5hPBmBu
2eF4Q/xJbOLBtLxpZauGFBKgrOgEnTxTClAzIrF3fFB4o4twm/ViT5wnD7ZbK7q5si/yXFJkNKBS
JWe5201qTjriS0GCLv8AEsEsTcOrlbTOHOWjrZ+HlpeBiQBJG++4qnwVhNxwtw4pLeHjGDfWguXG
2sQdaLJWNiiMqzEAxJ06a0JKnKtwuVqN7GzYgm2xfEbJlFm7b426jMzd4dertVGDMqQsFGchKtCv
esHwncuLxjibGrOyuy4tlvDkO33LuEq2U6p3TwTp8JA1Ik1LfcV+7punr56zsVoQhxWF4m0+pD6k
gZcysoBO4BI2nU1geHy3ZYCxiNxgq31YlcG4U/ZvhQQlRVDZbMbASAcw0nSkk0mNyTkqONJKlplS
gkbwKjIABgqJJmnhQSQkJ1O1AiVEHXz2FemeUBIKtYCRSyyJEqM79qB8UIGqif0orECFKmOgpiI4
2GmYnejlHmo0QkpJURuNJoZyoAyAKYhCQuQIjQzrTCM0kqk08HeNfWm5TJJUBJpiDodgBTASQVE6
gxAopKSFZgVQfrSJJmNKBC13A0ppIB1Mg7xQEbbxSUo5dQAOtOgH5YkRlNMBgATKaBOUQTNJPhB0
AB1E0xBJ0nYUJHfSgYJ1NHcwKAB1kfrTifT5UCAmROtObWEgyKAAUneDQEmiVk6dKAAGh1oAQ086
P6UDqe1KQN9aADAJ3pRFAHWBvRg0DFsdKQM70ge1IwSaADppuR+1H02oSI2oHQztSAJMgeVEfShm
owdJ0pAI6bETSIk6mlIjaKQk+VACyjSkfGe1IiPOgSDTAR8PQUgM22lD1ojfeDQIQEeVIpG860hm
JpTQMQGs7xTioHUAzTRr5UUzFAACQetPCyDEEiaYYVTgMoEnSgB0BS/jknYmiqEjKd5mZ2pk6n96
ekwBpp5UgHFOXSZ8+1OnIkgpJkQIFMSQEmTOmkUUgrjWdIHYUhgEE9ZjapAopTJ8QmN9aIcQCoPJ
KgE7bH60wFKFhWkAyAdaQ+A5FL2SCrbLU1u6GtSkpkEHqD6edRqCSmUGUjfrFOaSVgOBXwawBJHm
RSHwPbeU0628RlWBlAcRKT6VJbvrZe95KiEJMFbSsqtdDFOVcEBooACwmAU7Hzg9ah5RfWooQnK3
ooE5So9aRXHBZaU3dKbcvCtFsEhCQj4tBpvpWWtb5u1tEhShKXgrwHJKSNQD3379KxFqQ6422n8J
aZAB0CvrpVt+4bf5QS6llbyyFqQ3AQjQFRSN9Og7GoavYtOtyw8bL705pYcfw8mUJdTlW4CDqddC
Cemh3rO4BhFliWKJ9yvF29s42AW0qmCogKbUD0Pf0qjYslhk26rYB1PhSWzmQsDScitR30j0qXG8
PXhmHp90bAS4pLKQSUqLhMyB39DWTd7I0SrdkirO6sccTcXDqcQssKuPdwtxJKTqSQVRuNN+9dX4
Cx/h7iNy7sVYfeNXDbIzO4dbl9TadApSkpmUlW+mkiuZ4DdWnDjpRcrdZQ4QHS9KfeAdFJJOZCup
k9qqvqOFYh98YHiLLFzZfiB2yeLSjrsB6GNNDUTjr2ZrCWjcyjWEsYvxzily9jXKOGuJYtnLtlQD
iUyCgg9BEEab11R5v3bDnL+6s8KxSyuQG/fBcpFxmCZGQEkDKCNQdj3rmvCt5cfdtw2u+Q9eX7xc
davEcxCsxOf49CRM5gdfIis1iGFYPgNgbi/wHOm3eUFuWN4QyRlgmD4pmDEjpvWc93RrjdJsx+PY
0L3jextk39/aYU0pq/fuLhBuW2lJJyLKeiBMGT+9dE++H7xpK/u6yNkl0rGJYSS8hJ6JUkeJIKRo
k6bSTWnezXgFOOezq4vrS/tBjD91rbXR5abhqdAH80Byd0K9asO4v9yBdhdYUtlLa5TdIcVLREyW
nG8pImZEkHcUppN6V2Kg2vmfcj414me4r4gHDasQuvu151JQcQZaQpbaPElIyFKVEqkedZpVpdYF
hb1zaYFcMMoASi9Zvg8y0vQqIaUIIIEaDuAa5/wJZYPxLxRc3uJYz/5VxTVnarbBL4IUcxzkZUjz
M61vmPtYPw2lq2axBFg6thCG/uu7PMbRMgONknee0HTtRJaaigg9VzZ5tQNCpSojSRRKVLSBGVPc
09a+cj+BIOgqPwnckjsK9E8sACG5gkqiNKSVEAaCYg0QkkqKRlSREd6HhCEkGZ6UxDXFEQCqZMUQ
E7IEjzoLEiAN6SZy6nprFMXcSoQuZB6aU0nXQT8qLahkBjWgsq1MQKYgAwMxO40pqgCNTM7VIQEg
ajyphObQDXvTEIEwAdCBFNIPUyKdMyYjWm/KmAhr8IoGQkCaRKsoE7UcoG9MQJHSkKXoKR3oELRO
9IK8qE0f1oAXWkPqaB1pDyFADhvSCdY3oRM660RSGKN9KUCJ3pH1oSDqKACNaMHSgFQdpFLNJ00o
AM6DTWlFIiN6QMbUhi2FOidKaNaI0O9ACCY12noaWaNqRJMTrFHQp6CgBoOvlTp22psDcCnJjefU
mhgAmRGxohIjtSOVW00irQj6GkADOw3pakzvHaiCBoR8xSJg7z6UwFIif0pR5H0pABRmZNIKKIB1
oARI6Uo03iaC5kE7dKeChWhhNAAyaSDRClAagH03pKTykgggg9KOXMCZk9xSGAKKNdZnWOtPAbWF
LjKY2BponfQkayKM/iElMgHQHU0CHoRzUQpeXWQnyoZFKSZAVGtNkEb/ACqY5m0pbzgBSZ16T0mk
MahKDECD+ZJ0FTumUtyICRAXGoB7kb1AWTGhITMZh8NSltdsy24oBTSlQSk6z2j0qWUhjiwrIkHO
Y1I6CpG2QFBSHNR0OsnppVi0Zdum3VstB0oE+GPCnzHWg4m1XypJYWhIzTqFK8u3pSvsVXcSWilC
1KhbjYJypP8Aqait7NTv4rSxmAzqASYTrUyWHC6tlKEuIQoFSgRO05Qevp5VO29bJu3ihSkqnRQO
X9BvU3Q6sv4a+llhKcR5am3knK/PMyZTEKjVPr0EaEU4v27+P2iWL17ktAJCnHA4EOQdUgzmG1Vs
Ys37O35ylNc27WoCNFmdxExHyG9R2DDDdu2y6y4m55mV0KgBWukHp/oip2qy970nQ7XGrm2wjEcL
v8GYuxiTKCl62bQXWwkhRypUJBkTKSDv0JFaxieFC5fZtMLWk3reZboUFtrzIIhXLIBBUI06xOlX
sOY5WE3Nxb4u3ZKtkKfasb5UhY1ByH+IDqDrWPwm7bum2sVuSp675vjdS4ppck6CZ8QjTSCDuazW
1tGrd0mbHfWOOYiyq2xDAHgu2cSXLuyRz2hJ6pGsTMxWP4h4luzwreYc3ibd3aH8PMy+Vczx5gFN
uArSdoII0Gs1vNh7QrrBrRVq3cPYjhiiHMz7qubbK3JDqTJBJ1BB+dal7QL7A8bXhttZ4cuyvVPB
66fQ3mDSCRKkqT8STvBAiKzi7e6NJqo7MbhNpiVlh9pf29rfKsMqQlds8HEpWIE+AhUgkxm7xW0c
Xe1O7sMEfwmwxr79tUW7gF1cWYC284AW2ULAKCO8HXUGsTaN4hgAVd4Niji7XKUsG1TzytRJJSYg
p111Sd6xPF2I4lfYA8rErG4fLg0uIGaRGrnhPnsRSpSlbHbjF0bd7MsZv0+zmywu4wWyxPBS646v
JYh5xKjJBXmISToDoUkCQZrVHb3DbBLpw/37B3nmylag0lTakk65UmYAjcVjcFumMOwKxQ+VWjiD
mULlCpkmdNIyka9azN7izy2LdANndBSVKQLWMuUmPGkxuNtfpTaqTYoyuKXg5K5DaQJJk09S9YiB
ULsCABGu/WpFKMjpP6V3nnpjjKh4jA86iS4EpcSDpMiiABqfEf2pgnmSnfrTQMKfESSco86BMqAn
TqKcUg6nU01R8J2FAh2xgDWmKUSCCaco6hP6Cmlsk600JsbMpAAkzvR1SNTE0irIQBselJUlUk0x
AgzvANEwJI0FNJ1npSjpO1MQZjpJ/ShMkzvSJ7a0CI60AxUo01onUkxpQiaYBSJmiSKEZdetICPQ
0hoHU6U4qnYaUJ6Uttf2oAQMkdKMwDNL/Qpb70gBSiie29Kf9GgYthtrtSI+lESTpqaGoJoAOg86
MgajWmj1owEn+VIBagZhsf0ogyNRSBgETSUoKOkjyoAUg0CRMjXyNOyBQ9OlRjeKYhwBVtrRnXz7
zS02iZETNNI0A6UDHA9tfOiVTuJPSmz10oHfSlQWO20o5RqOo0ppVGhj50emv1oAWXLuYNNmOnzN
PWCiCdz08qAhXWPKhCHIcLSwoRIMgRNNWc6iqMpOsDpScSBAGqupopBCZ6Cj3GOmIzag9aRRkMzr
HQ0CoKGnwg6ClAHl8qQBQoBQKgFAdNqcpOxBMxtTFEJVlOh8qeFJGXXMIkj+VAyVSg8lRyJK1Dfb
LHWo0GDK/hJ1NSNonO42AlsKAUFKnQzHmdt6DyYUQUlIHwk7EevWl7D9wsuqaCghwoQvRWXYjsRU
bijzNFAhI/LsDT1oTy+amUpIiO57UxhEj4hPSevlR7i9i1auFBBSVIJ0ztmPWRVy8cSu0JdyuO6c
p5swSdyD3qlCAUqMtOTMxoaSwUQktJDqiFBaToE+VZ1vZpukW7Fx6yLjCkpVnAUEQDJ6fvVqxebt
EuM3ADb6XNnUyJ03Hb51Vt7Nbtk9cpdSnkKQAFKhSpn4R121qxiGJve7qZfbkuBKFZk6kJMjXvGl
S92WtkQ3t8TiyVIIyW6p1OZObrHlW145eNsv217cWwQlbQaLSWxlXA3nYiNe9YBvCbJ+0cu7K75L
yXglu1fE8wHz8us96vW/EV9a4W9YXFshdqlRQUqAWG1yJUOqTpuO9RLeqLjtyRcR3eC/c6Pci4MR
edMBpUt8k9FDoqY20rYcDN1h2GWtjdYWq4YbzOIVbLCimRqRpMnQlJ00rRbl1pOKAtQtlnKlJQAC
qOu0H51vGFXoeLbym13Q0dWLYw+ggwTlOnzFKSqKQ4O5NkzLlo9hrty0+81iMk+7tNAtgjaUHbqd
POsZw69i+I4ynGrAIbU3LJRavBtxHmkKPXtPerGJ3dw9dI+9rF9i45QKOa3kWpBmFaCe+tYNi6vL
HGXkYLZDlBvmOWq0h5IGgKhOsTH1pRVplSdNGzuYhhd0lZuX3LfFeZ/5hVtyHSqdSVpUAfTesnfc
Cv4pwpiLuFcUMXqmGlKctFvpJfggnINFdToQdqw11i9tijltb4tY3GFPhAWsMJCmlJ3C0tqggnyk
Gtc4mtzaYqw9YXLNyh5R5amgJB2gpgZT5Ukm2kthuSSbas2zgnjJd1cpw1OCG5vW2ipQID4UlI8X
gXBBjoDWUQ7YKtrgW2IN2r2eU2riC2DI1GVQ0M+RrTFcD41g6nMVXbLfZQmFrZXqMyZzAienWn23
Hza7RdtiTLmIJUsLK31ytBH6H0NEoqTuIRm4qpmiOICWyRJO1PKSsz8KfOmOEnKNxTlqzKNdpwiM
a7qNMEl1IEE7RNO3FNCZdTB8W/pQgY4yTQhIE08BIBzbedMU4AIoASFDKe4pKJV2ApoWQsK2G1FZ
1gb0xDVJEb60oKkjWB3pEfWgTEJGtMQqBIkHeiR3NAnsNKYCIg670jJ8qQ0TJ3pEz5UADp60RQ09
aJk+o7UwEYHWaR/ehv0owCIoAOWJofpR/L5jr5UNPSpGFJ0g7dKRE0jEGlv/ACoEIGKW5pTFIqNA
BBI1GtLegCeu37UlK1jYUDD1jShFNidKIOhk0xDo+Ro6K0Jg9+lMJ1maWYxtSoY8nMQE7ARPehHX
WlIj/WlKI1KhFABUopIAA9abQmfIUQY0Oo70BYMo9aJMEiltqNqRIOw0pgIjTtQHadPOllJ2k+VG
KQh6lqdWCoyYCdegFBQHb503bU0Ur0PWKBi8QAjanA6fvNM3Ej6Ufi0NIB6oVCgIG2bvTDmR/UVI
lSkwkag9DRaCFOxOUa+LeKA5GII0EyOoPWnISlWeCEECQO/kKDpSpcAwAImN6BSWxmTCo6jpQBO6
j3ZfJDiH0wlWdvUAkTGo3EwfMVI1cKcShDiiphkQAdhJn9agbSlQJCwfD101qQN8tZbdQAQdT1A7
DpUuilZI40QoJT4mgrOEzI+n6VDkU3mBSSkHpTnmxbrBaWSlcx0MUAteblg5s+iSf50kBabu2l4d
ySVKcS4SJAgJj9delQvNo5oS3IIOqp0jtHenMMIVzm3QUOI2HWaLSXWhJHNbX4VT37eVLgrnksM8
xJQfDcM/nQQRAnrGo9RVtWJ8+5tj+GwWUhHwgyAd1dzB101qPDn125dU0tTJgodaB1UgEEgg6H08
qhxF1C7dClJSSUwhSBB+dZ8s04VhS6t1bZZQ2hDhDQbTML1jN5EntVq4/HdaSbZVqkrLTq0/CRIm
fOq1lc3FnalHLRcsOpAkjMUQZ07TVpGJysujwhJ8aAdT/iPf1ofsEarcvsYKm/ukW7DDTyVKCkJa
X4lAmMqSfzA9CfSnIwP3NtFxheLBV4hxQcsLtPJW2NplWitZGlToW0pZWhwWd0JT71aKyymBotG0
EdaxJ4suH2gxdMovkNShLqk+PLOmo2qFb4LemPJa4i4tveK7mzav0xfMqDPMZSJCR/DHzMda2A8P
XXDKrXGbdIYU2UhFy0vO3cD4gY1gxuD2rVeH7taLS8LSwp5aodt3EJUlaD66g+lWmsRVbshhV3cW
nJJLSG1ZkTHY7dqGq+WIRd/NIs4hcu4piKr122W4SrMpwKzZZMzGpAnoKWINDiO8XeLZ95zmVLQ4
OYDAG+hPTfWs9ZOsYdhSrpaLLG3GbYLcbtrgKyyRqRCVJiY0zQQQaw3B79pdWGJC7smroXLphMlK
2TGmUz26eVR7+C6VpeSLBuGMav8Aia7wSwcfS7boLrkLVKUCJJGxidjVq4YYsry4t7+yYvVKSUc2
wGVSFA/FHf8ArUltwzcIvffcDxdaL3KUqZuHi24oRqmZBPoamfxjDrNxVliib7DbtKckhKVtjt8u
s027ewktPJzJSjmA86mgrMpTp32FQOfFMQKmLudI01AiBXYzjRGsjqZ9KDCiHhlAOnXagETJJokZ
CMuhBp+xPuE+LegSIAHSkpManSiNtNqBgXBE9KUiEkdaC9SRuaKRmA6EaUdg7gI7U0ykpV+lPUqN
B9aaddKaBgI1PbzpRIpTKR1NIST5UxA60YijoBTQKOQD6UtqWx2pDcTQDCdKAMbUSZ8qVACToZpR
MkdN6M/KmSUmR86QxTTh9aAEHWnTqO9NsQhQJzDfWhG4NGM0xv1FIBE5dqXn0pbDvSOvpQAoiZ/S
kRSCgBB270jPyoAERvtRidto3o5tNaBPhP7UDFtNIATPTypDXelOun1oAMaT0oE6ftSGhoAydTrQ
ACSZnejm0EgD0pQRRnKCImenemIKVwdO0TQEehoCYopEa6RQAiCSSfrSyUPiEdBrSiBoflSAJ0Vv
FLNqY1A8qb+9OnLpEUwHAqSc870/RYnYx0qMKyxGo6ilIB3ipoYlDISD1qxboSth0HVRPhA3/wDi
q4czKBUJHlVopTbtW79u4Q4Qc6T+VQP8xQ+BoqhMT0VUnOKkgKSSRsRUlvcC3vkuvtIeE+JtXwkE
fvTCIEpM/wAqT9wXsJpYcUVKJSuYSOgFTPKz+IolJMEjYGg80k2gfGiivLII3idqjYDmVRSdCYKB
1+VLnca22CpwFYmRHfc+VSIu1WylFOqjoCrUH1HX1om4zITKUlAMlJqS3WOWoZAQoypJHfoDSAls
Es3SktvkNlSoS6TH1NB6zKHUhK+ahB1bV+v/AM1G1bupDxaBUhIzFK+o8u/ypynFQlS1kwAEq307
TUd9i+1Mj5ztg+U5SgHUBWoIrNtCyxHDXFpby3DIBgkakn9RvsZ2qjdAO4eXjDzayQlSlDmII6Hy
o4fhtlcJZzXhs1yUuLKSsTEgx26UnTV9yo2nQ5l+4vErU3CXQktoWFELOmoPfSd6t8H43Z4P7yze
22cPIKQ8JOQ9CRWMbcewh0KStC1GQoDxA/671sOG3tm7g7yGre3ef0WsOnxyDMpO+2hBkGplxVbD
jzfcjuk2N6AtxIClDwPIgRHpTE5RyG3k+9K1Cy+BkI/KQoaj9ar3occHMsrJaLV1RXyk6pCvIdh5
VRbxBTqA2tKiltOUDXwiZpJeC3JXuWb1FqzdFsrew9wQpGY5069QodDRsl233q6L122WA3lCjmCH
CdlSmDI3mmYxfsXzWHOpl+4aOV4uCQsTI/TTSsmMFwi+N0sups/DmabbdBIV/DrEjtTtJbk7t7Ft
u7vrdlKTZC/toy53fxB6pUNfqKw/Et83d2yGmnXwZBLL6CMnkCZkVHbvOYW6Q2h24aQRDiCpBSfM
VdvcZteJ7yb5xFk+pICniklCoECRuDpUpU7opu1RqAEuJSRMnrT1QkQNqYsBCgZ6709YAVrp2rqO
QG4npTV6J/lRKyR2AoeGDGp7mmA6c502jc0CAPOik5mxGwMRTCTm8qAHk5UiNzTEEEqHU0Scxpqx
lUFUITYctIiPXypwBgflH60iIEAUWMYkQqDpNI6TG9Jfw760ozAEmaYhs60RpM9aKtPSmqNMBTS2
pAwI2NN2piHHQ96MdqEURooEH1pMfAp0pbgjYUSIHc0NzSAQkAAnSiNvKgdRHenBJKQaABtSMzI0
NLvS1k0DEBpPelsaEkenakdfTvQAZExE0gYgHUUgBFA0wHEwe9CgfCYomkABA2mD0oz22po38qcR
BpgN3owBvv0FKeka/pSAjzPegQpPYGKETrMn9qcFSdKComR8/OgKBO9FSITqYPQUUrCSFdjsabqt
RJ3NMTHA/KelLQQd6BE+tAkncTFIokBBTrp2pucp0ImmxmPcU4pJmOlIQlHSkQT/AEpIGsU6EqMi
Qk96OBgGiNdjSClJ2Oh6UUifENhpHlRSAqE/CRPiH86BFhooVbvEwFJAACt9ajSy6y026Uwh3MEq
OxjQimqQoKyq2EEnoaeCEKkapB+E61BXIzKtxJASShsySBMTRS6WHAtJCuo8quYY+be4fAhaVoKF
Ij4knt6b1VuWUJCnG/gJgJO4ovemOtrJbluEoOUKSrXMP2pnMCQOWdCIyq0I+dN95UlQOUAEQQRo
rz9aKGw88V6pbEAqA286KrkLvgltsQctjlSZaJEp9P2NXbu2Q3kfZIctnJlJG3kfrVA25RnCmyoA
SFJ0jz9KnabuwwUNHmMOgwAd430qXXKKTfDKrCGXED8RbT2eBI8EetZBt4hLjqm1AggFxHwHyPY1
XtWUKtC4nIpSNHEKMEyd/wDMVZw16+wtz3y0cUhIVlOsg+ShsRSe447UThDWJJQhgIS+ZGRWgVAn
Q/yrGXlu7ZLCtErzaFO9WHGveXErQA28skhKYSAr0oX9w8py3ReMlp1J1WRBUO5/rSjs9hyaa3Ho
evGmwG7krQCV8sGIJ3gVY4Yvm7e/eau8qLd7RTq0Zi31+U7TUTTBduAA42krOjs+EmrtsyEOpU7Z
qdQfDmaX4067oPX0NS2qaKSdpl+7w7CsYYSuzdYbcTAzIlCiZ/MnofMaU28wy7trNVwMr6WwApK0
5Vp7GNleoNVcRw52zZRf27rN7bOSQtKcjiYMQtPQ/UVKzxI7f2DrZu2mXMoASslGnUDcEeVRv2Lt
XvswWeJWmdHIzuOKEOZxBPlAOorLYqprEcPuLheHMOltsJU8lSUOAxuU7n1rCcMWrV0u+acvLa3W
hClhNwklLpEeFKkiQTrvpQxey5LAKSlxfXlOFwQfXahpaqGpPTuasoEpk9KlCS6J7Dc0HAAkpHzN
JaoSlIOgFdd2cfcaVBJ8OvmaSIG4mgEE+VHeAPmaAEgiFDUqOopZYNKMq09ZEaUSkyfy/vQAM2QR
1pq8yhPbanAdtjR7ijgKEpWx7imz5xSQkZDr4gdqFABKYpqT4SOs0TMxSQYXHfSaYgQTvpSgA6D5
0VaGKBMDWmMBTqDp50AJNFRmkkTPlTJCNJoUZ6dKG9ABnMnUgEaUBBoESKcozsKAFok0UmFTH0oZ
YogxtSGKetLrtSGhiJ70SI06dxSABBFAaQDqKO1An9KAENNKPofnQ1Ag6pHSj002oAMR5mgROv6U
oozMUDAdRptQGtOV2GpG/agRIJHQ0ANkyPKjv1igZop1Pl51QggQD0FNmTpSOugJikdKQCGnpRG1
ASKKAVKI2HWmAdtxNFBSFSrQCmpGojTpREExsOlILAAd9p71JmEEEQqNKZqN6KQIk0mMKQdk6qP6
UEpBSQRt1ppmST9anSrOmd3B06KT/WjgXI1D2RC0lIMiJ7elBQE5gdJoKEKkHTzpziMiBOhG4pDA
5KUmeo2oBaye+m1Gea4SoxGkUlIKTI22oAkQ8lToMlE7+R7inXTpeUEmCqdSnY1CnVQQrQTrPSiy
hedxaUcxKfi0nTvSruF7USpe5RQFtpdQkzkUdDr/ADqe4SGHVJtxLLiQrKTOXrE9ahaa96U4GkFQ
SgqA3IHX6VO2orSlaABAIUAd+u3yqXsWiBF5ynEraBKYgtqMwOoqw1yPxltrUEpTKCRqk9j/AFqv
dM8pMpyk6EKTuJ6GkuyebshcyhTazk8KpIPYjcU2k0K2iXCGUPPguIC0qlIGfKZ8j0NWEsv2Yd5a
1EE+NsCY+XX1FQYepKmktqHMAPib207zU7totLjfu74WSgLAQo6eR7EVDe5SWyGi4DqDmQFoQZhK
vEAe3lRxlxpak8tbhHRLoEjykVHcqK1ZblgNOpMFxIgj1HWqriCbgNyHEJOihoI7+VNLewb2oytt
h1w3aF1ttKQhAXmSuc0mJynfXepLHiG8w+65qAEyZWlKJQo98vQ06zeLaVpS6WihOYoJ+IeXf0qz
hd3asYuxduZkMqQrRkgqSqOo7TWb3u0aJcUyniGPJXavNW/MZbdMqZUqUg9YqKytRyFPstpcQ2AX
EOCYnTUdvOr2M2Vi7ZoUhxCrjVfNaVIWDsCNII2NYdi4vGGklCvwwCk5TBKTuD3FNJNbEytS+YvI
s2nEhdrmYcEhbDij8UbpPSiXnLVPLuQsur2W9pA8jVW2uy9cpK3UhZInnag/Os6q7S3YjD3mG7xn
mh1u4SonJIgpg9Kl2uS40+DTsxJNOQmUlW5216U0iIB0HWjzBkAAjrXScw4kAa/IVGVeXyFI+LU0
QIBP6UA9wE+ICfOe1TOjx7gzrpVd0QodZFTLUkqGXqNAKGCYo0neKYroBBJ6047a/SmTHmaSGxqC
pKsoEk0YgnWaJGVSSdxSUMpNUSgGaCtqWp/rRGojegYiSobfOm6z5UUGc47a0CZpkjRrTgYNDpSi
RTAMAUtdKHQnrMGl2oAcNBFJGiiNwevahMUt99PKkMMSYGtHy2NN8xvT16AHc9aAQ0nXSinXwz5i
h0nakDMEaUAE9jQPekkZie+5oSaEOxA704EJ32obdKWnXagQ9QApszA2FAE5QDrGoogA6/UUh8gG
mgokz1pK18qUhPn5UALNEyaHWenajGgJpFMBJpiFtrNN696cI6GgTQMER6UZgQNup70pzAjrRiUj
0oJ5AlUk9qIESUj1FADKRpRSZVQULaYNBSunT+dFwjMMp8XWKaAYnShCHk+BOnzoSpCsydx0pTI0
NLLmMTSAE5xU6lqdDaN+Unf9ahX0HUdalSUthKkyTHinv2oYIYtMpCpgntSzqTodu9OWkg6apOop
pB3iR50hj1qGUkayNzvNAIU2hCkOfFIMdD2NRhBWspT9JqRsKAATrJ+E9aOBIlTc8ooW0VNPoJEp
MSP9TUiG3EWxdAC0ZoUAdUnpPkagJS8CFDIobT+1JCi3GkgaSNJ8qmikyW5LbpbS0khQEqJM6+VT
2x56yiAXFDKUn81Y8uFK5SCT1in87OQoDKRsRuKHEE9yyLYrecCAvmI1SAPFp/Sj7+40RngmTCwN
R3BFWLV1F66hS3wxcEzzVEp8Udx371HcMuIWS5lDh0zDUK86n2ZdbbDmcRBUFLCXBGUBYzD51Fhi
rcOXDj2YDZASY1qmUFtxWUkCYp6VFCVJKJTvI6U9PgjVvuZX3dsBSHs4B8SMsH5j+lRixuHG1LQg
vttjUogLSO8dapIuFNjJnK2ZnLVm3YKiHWXkghUBBXCqmmjS0yutxvKsIJkaAkQT6irDLYuGUpRK
VgakVVulqW8FrBKycp7ms1eMWjSmAzctXKnGUrK28yC2rqkgjcbftRII72YV5kIVlUkJWDqCNDVi
zvXbNJU1CkgQQoyPpWS94t3m8l21BTs4hOp8z2iq1vYSQpTZda3C0bfWlqtbhpp7H//Z
/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIA
AhEBAxEB/8QAHQABAQEBAQEBAQEBAAAAAAAAAQACAwQGBQcICf/EAC0QAQEAAgIBAwMCBgMBAQAA
AAABAhEhMUEDBBIFUWEGcQcTFIGhsSJCkSMy/8QAGgEBAQEBAQEBAAAAAAAAAAAAAAECAwQFBv/E
ACgRAQEBAAEDAQYHAAAAAAAAAAABEQIDITFBBBJRYYHhE3KRocHR8P/aAAwDAQACEQMRAD8A/wCZ
fkxJ+medUzsaak0aOuFdsa4YXl2xiVY6R0x7c43jxWGmspx9nDOPTZufhxzxJVrhWpRWd6a1l1xz
/JuTlMmpWRq1nKi1nPLhQzLl0mTzzLlvHNEjtn08nqdvRctx5vU7SLXHJzrrk45VrWRaZWbeVOKi
OkLEumzTAKaLV0orNprK+WSqDsECFBfslaAS2lFGkDKDXaHX7mXlNC2zO2ktDi3OmZNNRm1uQpNa
TVxmwfErRpjNgbZsa1LGTopdTAVo6VUVJy6+j6OXuPX9L0sPjMs8phLnlMZu3XNvU/JsPL9X9He4
+s+j+o/ZYfp++tj9Y9xn/Te2/psd+rcvU/46w8zK71ucv9K/rX+LP6E/hP8AwV+g/p3+HHt/X+m/
rv1p6ntv1J7j3Xt8fUz91rKW+p6ueW/+01h6Uk+Ovlbb3/Gfo3vfY/wb+ren7zP1J9Y/U/pXPCel
7L3Fw9v7XDLC47/nY/8AK+plu/8A4k1j/wBt5cfzb1PUz9XPLP1M8vU9TK7yzzu7lfNt+74vLoT2
/rcepe3T45fzX5/Kenx2+j33l+B070/PK/t97/Xq+h9j7D6h+svW+o/VPf8Avpj7f2vpfzvd+991
nJx1j6eM/wC2eWtY4z/ElrX6j/iB9X/Uv6e+ifQfcerh6f0X6LPU/ovZelhMccMvUsueeVnOed1J
cr4mpqPnP5mUwuEyvxt3cd8b++mX1J0p73vcs7eO3j7/AMdni97tk+qSG3p1jGzI7ehn6OOPrT1f
Ry9TLLCz07jn8fhnuayvF+U1ua4774c8cWPRRJrk02LQHF6MJ04Yx3w50xVjrjGpNLHityMuh1w5
5zh1kZzm00eXKOdd845ZTTWsubUy4Zyg3o1lq1jK8K1mgNt45OVrWN4Edfk451q5OeV2i1m1zybr
nkIxehKr2Ng6StyuONblB0rKlGjQVmtWsWrqHanTOzs0wqqJdMFFP9xV1AQouoTiDOE0aUUaTVww
wca/JjOtNytzpzxbx6RY1I0J0ZE1oWCNXis28roFo0Kg0u4Upii1sxpZWWH2f6a+n/RPb/oz619a
937j18vrvtvU9LH6d7bDH/5TP547z9Tjn/jcvjNznHd3Hx1dP6n1f6b+n/mZfyPn8/5e+PlrW/8A
xy63Dl1eM4y53n6fD6uvT5zhbbN/3le79163vfc+t7n3Hq5+v7j1s8vU9T1fUy3lnlbu5W+ba4eW
qze3edpkcgPBZrQUyUR3agjU7YaVnKkPanCauKd9O2FcpHTFLVj0Yus5cMK7SstNyDKNQZIrz+pO
XHOPTnNxwyWVHDKMXh0zcsmmRRsZUbGBbypRUByu3O5dtVxt5QbtYyql4GVTRi8i1Wq+QLUvDE5M
oOsuzWJWt7NGbGL26VjJdAhvS8g1Lo9stQFR5LNXUHlFLqIwHFFbnK8AxNUxqMtTbI1O28WYZeU1
qOuLbGPhs1Rk53t0rGSjJk2DAWg2zV0U4rTLS6gojVGtNamBmzbXlmrKgrNarN5bAtikZekxnezO
Y5Ojp/ZQRqcJrajc7YvNagOuNdsK8+N5dsKyO+KrOFbqNOOflxyd85qOGV5VHH1I45V3zee3ldZr
nldiVZXkbGKbNT9x1VKzboFnXLKt5Xhzyoh2LzGZlo7QYva2qE0RlCUblblcpdNzJNGmcir0o51G
wA1OjGYYDQq2pyAVIUWmpOBpRNGjr7CNJopWozGsUtWNwwRqM603i25xucqqyrF7ayrF4VBezBeR
OyDpFtSpoR7BnAq0LNflr8C9LKjAprNaZorNumvuzY1KgSX+GtZehqMtRx12xqN7YaNVVqXhmnFB
0xrrjXGXTcoPRhlpvbhjdOkyZrUWbhm75cuOSxK45uGXb0ZRwzx5VHDOOe3X1I41HOtbFogtNQWs
WtWueXRoFvhWwbQNoS7BJQeU0JlZMpo3LvR2xK1LwozQaIaNQiUrojAZzTQ9oybOk3RkyH4qTSau
GRqRSNTHTKs/FqRrS0NYmoNaIpnbUrDQLLpi1u9MZdqBVRLrJla3ywtko6KCVqNKYbLZb4nLMXan
lis1qs0ZZ2zTQ0yKiNNSj1aMELm6NTtvTMaFChCDeFkvM3+K3jXKcNyoOssblcpW5SrHS1zy7a3u
MWsrWMnLObjrk55L5ZefOcPLlNV7Mp28nqTVVis7FQoyL2zkreWaCtG9K0M6Ha2EimEQiirfFQAx
rbDUoIb5LN7VK3DGZdmKY0YDE1W8WpGY3JwgtKY8nR8xNawyaMRiapkaxmxI1AWh06M2IM6HTViX
QWsZNs1dGUkokkIpdNyuflqVYN2q3hna20LJi8G3YpGWaKaK0yCEuj1GdCVrtl1MaYjc6TQxQFAm
CKGjpK1K5xqVBvY2N8i1Gqqxl01azRlxyeb149Obh6oV5sha1nNMeF1zxnKg3tmmqL2l2EZIW9rw
KY0w1O9DS1yGqKgEko0zezORrYGcNTtnvTUEanLUZbgrUjbMaZ1YZ2WY0ikwKA3GoxGpdg6RVmXR
l2AsDVZAVmtVmqMUS6N6YqxK3KN6rOyo1tbZWxG1tnZ2BF54W1aozWeq0zWkqIOlZdsa1tyla+VY
11dJlW5nw4fJqZoOvy2duUyamQOkp2xMj8og38mpXP5Q/IG9i0fIWgdi3bPyVvCaM5VxzdMq55Gj
h6k3HJ3ym443tYzWLthu8sXtQCWzV7OhoQ5XeVvE3zqQRbSaGccNTmsdNIrQs2JdNIM1GzQBTk9i
FQ+TNAg01jWTig6Y+G4xOm4mtGdtMNGhQ2TQynHJlGjptbZlSDcvC2xs/JYGs07FUYvTFbvTGSlF
UovY20y1Vtna2De1Lwx8jKDeztiXRlA0WEUBI1oRqTa6jOOTXycpTtB0+Rlc9mZC66S6amTn8tmV
NadPkfk57W0HX5GZOWzMgdvkPm5/Jb2itfNTKOdql0I1lkxkreWbQFcc8XftjPESuFjFm3W4sWaX
UYZrVgsABJA+Dtkpo01OmJTKmjTNjSXVxmdla52TTFEkaVqNSsxqJqY6YtueMrpj0jTU4SVig6QQ
NFnZlArbNpAmVnalBr5LbO1tZQudb2zVGKzWqyrKBDQtmVnyvIN75MrGzyDe+DOWNmA3GozGpdjT
zSm8Mq0YblMrErUoNytbc5Wts1qNyncY2dorW0zvS2De0Jdq00Vo3wNi00atZtW+Amh2bywdmjOU
5c8o7XlzyhqWOXlluxm9KjGuQ1YtMaMo65DIttS7jOmoDUpZjetq0EdNaQZ0ZDoxdMUjpjGdbbxB
qThasphvSBkFWxaoqNi3gb5QanaEpq6JM/JfLg0aTPy5VrQdq3VZGyDpv8i1iVrbRorDdYoytlja
2o1WTKF0NMu2Uo6ZT43W5fzFKzKZdA6RrbErSNPOklZTUmh0ZxwBajJ0lCdslkMujtlC63KmdrbK
tM2naoAJAtrbKBrbOQt0LdoM2s02g0ZB0tMpiGigwaKUgpkbnAkaZ0RgnCUbBnKqhjU7YnFbx7TR
qLaFiit0zcjbtzyuga+Q+THy5HyB2lO3GZH5A3aLfyxch8molb+RmbltfLXlUdbkLkxKreQ1q1qZ
bjlKfk1B0t2xad7FAbi2ygal5LB2DSSa0TUZMqjpK1GJ03GascdIjTSKTZKBTs9fgQ+GaIKxILda
jKl0EaQlLLSIQGipVBmi38qs2gLQLRamhqG9Le0C18WY3AYuPI06/GUXAGNI6UnIGcEcRfJkIl2t
7Gwblac5WpQa74anDBl5QdJVsSoUMZN1i9NRHLK6G9nKMbUOz8mLVsNbtG2dqUNa2tgtayZTtlbU
O9He2VLpRuU9sb5a2oAaAMQ2dgZTtkxQykQg3K3i5x0gscyIZNxpEjr7qxBFmG1AJJBJADD2Ey01
OV5GxsDsWoVMBazkds2oM26G/CqQSSAzhuVicwwHSU/Jz3T8mRrKMdHavKAl+6CUSQoNb0ZdsbMq
Dct0d6ZlWwdJkflHKX+x3wDdyYt5FyZtWCyc61axWhIEZSGzsDtpgwGkkuiSTQjAosGts09i1RTs
icGAUolGoZyzGoDUbjEalMIxGoDOGhoX/JrNZEgagCgBQIJIMqRtC0VfIW7QtQFvItTNZEkAVqgp
ghjUGLUm2VCa+IAHYSBnNQN5gAZdEd0AkgMp2ygPyXyAtUNo+QtZvCjVrPK2Ldqmra3oIQymVkwX
GlOB/oiNRDpb1AKlHS21o0gVEkmhRoL/ACBSShjU4Z6PlYNTksmVRGMkGti3S3wNshtW+WdmA0hK
UECgSCZUXgXtoXsKxQaGasGQVSCCF4omo9CdtBDi3IxOm5WVI0UgzYtNIBIuoUDDN7brF7BJACkg
FrJFBbFFqagEqjWUkjQhJWod6ajB3RK0khEkmvIY0zCoUlOfLQo1EgSSagTAZ0BIUUVVpoQSWxtA
pIDCztqIHXKsR3z+GQDyb2BYhaqAGTFbrNjNUXkHmBAbZt20KIsWmZ2UI1K1GI0itoHaCSQNSDRI
MWcOeUdbGaDmzWrNC9AJdHbK2BF6SoM3sGgFsU/7G1EdA9KiiH+ip4SSFMIQljSEKxFGp0zDO2hp
CUrBpJKqSSxEYCoSzDFCkqmgvC3BypGQlIEZQgbUoiZqwoJFGQt01eWampWQaEVXlnppUGexZtrX
K0DMJsUjIJ21FIYgZNFRAookDU4hZlaSjOTNatZqjOUZarNAWbZvDbNgBIUBV0fKvMBmqpUBF1VY
NtB7MZ2dqhQNFRCEph2yZViNJJoLTDU6aG0ogSS6aEklDtb0CDdCqZB5Mi0kEtGRWAEQgjKElGtq
2aZTNaa2zV2kBoWctKgyDewC0kmRa8mY7aMiAmPC06ScL48gxoOnxHx4TVYTetDS6MmVVi8URoW6
HyQJmlm9gkkAsZ02AZvLNb1pmwACAZqNCiUulO/smg7XUCA7I2RmpJLBqEThNBMoTQ3KWYdqHf8A
4thKEja7/ZQkIG+zEZWAWLRQJUioUA2f3CCSQRJHyy0CEgoiAFm2WqygCqmRqVuOTWNB2a1tzlbl
NU/EWNS7WhpiwXF0ZsZGLHPOadnPKcLErnUqN8Kyr2FbtAkkCF4KBiq8mi0Gb2GqyAyByAJJNRKl
LpGKLyYkIiC1BRpkqFLtNQMp6C3tQwjZBERS8tDVnN6v5iSB04/Y9VkzisDQW0lCLVKqiiCnyhAl
2kqpJMqV+4M15BK9ms1KAXs1lkSSBGXQQNzJvHJxalB2mTW45S7alGo6CjfCt2lVVjKNVjKolcso
G8mMmmQkgSQoFJALGbw2zlAc0bNAGalUoklZppKj+ARCkgRCaGpOEDL4UKSURCihnJlXlKIrK7u/
9JRQ7BlUdEkwGebs7ZMSh6oq8pBLtaSKklrbKhHqoFranCAN72zeUrGRmhqs62gg1evyyCSQIy6C
B0l01HOVuUWNbXyG+BsVq3hi07YypjLNrNNoBJIECgEKQIUq8UHOwdN1nIGLA1emWoJJKz4Ot/sh
GvIJKJQ74QLQvsbAYBQhWCSShSilUKUSwKX3SjtYK6WM2bc9GStLSCHR6FBGaBiVYdaI0WVFgsNQ
Bd06WtAtDRVBm8iQ1MgDS0gwTYtAyiAMaZIHY2reQDW2bVtm0Be0gC2t8jhS9A0FsbAy7InRBTs2
CVq9AxYxW2aDAs3WqGxm8VQ6XkZqhGtGAkomhFKKIrlbAoFoSSAregQU/wAHsTs7URCUezQsavX3
Zsc2maze2rBeRKykhElGtco0pOCCgkfAQSS0CBqBm9rTSkZwFn4GuW9cAVnQa0KiMZBqgA1WTegF
GzemQa8s3s9i9qCrZE8oM9IhRJJBbal2y1FCt8JIJhtiqDJlqzYvDSAclCAgtCSQI+fskotlTwVE
klwSSBQgqKJLYH8EdxKPczWhXJpmsWN1mxRnQa0dCYJDrhqYnTNVjRk4akWkBoRrQAWbUhqAWKw1
a5ASGQyGSICxmxuxkxWQ1rtXoxHKqTk1RMBYGqyAZNCiipisQApvCaGaitaAaDVg0CkaBTBJIwQs
5IpgyLGqFSsg2aWuFiDpJNCSIArS+yh/sQVgkkCSQEI9AklpQxSCHfKj3C9FObTNg03oSANKTbUx
MgCY9/g6bkFjIz8Q3oaBiixuxmgyiogDpSNaASFIFWa0zeehQr0dARzyE5ayggKzhi8V0sYyBm8s
6aXYCQqEGbBppAyjYASS0CS0ZACa0NANcbS1wgH+xZo6GuBKyiG0U4u9f+zY1WksGUdLWlB3T0kB
VSBJJRHoHoAZAVF5W0gKS8xR79HvkTs1yaWlpNSIKTZ+PLUhRRIrEagxWa3lGLwsRms7arIDSMWg
UKSCSQIVWIFpWbKFYyx2y6WbYsEZrNbrAMJrXIvYAoA1FpT8EGbBp0sYsBnR0dLQAybOjoB8Vpr4
r4g5ix0sZsBgXbVjPayJWaGqGkQ/c0NhSQJJAtI6SgS0kEQVEClFEpdLQhkSiFfoRHR1w5tBqM+W
og3FpRb4RVpC8JAVnKFCMsWOljFijMI/0SiSTIkkASUApIEzY0gc70xe3WxzygMilNDCNmgBjTM7
ahgRYjOWQaR1ytApOVIYQSk2o15Bmz7sWOtjNgOVjFdbOGLGxistWC9aaZZKSwSSaDEpyu0AfK8n
f2UG15XZ7gDS0dIAvJ0tANcFLwCSIP0tHTUnLXxctactcqzh0uIyx4BmHYhTBXwvCtZRUl5SomLG
qL2yrCV7SokkgkEC/BgIJJAkkAs2zlGxYDjlGbNuuUc2krNnIao0qap2Z2NHQunbUjM2Z2mKSGoy
A62dDQIxIELCgYrnY61nKNQcrGco3YzY2zWPCNVlxtlmr9moAgyKKQrpIJJKL8ogF0kQCKAHRuuN
b6539wA0itbB+zMW5iZjy3ji5OrlcGbjw9FwZuCDzXAV2uLnlBKxeB01emLRlUWi0UDtbFAKzkeT
RQQIQS8omCSqQSSBJIEbFCDFjllNO9cs4sHNHQvDogq2WBDsysmXRiukrU6c43GKsaSMm0EjJooM
64WmtDQMWM2OljNjUHKxix1sYsbiOd6ZaygaiBHRii6UXc2gKS6BaRnSsBkpa2CSWtiJLSFSR5B9
D8WscWriZOHF3wXFix11wxkJXDLHlzzjvYxnNojz2ac7+ztlOHHNWaxVrct3OPz2qFxBvlJIG0JU
8CHkhBIrpRIdnYJJQEelF39kDFtRVQVjKNbFJByvYaobRmxm9ummLAZRAhjpixi3ilWNtxiNyMKZ
DrlSaa0i4zoab0NaFxhmzTozYsRysYyjtY55xuI4ZRl0ynDH+24yP8mLS1wovC2bbebyAMVSBqXi
fdCEAuiqAi6BBeVtJRLWjJuCzXkxH1GUEdMow870rw55Orll2JXOjLmNZVjvasudjjnO3p1vbj6k
5SJXmrLplNVixpkCmjXKBSQJJIJJKBFKKHyGogvC6SUSqis2DHlZGwVRizkNWBUGts2NWcjQMyCx
vS0IzI1jwpOGpOUrUakbjOMbkZo1I1rgRqRlsaWmpFQc7GbNx0sZyWDnYxli61izcaYefOOWnfOO
Nmq6RkIpQJEEojICK0gSRBmnpJRJHQg0crz1JPtKLPyVH1mU1HOut4c7+HleoOWU7ddOec5VlyrD
pZwxZqqgmtOXqY9u3+nPOIjz5zlyrvlOXLKaWMudiasH91QI6XSARg0CSWlEoiC0ZNDRAju67KBJ
Ts+VwZsGmgDFg03YzYozoaaACw6KQEh0ZNHSCkanAjU7QabjMbxjLZ0LOWtcIGKxlG7wxfIMVmxt
itsOec7cb275uOU5biVjQsaVjSMrXTWloBIYlFEiAK0kAKSojIoYiiwabsGiI//Z
/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIA
AhEBAxEB/8QAHQAAAAcBAQEAAAAAAAAAAAAAAQIDBAUGBwAICf/EAFEQAAIBAgQEBAQDBgQEAwYA
DwECAwQRAAUSIQYTMUEHIlFhFDJxgSORoQgVQlKx0SQzYsEWcuHwF0OSJTRTgqLxCSZEYyc2ZHNV
dISTssLi/8QAGgEAAgMBAQAAAAAAAAAAAAAAAAECAwQFBv/EADIRAAICAQMCBAQFBAMBAAAAAAAB
AhEDEiExQVEEEyJhMnGB8CORobHBBRQz0UJS4RX/2gAMAwEAAhEDEQA/APnXe+ClcATvjtW+OgWB
frgCtxg/XBDgEJMtsJkYXbfrhNhhiEiMFIuMKEe2CHAIRYWwmy4XYXwmQcAhuRbHYUYb4IRiRALj
sDbHWwABa2O6YHHYAC2tjrYG2OwABscGx2OwAdjsdjsMDsdjsdhgdgRgAL4HpgA62Atge/XHYAC2
wBGDYAje+AAhGAAwe18BbAAFumBx1sCBgADA2wI6YHEQCgYOBgBgwGENB1W63wdRjmVRp0tquATt
ax9MCMRJA2ucFODYKcABWOE2ODMcJk3OGgAOCE4McJk4miADNhI74MTfBCd8TRE4YG22OAwNsMAt
sdg1sdbAAW2BAwa2OG2AALYLa+DWx2AAvTHDA9cBhiOx3THW3wOGM7BhtgBgw2wCOIwU4MeuAwUB
aSMEYWwpgp3xlNYnqtgdWrBWXrglyMMiHPXBDgdV8FbYYACMLYIcHJwRt98BEDofbBGGBJwBN8Ah
JhvghGFWFxghGJCCYC2DEY61sAqCkYDB7YA4AC47HWx2AR2Ox2OwAdjsBjr4kAOOwGOwACOuB7YD
Ag4AAvge+OHbA4ACnHYHAWwAdgLYMBjrYAC2x2DWwFsAHYEDHAYEYQzgMHAxwGDWxFjOAwcDBRg4
3GIjAwU4E4ITgAK2Ezg7b4TOJITCE2wmxwdsJMcTRFhScBjib47EyIYYHAA4G+AAfTHAYAYG+2AD
jju2OGBwwCnAYOcBbAAS2OIwJx2GIDpgb462BAwxHAbYN0wGOwAccB0wJHXHWwhlqYWwQ4VIvgjr
jKaxJjhNhhQjCbYkiImbg7Y4NfAtghHph0I5sEOBJ7YIxwEQDgp3OBOCHCoAScAd8dfHYAC2xxF8
CcdhiC2wBwa2AIwBQQ4A4McFw6InYA4HAHDoAD1wGOx2GAINscDguOBwUAfAjBQcGwAD2xwx2Bwg
AG+BwNsDbAAXHYNbAEYBnA26fTAYG2OtgADBhjrb4EDCYwVwbpgBtgx6YixhcHU7YITgQdsRAEnC
Zwe9xgmAArdMJnCjYTOJITEnOEmOFZMInFqIMA9cBgccBtiSEDgeuAx18AA3wN8BjhhgGGDY4Y7C
A62ONjgcdpvgAIRvgLYPa+B04dioJbA2Iwe2OAwWAULgbYG2OthDAtjrYMBjjhDotbLbCbDDki+E
mXfGY1UN3XDdxh4wwjIl/bEkJjU4KcHZbHBDiwrYQjBSMKdcAVwhCRwBGDlbYKRhAFtgLYPbHFbe
2AAhGA6HBrd8AVJwABgpwexwBG2ABPBT1wdiAeo/PBTv03w0RYXAE74NgCMMQX74DA4DUB3A++JI
iwDjsde/fHWwwBU4UGEumDrgGg+BGBWJmUMFYj1AJGAGIjD4EYAYEYAOIwBGD4NFDJUSCOKN5XPR
UUsT9hhcE6EbYG3rhxPQ1NKoaammhB6GSNlB/MYQtgu+AquQLYEDAgYG2EwA74HDzLsmzDOJDHQU
NTWuOq08LOR+QwpmXD+aZMFNfltXRBuhqIGS/wCYxU5RTq9yWl1dbEa2OBwZhgmJEQ4O2CYMvTEn
lXCuc56C2XZVWVqD+KCFmX8+mIuSirboaTk6SIh+mEziazjhTOchjEmY5XV0MZsA88RUb9N8QhIt
1H54lCUZK4uxSi4umhJ98JkYVZh/MPzwndSfmH54uRWwtt8CRt03xbeEvCzijjemapyfKJaqkUlT
Usyxxah1GpiBfcbYX4o8IuKeDqBqzNcuWGmWxeSOojk0AmwJsdrk2Hrin+4wqehzV9r3LfJyadel
18il4C2FVhZugJ+gwcUzXtpb8jjRaKaEALnBwuHCUUx3EMh+iH+2Lvwd4KcV8a0y1VBl6w0bMVFT
WSCJSR1sD5jvtsMVZM2PEtU3SLIYp5HUFbKEF3wYLjQeOPBbPfD/AC0VuZTUDR3AKQT6nFzYbEC9
9+nocUPScLHmhmjqxu0OeKWJ6ZqmJ2x1sKaccVti0gE0462DfcfnjrYAC22wFsHtgLYAC2wNrYG4
9Rjrg2tY4AC4DBrH0/LHacAGyr4OcXSi65QxHS/NT++EpPB3i1Yy5yd9IJBPMXb9caKr11OnNFTW
SHmG0bEHyiDSbkG3zWJ9cKUyZvHVQGqq6gQiWPmAWY2EJD3F97kgn1+uPI//AEc1X6f1PS/2eP3/
AEKdkn7PmfZ7QCpFZQUvmKNFM7a1YGxBsOoIw4P7MvEjQa0rsuLFSQhdxv6Xt3xr/hbXJR5MIcxq
2NSJ3LGYeZhtvi/0lbTVVVCrSjlF7agfyxkn/U/FRnSa/I0Q8BglHh/meOf/AAK43lcouSMSBq/z
o+nT+bAJ4AcdyOyLkTFgAxBnj6f+r2xuHGMVbNxHmE2XST0tMzVWmNGDJfkBQbXuBr30+u4xCz0+
firSRKuoBEoQrJpNwKSzAgHe77/6tu4xtj/U87XMf1/2Zn4HEtt/0K94P8DnIeKqjh/i/hKllqJY
fiYZ6sLIQoIUqLEjvcHtYjvtsfE/gVwjn2XSqMhpqJihVanL05UsZG9xbYn2I3xm/h5lOaVXi2Hl
qhVT0mTQQypPKNSu6qdze3VSb+4x6FppszpIVE9AFRyzCWKQSKu3cDHK8T4jL52vV0vZujd4fDj8
vS49etHms/s+cEqEZ+LqpVZQ12WNf49H6N5T6HrhxB+zjwXW1SU1NxHmM855hMYEQP4ZtIOnVTa4
xO55wctVNWTVWzyrvemPlvV84nY22H54luFcmgyXiGDMrIjRrW3ZFJ1NNMrjub2A6/bF78bm02sr
v5IrXhcV15aKBU+AvAsCO3/E2YJpV3YuI7KEcI99v4SbH0uMWzwz8P8AhXLs4zDJIqPL8+NMQWqq
qBWmUNqISQHYMpU2I6hh6Ya5x4dPWRTssEkjVUVSLpCzAGWoEtx5ulh179Dia8Ncgq8k4z4lqYY4
+ZUzKzpOph0tZmHW/VZAfbcYWTxE8kHqythHBGE1WNIceKHgzwlXZM9XU5XDkoitK1dl6CNgo63A
BBFvbtfGXDwY4J1aFznMGYMVI1x9Qmvby7+Tze4x6I4nOZ53w5XUUdMkbvSvCHjYSBtV1Ngfr3xj
dfwpDFUToadWInmkDcm2zUwhH8W24vbsem2K8HiZpOPmNJFubw8G09CZB0/glwTVU9TNFmeZSR0y
K8pWWM6VI1Bvl6Eb4Sh8H/D55FR84zElmVQFlS7Fl1Lby9xuMXnK8jgyXKM8hHmGY0sUIUQfyw8v
cA7XP98V6DgaSaWOqgppJYRJEwk+EOnyQGP19TYj77Y0rxOTf8Vmf+3ht+Gid8KuF+HHpaikp6PL
80pKZ9C1ctMpeQaQys1x81msbbG2CeLHhTwlVJRy1lLFkzSSCNZ6CMRF2borWGk37dMLeE+VVOT5
VPHAqIpkPlkGkgqojYWHuhOLDxnBX5zltFzIgRS1cUrBLOJFU6twf6YyebKOe4zfzNCxRlhpxRhk
XhRwE68x8/zARlQ4IKdC+i/y/wA22HT+DnAiUDVr51mQplnNMX1JtIG0lfl9cSUHBsKQCKSB0KRx
KTygANNQZT19jYYmo8ip5uFnyoRlpHzA1jeUaQDNr8p6XsMbZeKmvhyvn24MsfDQfONcfqUweGXh
tDdpc5zNlUOzDmINkYI24XsxGNP8OOD8ozTJiiUFBLHTNJBzDSoDIY3MZc3B3Nhf3374pi8AxVET
xR00uvRPGpMS2JkqFk3PoAPz9cXrgVswpcokalemh51TPMUqbqwDzO1rDYWtirPm1w/yN7lmHCoS
+BLYqvib4c8HLm8K5qgytlppJ1NEoh5gQanLaVsbDf8APFRbgLwyVyPjK62sx2NV/EI+Yf4f5d8a
V4g8M5txZPHI1LGzChqoLIA6kyIFB36WAJv2xVIfCXNaqTmpQVMkMk0roywpdi1OIl2+oN/bfFmH
O1BLzWudrIZMKcm1jTIyXwz8OqGmy2pnkrDDmMDVNMTUsNaKhc/wjsDhvBwl4XzSRJC1W7yOkalp
3tqkjLp+gP3xec18P84rMt4fo/3VUlMso5qYkxxtdmgMYtfotzv+fXETkXhDm9NV008mW1N4aiCX
URHbTHTtGRv3uevp74nHM3G5ZZfn7/6IywpSqOOP5GkeHlEM84KpMyg5Xw01Ks6Jywg3Db2A2vpv
9b4zPivIeCqjivMYc+gkWqppKamjWEmNdMgbSTpsCSQ1z9MaTwR+8uHeA8uy2n+HkNPRRwstiWJ0
3PT/AJiPtjP87yeuz/ifMMySkl5Dz0VQ6LYsOUGNr2PZtv1xjxuMMkmpNe6NWSLlCKcUys0+R+Fk
6q6wVOlhEfNUSC3Mcov6g39MSA4M8NlyWizU0dSaSrqjSRk1MgIcEjf7jDCl4PaClVDSzaVFMJGC
deXMz+m1w1sWKDIOdwzlWUNG6mkrfjWY7Bl1liNgd7G17dcap56qssue/QohhvnGuO3UgKLKfCys
aALRVI5xhC3qZBbmSGMX37FTfGgeCqcJrn0tHwxG9NNNSmpkaXUxsshQWYm43vcDqDio5b4dVNFU
UoijLmmNNcx3O8czP3XuGsMXfgjgDNuDK0VcEgSd6RqZVkQkrqmZwbW3tcC2KsuaE4uLySfs2W4s
M4yT0JfJE148FMsyFYa9zLQzyU1NMqKS2iWUh7AnYnSN/S+MlqZPC6ihdxkGvSJmN9f/AJcwjI+f
1N/pi5+Jo4hzuhRc1qIp1EkEyOkBhty512O+w8/X6Yh8y8IZ0NTDz1cOk6fMfLzJhID72tb364qw
zxwik5tb9HRZlhOc21FPbqhqaHw5gyDNM4HDUUtPl9X8K6kMdR1KLjzdN74SzDiDwzoJKgLwVTuI
HqVuEbzcnTfq3fVfFik4Bq5MozTJ4441XM52qF/xAJjY6SNr720/r0wgnhOmaLI9TUcs1DVLsLli
OcFHTVvYrf3xKOeEb1zlz3fb/YpYZutEF+S7/wCi5eFWa5RMmdpkuVpltFR1SxfDwfhq8mhWLepu
COvpiJ8Xsxop58nGY0clVl8lbIZ6QNqWRYKYyqDftqJP3xP8P8JNk8GbfB5iyLUyrUFVjudRRVI3
J38t+vfFL4+4czKpzDKopqxhCKxV12AI58UkTm9/RALYzxlB5tTe368f7L5RksNVv+nP+iBjzDgm
qekgh4ToxzZaWHV8PuDLEZL9fQW+uHELcIvkPD+YjhOi05tU8hEFOCU2Y7+p8tsOIuDYqOojEdS5
WKWCbzPYloozH/N1IO9voNsJwZXJVU+T5HTKqfAycyCpEoD7Bh0JsoIJHXGiWWEmtMn77vt/soWK
a+KK/JffAwizrhGpSnKcHUn40VPIv+GG3OlKL9bW+56Y2Dwtgpc6yXXBRLl1Kszxw0qKAEVWI6DY
bg4zeh8OBSyUKy1DxNCsKW56AkRMWS9muOtvbF2oMmzHhvKYaDKK8gJfVyyvc7739+18V5pY5qk3
z1ZZhhOErklx0Kz4tTw5fxJBHVZd+9aCKnjrHgfZHLOygkW3sLDEWOLsijkKf8DUhZWddqReqi7f
w+mO42y7NM0zXJY8zmQoC1G0htZVBDAm19+9/c4cVnAFE0pZa+lEepiWWTrq2P1xOM8MYJO/oyDh
klNtV05HtVn2U0NBkdUnCdGDmYZwqUqXQAE2+X2w3y3jymllpgnCcMbTPRqClKgI55Iv8va23r1x
I1lFFm9JlmVtWZasGXgrC6sfS3TvfDfL+AaPnpEamnZAYzqFww5Zuu5HviGvAl6rv5vv/onoyN7V
+Xt/s03wzrF4iyOjzGaijgeVZG5ICsselyo6C35YoPjNnRyDjDJahcpjzOLnPqpmFlUhYVSSw+Yq
ZDYHucXDK8jo+Hsvo6OkzN6alCyaljmCkEtqFyPcntii+IPDP7zzvJ2ec1MInVGKOzsgcNqPTb5E
39sZ8UsSyO1tuW5VPy0lzsJZp4u1mWw1Mq8O0wMXx4S6AAmnkVAPuGufcWxOcd8bVPCc1J8NlVPW
vUZVUVz8xdJVo1UgNYiw8x/TEA3hxT5gz/FVKQRsZWYpGbjmEagSRt0wpxDk9fxDNTRSrC6QJJCj
QQsGMbAA3PfYDF/4Fp1tvf8ABVWVJq99v/RCg8ZMwrc6WjjyeBYzVckXNmKiAy3tqsDcb+g98afw
lnDZ5wvlmZ1Tx86pgEsnIPlUkA2U9dr2xnuSeGkArAZS8ZVxLr5DFiQukC+npbF9Sho8oymOipBJ
KkSaVjYG53Ht7YyZ3iaXlqjRhWRXrZjX7RjZdHxHw4c0Saqyv4yTnRxyFSy6I974a13DXhZE1Shy
OqSSA1CMI6uQm8KBntv6EW9cTXjVwTmWe5bl8+W5ZPPUQVUbqiQu1gdQbt/y3+gwjnfCFSayQVNY
sNTWSTyXmYqGMiBWWxsL2F7/AGx0cOVRxQSm1zw6OfkxXlm3FPjlENNwf4YtJphyqrLFxHpFY7XP
J522+/l2Hqdsahwt4Y8I0+U0Rg4cpUSWLnaatBNKC1j5ma56W27YrY4Dq46pVgrYhUllk54nVlX8
ExMLfQ/btjSMsp5cmyugpxX0144FiMjMGDhdu59sUZ/EZJRSjOT+pow4ccW3KKX0GA8N8hkE0MWQ
5VGWub/CIbfTbGFpkXAuZV3LrMqdcwqKkI5SRoolZtZXSqmwWy2+uPQVVLWcp5afNaQP0GsbEfY4
yDK+Dq4VL1X7wS9NVHlguLjllgCPazG2JYMsopuUmu25HNjjJpRimVan4f8ADqpFOy5XOBMILXqJ
BbmlgpO/+mxxYuBeBeB89rTPQ5Ix5UPO1VcjOinUygaSbE+Unfpthek4LFMCqZlDI6mIKXlA0FGL
A+/W364s3BPCDZXKagV9Mn4LoFMu7C7MLgnoC33xbk8S9L05JfmyvHgjqWqC/JEnDwDkixqf3Jll
ha3+FQ/7YpniRw7w7QjKoqzJqYUtTUiImlhEbarHTcqAQtzc/QYs1bxJmOXTGF63L2bsAw1f1xXu
I6isz2egZ6mFo4ZwVNLICVYiwLD0GKMeSSkm2/zLskY6XSRRhkvAbBpBkkoRV1lTJILDm8r19dz6
DDmh4e4FzKoNPTZBI8vmIXnSDVplEfr6kH2G+Jj90U7IIUrTCGBR7PcsvM1hdz2P54k8q4SUTVMy
5nBAkoZNDTABQWDdb3O4vjU/ENL45fmzMsMW/hj+SNg/8LjmLMuuKk0Ns0MJFxb64ep4WRqQ5Wnf
Ta34J3/XD6CeGXMo6VqusSCviSShrdbaAxDBo5NrAqwHW1w2AGbBcpgzAR5jHLTypDmlCWfmQhlI
5i7eZQ4FyL+U3xwvxOLOlpiI5TwBPlgh5PLfRsGkiN7fnizR8L5jzEcCn0qwawhP98RuXzHMp5aR
ZaqOWogWfLqh2flSExk8tz0DB1KkG2xBw3nzzTlFFmsUGYNCJORmFGeYJqdjGSrW6lQ40k7ixviN
zfUajFDqu8Ofi2YrHTxtck3pybk+u+IKHgOlyTO1pc8ptUNU96KshflIGC3ZGG9jsSL9RiwQTfGP
W0ERqVzN4jU5ZUO0nIqF5QYRswNg2oMh6HocNs5XLc1y2hzGqo8zqMqLvHPSzpK01FUCMNGxW19J
JdCenTffBFTumNqIpReHfDVHmdVmEZC1lUE50wq9zpBC3Gn0P9MT0GT5bTleTVFbG9vix6W9MVHg
7IhFxHnVM0FFJShEWnMUDGzhVkvZj3DaTY/Y4vVVlWXx5zUyDIImoZKMNGRD/wCd33t5fp02674U
k06scUq2QzfKMolYD4vy9Sq1AA/pgkvDeR1SKPjZNNjYJVlR+QGHNFk+WTTZS0+VUbw8llqi0QUu
/QG1vL2N/f2whHkuXtTUIkyam54q25y8rfk3va1vNsbavb3wqfclS7CTcKZD5mardAB1+OOG6cNc
PU8800dUefM13k+OYltgO49FH5YeZhkGXQ02b8nKKRJhOvwraAwSPuTt5ul7f6vbERxLkNZTcSyt
k2WQJS/4SoFO0dgyXImO49D0HdfcHBvxYfQlsu4byinZw2ZP5je5rOg6gdMFquGuHNe1UkgLXa9W
bnC2aZFSvDmklLkVMqSKjUmqGxRu7XKi/UHTt+mAqcpozmRcZTSfBtR2MZiUaprX6geTuMNKuoV7
DCp4Y4UlXzOHK7hvi22w2XKeHcuKGOrARSSsfxjWv9MO6TKqVEyXnZbSkpqWs/AUauoG1tuoN8IT
0FOmXSqctpVmWr1qeUpKxXB0j+boRv64lvxYq9hvFl/CtMrpBJTwmQksUqH3JJJ7+pOEJqThmEEP
XR2a1/8AFNv+RxBZvkWdjjN2y2mhp8sWrimanZAv4Ogq2m/W5ANvW4xZ80ypoKWvC5dTpNNMGpyY
bcpLb6b9eg2Prg077yI/Qhpcm4HlXlNLSnmbFTUsL/fVgI+GeB6c7Ll5e/zc9jce/mxN1NPCa+qk
WgpBBLTBY4zGLczrqO+x3Ow22wisQSqy1vh6do4YTHPqRAZWsRdhfYbA7b7nByviHXsQkmUcFwSk
RtSRtfVqiqHuvv1w7yqk4UpEjjg+FVF22dv63wotPKlNFrjphJHVc1mBjDBL6tC72I6jf2xBVmUZ
3JxUKul5C5eKtKpoF2V4DEyEKL73IB+t/bBotfEHHQs5PCRR1M1KpuD/AJzAH9cEkh4WlldvjYOn
yrVOAPp5sIVvxNEtVSMIIZWnDrrsOVHYbLc9du/rgairdqquaEUoSSMLFGxXTe9yzb/NufbbDUfc
f0DH/gyW3NqYZCBa7TyEffz4Xgm4LUuNdHpYWOosO3T5sN1rXilgYz07xpCY2F1u7Wtdhq6bDp64
6CskWSm88DaZSzsCgbTe4VPN7kfbCafcK9h/GnBaRkRmhSM9QgaxP2OOB4Fc62fLdbABjGCdQ7A7
4rGb8N8Sy8TU1TBVxU1LTzPLUU99AljaEqoVR1NwD1GJ2WHMsskhSsqaaCQNrKOUS6mxsm+x2Iv7
/XC0+4+eg9hi8PEBJjyrr0EQ/pfCix+HdS1xT5SCq7fggH8hiKNbUpA4auy1ZS/4QZ106bWuwvu2
9/t9MKyZidcxFdRjUwIJlXWdwbMe67Wt7+2FXZkvoP434Bo3sIMrG29oLn8sKy5xwY6IkXwaMOg+
GJv7e+Ils0XmTas2pV1RlSVdbqbEDR/KLm9vb3wEr1+YUsNXSVtHIsDFZVUroIupAA7NYdR6+2Fp
vqS46D6qzjhAhIngo3Z9vNl5IIB7C2+4H5YWkz3g+xHw0LE2BIy3r+mKNwXw3n3Ds4Nbma1AiglL
zB7ghpXYKpO4KhgLjpb3xM0tTPDHl5fPqQvTXDHT5WXYXK23aw6++JaEutiTveicm4p4QpzdaGmu
Nj/7N3H/ANOAm4m4XnW0mVIwAvZssJFv/R0xXaqqkNJNCmfwK7T8+JiSeWbk2Y28w3tv6YBs1Qtm
GvPVCVUXLKk76rABgbeUWHyjbe2DT7j+hZKLiPhyBgKfKpBzDdVTLbD7eTphAcT5OtWohy2Q80iU
oct1eTcbWX1B39jiPQz1y09amdUzpHAadzt+KSd7LbaxNvU2xD8O8MvwxQ1QnzmOWKLK46RqiRiv
O06gWsbnYsNxvcgYaiu4m/YtVZxRlFZTctKCqhSUjS8OXWJt2Hl/7vgDxHk8hYjKakFG0syZaose
lidOxxWaTNqamfLGm4gWSWi1AsqMOYhI8trf6QLnfrhvDX5fFSJAc9B0VHPjIDEx7HbpvuxO/tia
gg3LovFWVwFlfKa7VYMWeg1ED/09MJS8a5cAf/Z1SNe4LZcBt+WKnU5xQTHMtOdKqVRVlQK3kYWs
3T2Gw2wvBA2aRT1SZtHIs0Hw8g1gcwgadWkjy7ntvth6dgLDScXZXLIUTLamVtOv8OhQnT69Om2F
JeNaEFEjyrMpEbZFjoUAJ9jbFL4Y4RfhEV0k+bQvTjL0pnqJZSnN3IuF36E9t77Yf02b0UNRl8p4
gAekQpqsd1P8IFrdBa5ucNxXCZGLbW5Z4uM6NAT+5czUIbE/DqNJ99tjhc8XLKGT905tcLqYCFVI
X19himpmmXLRGm/fy2NT8Qtr/hm5O3c7nvtth2+cZUWzQHO/LmCaZF3IboNTEd7DoLdcR0kty0Di
0SFAmTZjd/kuieb9cFbjK0scMeVVrSyKzqsbISVBsT16X2viIpJ469462gzuIijp2pX1sVd9VybC
3QXHvt1xD5Vw3FwVzK+pztGgpsvNHz5dQaUM5LDTe1gWUnvfTvhaERtlrHGMrqgTJ60K5Om7L5j1
9d/tgV4xq4w7DKapbNpP4i9f7+2KqvEWUUv7t/8AalQ3wAYRsikMAbeUb7Cwtvc7nCS8TZS1JJAM
wlSIzCcfhmytcm4363P6dMS0gWZuNMzWSRv3PUKE3YmoUaQdxq32wf8A4uzd5EQZPMsjrqBacbj1
63tip13E+T1nx5NfP/ixaQCMkMAABq33Nh+uJiB6N6WhzCDOS8sFMUjDAltJHQ+nbb0GDTXQAcz8
RayBoIWoVkln1FEjq9zpNievY4gaE02fZxU5nxXSVAhhfRl1FUxGaLdfO42sxv0xC8dR0eTZlk2b
VEMWY0uXTRyPCiAOUDfiG17G+pb+txi35xVZflOeScT51m1NDltJE0dHSyxFYqVpSoDO1+uwAsNr
4mlSvqVN22n0HUdTw5BUrGmVIspXUI48tAJHY/LfCi5tw0IHmOVKYQQpf4AaQTtbp64pmRZfDnlF
mGZ5VxdQ11XWSxw/vCON2jp0jQgRoL7kayxJPU4d1uSQZccniizukXLMpEbRUZVy08iIyq0jfVi1
gOvfEXGuWSW6uiyPmHDUp5P7oBkcXEf7suxB72tiNkm4U5DP+5YeWDp1jLdgfS+nriMybLZVjzGa
HiagizKuMaGo5L2giRCqogvufMTcnr2w4qeGoEfL4Ys4po8ryxE+HpNDsZZUjKq8jexYtYDr3wl8
wr2HqS8MGdETJI0kYaggyvzEdiBp6YKarhUxGb91KYg1tf7u8urp109cUVc1o8jr5spm4zoIM/q5
IVad45DIiiMrFHGv/wA5O53J6bYsEPCcP7xoJBnUXwOWxolLRaHKcxEKrI57kEs1gOpxJquWQTvh
E2a/IGl5aZO7MV1BVy0aiPppvbDdcy4fEJlXJzy9QUyfAi1ybWvbrfbEMeD6iOkqETiW1ZUSRmWs
WB7rGilURRfoNTHc9ThaPhjkTUds2hjocvjVaSlELmzqpVZHP8RBYtYdziNR/wCw6f8A1JhanIo6
hQMjYTkagvwC6tPra3TCaZnw2YDL+6dcYIVnFCunVewHT1xRs14bochyqqq6/izkRLpaoq2gfUqA
aEVR7azub7nCmUS5TxHHBWZPxDC+WURSKkpkgcIsiJpUsTuxGot9Tiena7ZG96rclfGLifxEoIMs
m4XnzDUUmNQKWnEoYgjTcEdeuNJyrNuIKjLqOSeomWoeCNpAVt5igLbW23vthpDxpBE+k1c7D0th
Y8aU52+Kmv6Wvil5E4pUtixY5KTlb3HwzHiAG4nnt3UDb+mDwZtxFzbtUysL33W/+2I9eOlU2Wqm
Fx/LhVON4ytnqagjr0xDUi1RYPFVfxG/C+cvRVVUlatFK9P8OLPzQLrYW3N+2KF4J8S+JNblXEKZ
5X5gmZJNGKBs0gKAjlkk2ABK6rXtjQG40gFrVUxAFx1wVeNYXvqq5QV6bHE1kSi40vmReKTkpWyp
+ElXmuay5subxR0ddBXzRVEVNAER3UA8wX3Nw25J7D1xpWZCtyOhT4avqrPaNVLWCLYnb87e+M58
HpTm+bcW1KyJobPKshpCd7LGMbTHl0dVVU3NVZFhtIAD5WawC/rv9sV5ZVPjYMa9O5Tst8NlkpzN
mFdU0i2uFWTzW9/TCFbknDtPdEzDOg4Fw6SagPta/wCWJLiDNZs3zdaCCT8ESFNfTWRckn2Fj9sR
GY1OX8MCtoaytpo555I51WWQ6rkAb7WTYA29Dc23xHW+pOiMmyGJofiKTMaiup9WnmRz7qf5SLXB
9iAcSPBldmdVTmnzfMpKyel1QGR1F3ChCrX/ANSst/cHDLOcvqMoQZpSqWkERdozt8TCL6o2HqLH
Sf4WAtte8jw1RQ1VbNUrMxjnu4sNraIhcfXr98Sk2okUtx9xRFULT/Dy5lPPSyFdCh9JTSBb2PX0
wjReG96QVeYZhV0sNtQj5t3I9em2LfS5LDJnkM72mjp49SI+41kgLf2ABP2xV89z2bibO1o4ptFN
drN6qu5c/p+YxCE2ybVEFmuU8OwsyrXZzqA+cXcD3IAv+mIGoyCKeDm0tfNV07hlSeKe9j37bEeh
xNV8+X5O9TlclTC1Z8TqVNd5PMOhNrA/6b9friGzWnl4flOZRgrGdPxSr8ssRt57fzLcEHrYEHGi
MtXBU1Q+4KirsyppEr8ylqpUvEZGUFrqTGT9DYNb1Jw74pyySOWnpqirqat+sSh2Vl7Wt3vjuF4T
DW1YYWEjSOABf+PFxo8vjkzWbMp90pIwkTMPlc3LN9QOn1xU8i1WNR2KrD4bUlBCtRm9XVqtrtTQ
1Dal9ib9fbEVmNLwqdaxU2bRhduYs7SW+qhr/piQrq+q4ozfkrJy4hdlUb2UH+puMQS1WUU8aZXB
WJNPFPKFCXNgTqIDfxG9/wAsWamuWKuwyreGaKtpX+FqGqKSdWRKiOZrjax77MPQ7jFg4IihlyyB
ax2lqI4gJCGsGIZ0Jt06KOlsQddE+S1iVCHTDPIkNWnZgxCpL/zKSu/dSQe2LnwVlgWGZ5Yl1FSd
x0/FlviU5OhJb7la4nyeGtz1IOVJNIyqscZYhgbdNuvTD08C5LlcKmu11FQd2ihkYKvte+LAaFMt
rs1zSoADIEhiHp5QSR9SQPtis08rZvWTmeXQkah23ta97fTZWN/bENba5J0hCTLeGpLgZdUwIDpM
sUrPb6gNf9MR2acIURpmMREtNOhEc8cjd9r9eowrQ5jls6QUlHVCZ40IAVCvlBNrX6jvhaOZqOqS
EkfD1kgikj/llPyOPQkjSfW49MPU+UxV3JzheBavJxLUVkzzPEJNpPlLKQbC224P6Yi+Kciokjg5
wlqJRLJEC0hDaEVbC47XJxbeGKCkTIoyKdTanW5f5ur4JmlBTGrFRNGDTUjTS2vt0Wwt36YhrakS
0oqeWeH2UCnWszszUsDi8cS1Ehkk+19sOmyXgFjyv3ZWox6P8TJc/wD14RlqJ83rhLUtaSUkhb7I
oHQfTb88RFNmGT12bJRx1IaeORyBptZmABIPqfpvibyNcsFG+g9zfw+yunhNZlgaro/4w0r64/qL
9MPOHuGqaShiSnp2iAlkZ1SQjVbTa56nqcEyzMpKOqd13EUhimj7MB1/QgjFmymFcsllhRQsWpzG
b3upCkf2+2ISyS4JKKKb4i8Nmnpfhy8qieRIWKyk+WQtr79wv/dhhOmyvL6emjnzEhInOmONYw0k
pt0Ud/r+eLZxzAK6emiLbippyT6C0v8AfFApKo51O1e19EpKQJ/8OEHyKPqBqPqTi2Mm1RCqexMf
vrh3L4lEvD1KsOtY+bUMC2pjZb2FgSdhviSfhXJc8h5mW08VLVgXMDqpU+1+2KPUcU5JLXLl9ZrJ
SdXDKgaNSt7X7mx7/lidlrf3dnTw00nnjjSdDe9gSRY+u6/cEYjqbexYlXIvklFSUU1Q00Qjan35
dtIRgfNdel+n5e+IPjWioswqqSARB4ZJ40kTfdVR5bddwWVT9sX2DkVFWtc0SBaqEF9W/nUgfqD/
APTit8W0dPNmdNIFWOOKVHlZR/DyZQ36YI5HqIziqGJXLqVYnrYVkmmBeKkgjXmOO7G4sq+5xJDP
sto4IZJ8gy6np5JBTqzWYlyNlvp64qmSc/MInzOdfxqoCokF/lT+BPZVWw/M4Tg40ybMcwo6CsQn
TKTDKSOWTawYjsN/r0OLJOtmJbqy/nh/LM5gMlFDFFP/APD0rpPt7YjstoqSBKgSxEGNvlTyWIO9
7d7j9MMMuzI0Gf11PE1zTFCd9iGFyp9xYj8ji6UlElXXyyqgaOaMO+/8Q2P5i35YqlJxLEk0Z5xh
ltNmVfSUsiho5pVV08xuqrzLbnoWA/IYkZZMqonjWqgFVUyjVHR08a62X+Yk7KvucP8AjCnShzFK
6WMLHTAyNv0HJa/6DFf4WopJqSWuq7NVVCfE1Lk2tfdUv2VQQLfU4uUrimymvU0iz02Z5fTx08tT
w9Q01PM/JjY+fU9vlvpAJ/tidl4ZyrO6QT5ZTxQzKPNFpFif9sUHKON8oz3NsryyoWRSsjPASQE8
w0htPa9+vUbe+LNQZiuT8R1tPC5tSOgcA3BVhfST6jf9MVuT6FiVcj3KMlohDLzqYGaFz5TcAWG4
Kj3H6Yq3HWT0lXm2WwPBqjknTWh6MFV5N7+rqh39Ma5S0iPmNROmm08YZm76hcfqCMU7jmOny/MF
r5V5i0SNUGMD5rQyHT97W++Iwm7sU4qiCkrKWjqeS8Brq1lEnw6nQsano0jfwg9hux62tiUHE9Tl
9JSzTZZQw0tTKYIisWzOBcjc36A72xB8M5XKuXS1dc+qcqaqrmbq8rWLn7dAOwUAYjOGvEWgz3iK
hy6qprU6SMIJHckgt5VLDoe9wOl/bE269wSbNC+By3iSkaSKJKSqA3Mfy37ah6e+Iyigggo6oT0y
u0TsCrDdSBuMIUlYuW8SVCQh/hI3VAWGzKwGpfexJF8WyjpoJqqtF1lDp5h1BK3W/wBxb8sVttEt
jFfFvKqXiV8opnmWignzGmp5XKajpYGy7b2LWv8A9MWDjPwxpuIuBJuF4c2ioYXWFFlaN5SojcN0
PUm3riF/aKkXKMty6pp0COmaUTgDb+I4etxlUSSH8CNbG9xffF7yShGMl0KI4lklONDjw78O14H4
c/dMeZxVcfPeo57RNHbUALad/wCXriXreHKaQ65quLUBc6Q2K8eMKntFGe3Q4a1PE9ZIDpVFHfSD
v+uKXkcpam9zTHC4RUUtkWeLhuiRkCZjEpv/ACE4dSZZThihr4lGm+rQ2KOvENZtq0k+4P8AfDiH
iesQAKsNrddJxFv3H5ciMzXwQoc144/4kbiROdqidKZab/4agfNe+9vTGiUuQw00dv3lCwO/ynFR
/wCLK0MfLDf6HHScUV/LU2jve1wv/XEp5ZTpN8FcPD+XbiuS6NltOCB8fFc/6GwyenpeZY1qBrka
QhxUZOKK8LbyX9Qv/XCf/ElcTY6PXdcVlnlyJPjTgeg4xyGoy2TNzTCoVVZ44dRSzBuhPtbEbwl4
cZfwbl/wUecPWK8xkMkkOkja1tjhP/iCtVjZl3HUrhOTiSvC7SJb2XFqyT06E9iryPVrrcsKU8uq
xjf2Ok4cRQNGblWAA6kEYdPn0UUmn97Tal2IFMv9b4DLswFbW5ghrJqqmWmMycyHSrEDzJcHY4zv
G6uy3zrdUIIVZ77/AHw4hFrEbknDeicVEYsQGt64i+IZswyCpjzCGpaopCUSehEKyFV3u6HYg7i4
3xWoapabL5S0x1UWBqKQuWCOQd9lO2CNQys1kilJ9kP9sWqJEnpKdznj06TxJKBLGikAi4tfEbxD
mT5Tlzz0WbNmdRCQzU0IiLul/Nb1IFzYemH5durKfPaXBA/s+oFPEgkUlv35Wgof/k64356cNAHD
mIhkClTbYAH1xhvgVmiVlRxNUSqNTZxU3KoN/JFuQO5742+opYs1oZ6WdRJTzry3Rr2YMm4/I4uz
bSZmx+qJRqHLKeszMTtI0K0kzPGSSGLaSB9R5t8UfNeDc4zniivaSjdErndmnd1aEqR8x3uGFyLd
xbE74dScmbPKPMZaiqostRpIpPjnZ0hFiNZPm8q3G979cLL4peHo+fPwC1tANbICfzGDS9W25JTr
d7E9xbl0k+VTU2T1QQ08OilmlHMsdI6qTci46ehOE+EmSrhpHpaaOmjNMn4URJCkpESN/S9h9BiF
puIqDOYc3noa743LlRJKeSKqMljcKytff5rn0sR3xJeH9LMY0CS6FFLEbdbkxQ4i7UWmgW7RoNdS
8qB35rxbG+g2JGk/3OKFw/kULVSZiZBHJTCQQqz2LNt29Nh1/wBsW/ijLI824dzWhrQZoHhlikGo
qSNF9iLEfUbjGc8HVeX5XwPXVOezyVAyqeSKetlq2YRRa/wyx+a+llBvc3H3xGPwuht0yq0HAmZZ
nxNVRVkckEUlUZZqiSRTHo1X1Kb3uR27HF38SafTlVXJQ1MDRRx2RJBrEkYN2Rh13W63++IseKPh
wikx5pTu25Gmpl+/bDCqraHN+G85rIalZqVnY0pinZlETRkgEHvcH/bF6jJNNqiEpqfDs0Dh1I3q
51giWnREsqnf+K/++H3FMIGTVMqzPCCbMFawO1sMsgDTVlSsWzjr9Lj+2HPiPkcOacFZjSVSnkyA
P5WKkEMCCCDcbjEHVoa4KVQ5TeGasW8dUImigW5U3PW+KJwZ4eZqnEkMma0ppMup6kTSSNKGVrG9
ksb+aw+mLvwnxFS5fwRTVedEVVRDKtLJVvJI5aQkgABASSbel8Hj454flq2jFLLI4USlPhatjoJ0
hrcv5Sdr9L7YtUZb9SKml1I3j+kcQSVMMicpZEflumpXRWBKMPQjv12xdcgnHxNaqpYBioCnYASO
MZ1xLXoMjq9VrfEMojUMulGsyAhgCLA9DvtjQciEZrK3mNoAeSxva55smIyvTTBcgcdUyrlutXZd
UvmF9ibbD/bFfhyCOoyCvKyCKuqoeWmq6lBvsfzxNeKeW0uacJVFLWJrTnq4FyCrXNmBG4IOKTlf
HWQ8N8FZRWcSMrvLanNS2o3kVd+g72viKTcdht6XuR/h/wAB1mW57BPmka0lPTMSVWUPqNj8ttwL
m++JbNMteizfK5FcCP4yMsjLdXUuFtv/AMwYfQYajxz8NokJargkvuSFkBt/6cJVdTG+aZfG7Gcw
1qRKWBsPx1sQD/pK4nU9VyVC1qfDs1PLJ4hTToqhVEekADbYuP8AbEXxVFGMvr5FBVVjm1G4AHy2
J3Hrf8sOKCBSJbliChIt0+eTBeIIUqckzGF1EilJwQ24YXXriq3e/BZVlcyiipK2FpqgAgoUjHU3
I2b/AHxnGUcAZlR8W82panSmEvNNQst+YL9ltcHpicyHOsm4My/NJs/EcmWUMmiO8bPoEj+QdN7d
MEqPHPwwZLhqcN02pG3/AExbplb0pv6EPMUeWkWHOoqXLquSSGZIqSdrLdgNDHtv6n+uLLTKiAsD
rNtSgfw3VTYe1zjK89qcs4kzfKpqKKL9zS0or4oeUQHJUhSQem++NMhkaJywH/ltcfVFxCfpSTJx
3F8yqv8A2rGHVTG5RSTvc6ZSP6YoHhyIp6CCrqJedGpLkNbqxuQPQC+kD0xdsxiM2YUgQNdpIzZt
v4Zf74ybhOrpsloI6ypRmpIFSqqFWLUCscTswP10jFkKcXRGTadjnPuAZKniqWpoKikNFLKZbO+l
4QTexHcDe1sWzOqfLkoYKinlU1NNEEl8wUOo3Jv7evoMVM/tGcFOAVy+RS5Gkrl4ubi4HzYNxZxh
lHiB4evUZVRPTxTVApGmFNof5kLEgE7WJF8WaJ7ak104IedGV6WmaLwjDQ5hkFLUQtHUQOpZJY31
Bt7dRhvxA6ZVW1UkKrvTk2cXW6wTMNvqowPCsyUHCmXw0lPHFEEIWNFAVRe9gBhhxA0lRUz6wADA
48v/APLz4otObRc/hRAeG0lJl+T0U9RUfEBUBcTm5c9bHta56egGKxXeHAl4iFTS5hTHLxJzF1XE
ii5IQjobevtgsGerwrkNFnDCRqekiNVIqRhlNogLNc231fphAftN00elWyqUsSw3p4+qi5/i7Df6
Y2LHkk24IzvLCCUZOjQMz+CjVK2FghSNVqCSArAD57+uLfwzX0ddk0FZROjwyRaklT5WBGMyz/iV
+OeAMuq/hDTw5hOoKpCquirKCb2NiCB+uNLyeONcqo1SJUjKKAibKAV6C3TGXInBe9l8Hq+RBcZ5
lJRQ5m9ka1HIwDIGGpYJCNj9MNPD85flXDtH8VO1WxQJKaggs23c+9z9rYDjyPWa5VBX/AzXH/8A
TTf2xXTxBT8I5PledZhFUTUtGjTSR08anmE6UUMWIFrydOvTE0tcVFEG9Lcuwyg8OxTcWxVtLmdM
KKIhhzFOvTe4B3t2HTGi5s+XRwfGcyKJYYwZ55HVVKqD5ifX++KPJ+0rk0B24brEBEjXaGIbIbOf
m/hOx9MS/Hte3F/CvCzGiaigzCpE8sBhXmKkbE6ZOoFyov122xKUJ6lrVEY5IyT0OzTuGK+jrctS
uomEkFREJInAsGDC4t7emKx4kVNVBRZm8b/DSpQyyB0NyGWGQjt2IxbqMqmWU7KLakQG21vLil8e
apKXNgSSf3bUHc//ALNP/bGeErkXzVRB4MzCh4fyShoIbziNAjCdizOdO5JO52vf64plL4Z5fQcQ
R5hT11XyY5DJHTGG+k72Gq24H+ww6zriuTgrKcgzePL5a9ojyYUSdYlMsriNQxIN9mNh03B9MQDf
tO5rLPSiPh9VaohiqIr5glnSSTlIwsnd/L7Y0Qx5JpuCu/kZ55YY3UnRfuKeI8vymn+PrCKaOGwJ
ZHYvYbKotck26d8XXh+qhqcrSuWB4BOgcRyIVcBl1AEdjv0xmPiBPXZ+/B1TWxzRrYVtRFHL5I5R
cqrEDzWYdBa9j2xqCSGWCoRCQ17Ak9yuM8vSlRfG23fBiH7SEM2aZdl9LCo5k2aUKC7WHzN37dMP
Dw/SIWVs3pwelrf9cMP2hImpcly13YMwzWgNwennbETPx3/wrm8uXtl1dX1lVNzgRDE1g2oIi6jf
5YyfzxrUPMhFLfn+DMsvlTk7q6/ksqcP5fqKnO6VWtexHT9cQWcPSZZWxU8lbBeV9EQWQapD7KCT
h7wdx/U8ZZlRxUOS1cdLUMFFbPTxclbgkXIPU6TtiBqt+LMwr6iL8csIk/CCBVXuvfck798UyxqF
qXJrx5pZK0vYlANDC6ar+p3w6Wlh+HWeqlFBG5OguhOsDqRv0BwxSo1PqIIv72wpm2YCl4UrKoRy
Msc0ZfkgGYooLWUnZR6nFMVqaRpyycYuSH4osrkG2d0o1bb2B/rhOupaCkpiUzSCRh/CCBt+eKzH
4vVs0sSpkFZK05lESjlEsYyOYB/y3F8SnFgzTPeD6d6qnly3nTtHNT6FM0QGxuRsNj+uL3gcWtex
gj4lzvQ7C0dbQ5qrtSSrUpCxRnja4DDtfp+WHfwzTPGkcWp3IFgN8MKCo+HpUp44lESgAANbbElT
VLNVRho7BmCmzYyy2ex0V8O/Iaeiy+ku01eE6eQqLi/sCcFp6bKqpNf7yVVG2623+hwhmmc8Q0/E
WbtQZTVZiiappHSoSGMIisdkIJsFUm/fCOWZ5xZWSUclTlM9Fl9Q0dqg1iPYSIXTygX3CnGryJOO
rp80c3+5erTf6ETX8M5K1VzWosvaU10IcmpIJDOwcMvYHv6dcXHwvySjpuG+IqiliSBobqOTKXUh
ksQT37YYVEcw0sfjNLV1KwtDER8zWs3X6X69Di2eHtO0fDHFKuJVOtQRKio3yjsNsdPxT/A/I5nh
684jcun5a2K39MLNAmZTxQVCmSGV1Ur3FyPywSOmEQuoII9cOaB1+Opyb35i7D/mGOD1tHpehJ+K
nCeR5hmeTx5jRUVUlNl0SRCrmMRtztJsR126/njNOBeEMj/enCrCgoudPVPDI6TlpCp5o8y29Lb+
wONs8QVqZK+lNOlST8HDq+Hjjk//ACg2uG/S33xlmRTVuX0vCNZT0dVWus8kqQMsUSSEc82D9voe
h29Md3Db8N9H/J53Kl51/L+C4+DUEWRZ7xpQxpIyQcQVkSajclQsVt++N0p21JE1jfUpI/8Alxi/
gbSLxvw5U8SzLHl0ubVMtdLFCpazu7K1yfeMW9sa/QZVNQSLeuFQmhJCpSx3uP7Y4mdNzdvg6GJ+
lUUvhemVcm4jlKlnejqEJGxKiIm2LjX5NMMo8LwXrnnXO6AK02UgkKaGQrsLatrbffFZ4bRJMhz7
pb4apvq6f5JxI8f5ktBT+HHwZoYpFlop1kOcSlNQomFz/KB3PXcDGXPbkq+9iTFfESglbJA84qBM
tFTJ/iIBC+kljaw6rtcE7nviv8B0tTPHBJFKqRmkiBG9z+FDh5xNxNVZvwJVVlFTQmtp6eCAxTVb
SRySIHuTJYkA9tvTEb4OUsPEHA2W5pPLJDLVUsMoCksEBjUhL97dL9wBi/FBvFuDlTRfc1DxZXXc
xtbPFMwI/wCTGa1VAKzw0zinVH1VVTCjCJAWe9REuwOxNtt8aHW5XLQ0OYhq1apBA53UggtHfrin
UsIfgedHKHXWU6nmMVW3xMXUjcD3wobbe5OW6si+Ef2YsjyzjLLYs7y7M6pa7LM1rGpPh10o0M0a
xlRfoNRv03t64k/GjhXLOD8uzjKspoZMvy+nmaOOndNLIvKvYgE23Yn74uOb8GRx+ImXLUZ7kcay
ZTm7IVzOZo4yKhBouSCCb7DobH0xUvH6lqclybiBKKWirpqaaQqwmeSCRRCDs+7Hb9cShOc8kdT+
7MkEldDvh2tjp8yrY7Mx7+nzYmeLZGk4arQxJupA+lxir+G1AvEHCtPmVZUO1TUxRzlogNg0avY3
62va+JviHL5cpy+uh+KNRAYlYFlsQTa+JSTUt2aIu0MuAI2hzPgloI5Ob/xDRvaBFLkh3NwDsT9c
bM01f/4rzySHM3Z+FqCORWhiD2GYset7C19sYpw9Eah+GY1mihP73pisk0pjUHU1rsNxjQIuD1q/
ESeOpzfKAxyKkcSPXykEGsYEXuLkd/TFeW3ddv5M2RLWmzI/HuFWr8zcLKXfMakMZba2IcAarbXx
NZbSc6rqdRSPQ8hIZrf+dJireNS1FBktctDNTTSQVdTokbU8bWkG4PU9Nr4s/BuVLmmTJW1sxknm
CylgvTWiuR9ixxoq8astTqQr4lxIMkdwLEuik/fGY8eJy+BqCVFLOlNVOAkQk3FP1IPQe/UY0fjn
LZMtyeqi+MNTAJItIdbENsSf1/TGb+JLCDgPLWJTeCqRS7lNzTHpbqdth3xd4ZVkivcjm3xyPHOW
FI4qJhy7COb1N/8AEIPv/fHtTiKBY6vhqRQFZzTu5Hc89Rc/ljxbGskNDTOUl8sMxN0AP/vC9fTb
9MezuPnqIstyeSleOOoSCNkeRdQBEoI/W2Ot/UPigvn/AAcr+n7Kf0NGyvMNNNLGCDdCp9vPJhPi
FwaGtsbgiaxB7WXD3gjh+kq+H+bVE1E7hX1kW+ZFex+hYjEPnFGaSCvghk/w0cR8rbm5UFjf/b2x
56SR3EzNPEKISeG2YkKdTSAkqoYkA36H748TIVFHCwMP+bLv5rf5YOPb3HkKy+HVXHdLmU/NcC/2
/wC748TtHUrl8do59XNlJ3F94xj0/wDTf8cvn/B57+pL8RfL+T2hlqLNwXw5OVvKYbFioDW0k2Nu
n0xoDTCCLW17GC1un/lrjOeGJWbw+4YItb4deh2/y8aClM1fxFHzpiaUQQssWkaS11BHvcH9Bjz2
ZapO+7PQY21BMey5nDW5nR6SA+qI7H0Ev98ZLSpfw2z4MPnyyTr/APunxrPiJR02WZPJVUAWCqhi
LRuBfS2tBe3ewYm3rjJqMP8A+HOcKZNZXLpAbCw/y5MTxqlfyIzfK9jyZR8j4WJh8KR/hSdKvb+L
r/t749GeD8af+DQ0hCrVMhtGDpHmi6X3GPPdLJKtLGp591anG8q+9/8Avvj0V4M/jeESli11qpNW
sgn5oupHXHofH/4/qv2OB/T/APJ9P5NZyOrFFkNErW6bC9u+Es5qBUVUrhdIMTDSD1/AmG354UyX
h2LOIcuaWsnSFBYQxtZSQx3+4OEPFbKYcoyCpqcueSCaKDSju+qxZ1TVY9wGOPOxinLndnoZtpey
M3z2AN4C8Qki7fBDcrf/AMsdsYDAkT1VKCsJU1jAjSwBvTr+XsfTY43/AD8OvgHnzPNzXWisWFkv
+H+mMEpWb4uju0h/xzD/ADAT/wC7r27/APL98d7wXwz+f8I4vjP8kPkv3PS/DFLGvhTk0cShEW4R
VOoABxsMaNRT/D5DSi4U8tVGo2t5TjO+EWB8Lsqa7Agkm4sd5Fxp2R5LT1dLSTzSSNeNCIwdrj+/
fHCzbyafdncx7QVdkVLiapWq+NtIrXoptwf/ANmnxS/Egaf2f8wLFTcxElkLC2qLt3xffHqGGg4I
rKqgp0oamKmk0Oo3BLIl/fZ229bHtihcdxyR/s6Zgss5qZljiJlForm8fpsuL8MdLg/dGbK7jkXs
zFM5WPlb8kjRnS25bOP8wX2/r/Pj1XUJ/wDiPlAUg2bs2q3nl798eVc7dgh8z9c6uecE21X6/wC3
8GPVcp1cF5WACLvc+TSb8yTt2xu8d8MPmzJ4D4pfQuEkiwZdTa2NwIyovb+DFR40qOZR5qxIGrLq
i3Yf+7Tj+pA++LumT09V8JPMXb8JfJq2BCrbbFG/aMkjy7w4zOaiX4WpWkmdHjYkhgUF/rZmt9b9
hjiYopzVHVyyai32Kj4jA/8AhTkzE3C5tSk7X250V7+2MZykN+8uHVIKn93UqsTCButfbcdjbsNt
PvjYOPaV6HwcyWKWaaol/edHeWo2kY8+LfYAX9NrdMY/kbA5rwyT/wDw+nC6WuQP3l/DfqNXrvq9
sd3wi/Cfzf7HH8U/xV8kelM+0Pw3kRQqY9CaSnykWfpfttixZnmRy+Aa5tGqS4v38u362xBZ6hm4
fyMBHY8tLi1z8r9bYs2b5bRSU9PJNAJpJAVbWSRsqkXHTtjhySdJnZV1sYV4+Vslfw1C6gyMlbRy
MAu5CuQTt6XGGXiasbeM0Dfh7tTEXYpbyVH8Q6bd+33xbP2hs2movDnMZ6VVpaiKMqslOukqSyqW
B/5SR7XxktNHPTZ9wnJPW1VdLNTUMjSVBV2F1nAULbcDoAbk+u2Op4aOya9/4OT4iXrp+38ms+Dl
PTw5RlMUSwRxLVwaVirSVuYpSbRHqfU9vviP4ohLcQVZCta67j/lGJjwqhZ8iyaRhMf8XTXL0IA2
jkt+MP0HfDLieMNnUzMxB0p0H+kYxeI/ytnU8J8KX30IQKFIBVh7EdcPqiPmeHXFB0EHkg2YYaSK
YzcMWJ2Fjvh/V7eHXFQbYimuSWxTD44/NGrP/jl8ii8L08BqMtdhTeV8xI1VDRkbpax/h9j/ABY1
biNU/wCEKxozEyfEy25UplUecfxndvqcZlwe8heiC/EG7ZiLRwLJvqjvseva/ptbGoZ9IRwlmAcS
BviZSebGEf5l6qNh9MdDxnK+ZyPCff6GeQ+Ubod+5GHVP/7xF8xGsdtuuEBOLAs5v2GF4KlDUxnz
sdQ6nbrjns7PQe8e5nRUXEmZrVT5bE81KVX4yZkY3jceUA77+ve2GHCeZ5ZMuR00E+SS1h+G8kEr
tUbRSBhYm1xcX97Yg/Fnh+kz/wASqWKoM5DiKK0AGqxV22v3uv5Xww8HeEoabP6HNCs5qAqnYDlX
cSAm97/wiw+uOwkl4W/Y83ql/cVXUv1TTpK8AFNAwNRAztyJgwUFtRI6EdL/AGti4eHUYg4c4kiM
awtNL+EiK4DAKPl1bnpiHosk4nAKBqoE7f5o/LriXoMl4gy0ieV6mNUNy3Nvb9cY82bzMeg2Y8Gi
eqw0dHOyleVKV7+Q/wBsJpA9LV07SKYV5qjUwIF7j1xZaXNcyHlNZNci48218I5n+8swhkpnmkdJ
RpKsfm3/AL45sWk9zqXKh3x4YK7MKKUCllhWjhXXUxyMgPNJNmTpta9+xxmPBcQml4civl0M9CGe
ZJJ+VOdQkW1nIBsWHvbFtl4V4oemalM04piCphaoUqR6WvvjN8x/ZbWumWejeoyqrRzIkqzLIgbq
Ni21j6HHUxZ4Rx+VJ0cvLhnq1x3+ptPgvk2Z+H3BFFlFdDT1EyKbtTVsRU6pJHFrkXuGH5HGi0nF
MEMpNSsSppQAfFQk2B3v58Yn+zRlkeaZJXUeb5dQ5nLTDlOI3EpRw7G9h0DWDWv1F7C5xsvFPD3D
lXl0dTBkhra8RLJLHqOo61CvsWGxsNr/AK4y5IRc3ZZib0KhtNmOUw5dmMOWRQ06VEE0Y1VUVtTI
VBN3OwJ39MMuKeKquszzg+KmlhbL8sankqUnjpldZUpeSdC67MLlupFxY4quV5nlhkL0HC1crRWB
YRDY6dO+qXe67H1HW+FFNNFICvCdbYaAC0aEjR8hH43UXIB9Num2E8UG90N2+paqfPslzbK2oJAk
kPw0UHnlghuwVgCQr26kb98RfhpldVwnwvluSzGkeeGlhg1R1qFbiMAafW9iR64hK6qyzL6JpZ+D
qtYIlK+SlQ6VJ1kWEt7Ai49D0tiW8MTwdxDS1smW5XBX0zQxSfCiEloGdTJYbnysCjhQTZtXTC8u
MYUuB27ReUz2ljaSOtSlaJxpZfjofMunTv5vXEFmlZRxQinoTS0sIqYJwRVwnSI50dzYsd7L0O1+
uHvG+UZIqvW0XD3xKxx8yojcKZCzIAdncXuo3F+w74plPU0+cj4xODp52d9WuWKDUWC6L7zXvp23
6jrfEY44cknJ8F9rPEjKKvjOPNam1PHBl+Y04jiNGzc2aZJEI2AICgk33G1tsRXGPEORcevnpiqq
SaCuDmBqmohiYFogillQ2G4PTrivQQRUfLePg6op2QppeFYVK6PkIPOuCASL+ht0xF51UZNkFBLW
V3BlTHTBX1OkFO1l+dvKJCbXGrbv0xNYsaa0rcrScd7J7w4pqrhbhrLspaqyypljp4Y9cNahViFC
Aj2JXbFpqczo6gyJmElBo0nXE1Wg8o2ub26HFf4Ffg/MqrNVyLKEqaJIIp2pjFvTuy63A9m8jWHQ
g7XxPcZplseWS5pR5E9W0CK86yaTIutbNs5A3Frj0xCUYuW5OLaWxC0mcZblmd5RKZaWno6LM4Ku
RFqI3bRGSzgKbi9iNji/U/itwv8A8USZw9SFgjyamy4CGGnLc5KlpjZeltB2PU/bGTUdWubwrVwc
JM6hhZ/8MG1KukbGW/Tb6YdU0MwpOSvB55QK+VTSgArfSf8AM6i+x7Yl5eN8/uVyjr3sPxRU5Rxh
SZ7BTSUjfFSzNSNUVCqVEjXUkDv7D7YW4ckfKsopqVqmgkIihVXFYtj5QgI9QSpt+WK7n2fUXCqI
9Zwg8A0lgyfDOQNQJPlYkb2P9MWnhbMOF567OqbLsoUwoI5UpZYt4iy6m036qzDULd74m4LTxsST
pi9dX0FVHImZNRPHYOyPUgXC7X6dif1xn3iPlEHE2Ww5dR5rlWWpBJN5Zqi+leSUK2tta9z7Yu3i
PmWW5JlvxlLkM86Rvy6gEqGVnUXFn7Ha9vbFcop62vgirRwvFIswWUNPUUhf5bC9zcG22HjqDU0E
lrWlnnofsu1s2VxQDirh82jlhuJJdOpmWTb/AOUXt1+2PQdc2VZnkooXrcpepWBI46lqm4Uk3Ujb
vbbDhZc0iiCxcMxIi6SEFTSBRbpYX7YhKzif90Zhl1HXcOrFFWycgPCaaawLd1X3I2xoyZp+Ia1d
CnHhhgvT1LTw/wAWx5LQR0cVdllSTGhVhVEarIqC3l7lf1w1zHiugpp5DVz0bxuCJFWUmwAsSRp6
dB9xhLJeJsv/APblDQZaksUOnyyQqrR6kFyq+jHcWHfAcUV6U0U9dlORM1PEjSSxOI42jsoBPmG5
P1xlcI3VGi33K5xXVUXEmVS0tHVUmWanI0FzrBC3Pl0+m/0x54H7O+qlliPFOUAROHBMMml+Ytl0
/WxxvuVZ/m2dUwnpOG15N9F5J6dCbdOvbDyWbO40sOHYF6/NV0xG/XGzDnn4dOMNvqZcuCGd3Mje
C6/KOHeHMvy2qrcvzIUlKqiXzAGx0FradsWejzyknqzUx5nl8RA5fKcuNJSzHe3oMUvPOK82yExy
VGSRBWeymGaBiCB3sNsWTLc0qBQ1Px+SgzrEstPytMhQbMTsAALEXxmnFSequfc0xbS09hXiXizL
83o3gmzvLYS6aABzSTcq21x18vT3xFZ5XZJW8NS5XR5jlsck9KafXCr3bWpVWsF3vc4l8y4npK/M
jz8qWR0oiYYxGrKjswsxPYnp0/rilZDxNmnFBllospgjRGsXnrI0udxt5PbAoqrXAN702ZOPAnLo
Gs3FdGINMUgl+Aks+liu3r5tvrjVvDjLMo8PMh/dMmdUdfDFNLMzfDSKvVdQtY9CB9ziWaXiCJgP
3fRXW1h+8k29P4O2GWZZ5xFl9M8wy6ll0W/DhrwW69gI/vjVkzZMy0zdr6GbHgx4Xqgqf1LdFxjl
/Pkigq6aBYyx3hkAQruR07A4heMuIKDOqFaSszyGBZwiqUpZDq3WUDfvZRf0vg3CXEVVnORNWyUB
mqGjfQIpRLGnmG58o379cIcU8ZxQ8TmJqc1NXS0DNGlMqiNXYg3Y22J2FrfffGeMVGWy4NMncd3y
MOL84y7ivhKXhx5koY6uljpw8VI5chl8rabWuQCd+3XGZp4SZAXimi4rJiSY1e2WtezKIgL39Rse
p6Y0bhnjniHiGk+NpaGjgjexAlr2Um4//dkG3Q4mhnPERNxFlJOwI/eLbAdP/KxphlnhuMdiiWKG
VqUt/wAxtwrneWcE5TS5ecwhq46TmqWlppdwpBa4sflOLeOOKbMWY09dSwqhKORTy2QhQ1unpvio
5nxNxPl0BkShy6pHTRBmDsbfTlffFl4I4pqczy9quXKo6upeB3UQTc1E97lRZsZpxT9TRoi38Kf6
ENxtm+WcUZJJQ1/ECU8NSqRLI1DPsXZWWwYDc6OnpvgONczyXxB4PkyNczio4ZYYE50VBJJ1YKhK
EAHUV6em/TfDzivxIWPiGJXy2Wtq6GgnlEVHKuhLlBqY2uGJslrfx9bE4acI8U8T8XUK10NNl1DE
yqVaorJvMCt9tMR6Xsd8TSpKXbchtJuN8mdz+E/DVejkcS1bJGldMzU+VMQEmfSx8xsSG2Ft398a
tk/F1Bw/DT00c9RJHT8yIM+XSH5fM5Pm6C9r9L7dcSIqOJggR6/Id91/xFX29LRjETnmccXZfAkt
JV5TWsWAMMM9UpUW63awt/fEp5HlpTdhDGsW8dvv5k8OO5c0rQsPxEUm2rXl7KBdNVjduoUXI6jp
12xVfELOaLibI5KDNp8zpqapjNOrrlTLIxdhYKCdz5NXsoubXxduA+Ic8r8iirYnpsyWvpzIkkDO
0MbKSDZnJv8AUAbjFd498SarJ+JSYMvTNK3Lcsnk1q4EMIfR81+jNYAH0J67jFEYxUtlwWTfp9T5
IPjzP6HjbKKagrjmsEKPTTq1PlbtI2l10LYttqKbjrYk7Yz+PgTJYJ6WoSfPGWjiKJqy6yyIlRzN
RsdyWOgAdR09cX/hri/N86ofiKrM8nyt7KVikWscsGUG91Nu9sP34gqkO/E+Sob9oqw/740xnLEt
MV9/kUSxxyPVL7/UPDxhJl8EVLyqpBAvIAGXkhQqljuHtYA2v67dcOH4xq8ylihSKsS1nVWoNFyy
3AuXsCALn0uL7m2K9n3GecUMYejzLJa5Bu7CnqEVAO5LPi98L1NZU5RRV9MaHNJK2laaKqhRkjU2
6KC51C564olFc0XRbbqzO/EGtyzNuGp6PiGg4jhy+pQoSlJGjt5hYL5uvl1dNlFzYYxfPPELgw5z
k/wE+YlcrMMRepiDc2KLWAF0bgnWfN+Qxq/7RvENU2VNlbzSVc0WXyyzPANIpoyAC5vtYsqr1BsT
bFb4A8Nsny7IqGSSeny/MGhAnBgEkpPclwxBB67bY045xx49TT+hjnB5cuhNbcssXhzxFQ5RkGWO
4UIk0VQpaSWN9Kqw/wAo3ALahufTDysanz/MJ50r6amQaVDTuRq2tsAMFHB+WEEnPIwO5MBH++IL
Nfg8hnVPj4TA7BIpWYKZGPYLe5xim/MbfU6eOMYUlIlnyamVrnO8v1f8zG3/ANOEsympaXhrMsr/
AHhTyHMYzHz1LWjI9Ra5xElmLXCrbre+FRllNVU4lzDMI8vja5jM0ZbmDuQR2BxCKppl2X4WpMi8
oyWkyw0zyZpl84jaoa2uRCRIVIG3TTp+98W+rz2hrOG6qmjngVhIX0xsxXzMLC7C/bqcV9skyU2K
59C238MDHCFVlmXw08hp84inlsDyeUy9/UmwxonN5PiZihDHj+Fkh+56I2P77o+nTS+36YVjyqig
dZTnFK2nzWCPfbt0xWqKtgqeakFXHNyjpk5bagD6X6Xw8p4JquoWOLSWv3PTFLi1yzanatMacSTR
59xmmYSzU9GsRT8OXU+rSrDfTvY67/bDzhWXLuGauCRsxpKgx6fMIZFbyhunYX1b/TElLwfQ1lQ7
HN0Vz5iOUL29fmwQ8AZagJfObW3LGNbfnqxpWb0aL2rsc3yoKWtcl/pOIcvlSILLaVl31ObX/PEz
k1VU1tPmlXTRo8FJEqvqm16JD/pPYgjGQJwxkK5tlYNFlhEksIlArWswaElgwt5d9zbocaZ4Y5TD
Q8LZnJRiFImYwsiPrG4jN9XU7g7HpfbF2XBGMNSIYcjnKmiepZZ6uMaIwCALgD9cGgoqygzSCeja
RKmofzxPMRFKFUk+U3F+nSx2741Dwo8Op+K8xhgp4S8r7gAXBHffG+Vf7KvxWWxgFI5w4cBgCU9c
YoYpt3CLZpzeLx4vTN0ecY2pKcuKxJYpPKwTWzabjex2xC8T51QZbTxvTmQyGVdAlmZA4ALOpG4P
lU26dNjfF4/aA8FqLKK6eqzCkpS+lAhnlZG0iN9tu17H6gY8tcSZVleTZZTVq0NK8keVGSZY5mZ5
W5RuHVtgSbXt9saYYNcb6lDzJ7xLp+zfmVHnNLJxKlSn73rpZ1k1OFfQ0zyIHC/Mw7FtwL72xsWf
ZKmcUtRJU/Ez0tVCkFQuyp83QEWZTY9R6Yxb9l2lpqThKnnXKRK1Q7SOIjy1ZwzEWPUgdPttfG7V
Gcl6CaU0gj5kcdlIcsBzQDub3ttt2xly7ZJUyeLeETGeA8uy2rhzqnqBLVw5bUSIZ6rMeVLCigfO
SN16kE9iOvXEk1VwELMM0y8ev/4wRG//ANWIyGBqej4xrOYztPl80QibcAhCbj7DpjH+JPBOljrc
nMHxinMphTcj93MltVPzbqbWO46ffDUoaqnKhSU4r0qzVGzTIaurzpssWKppsvja83xoqAp0Am1g
Qw39djfDj9neQ12UZFm1DBHTVr0nwJMjsSIwweNyBa9wSQWvpFx6YzfP8grvDnwizqXL2qUqo6NQ
0VXAV0rKxLOq+wvY9O+NX8AZc4h4E4cqKPLKepo6nLY442IvoAGk2Aa17i9zvuQR0xOdeW5Re1/w
Vxb1pSW9GleI3D0WZ5TU0WYtXyQ1GleaswXQwDMGVl8yG+//AGcZh4ftlFdwN+8c1kkEdNI0ctbV
ZkIT/mMq8wWAB2APTcdN8atXwvT5dmiySKZTSwsYSlpFFpBdiDYn6emMF41yho/CLitRM88VfJG5
Rxq0HnBSPcG+KYu1pvqjRJV6i7fvnggMFizfL7D1z+P++KTxHn+Q13DXEWYUTNJS0K1Cc/4vnKRp
INtrHcGx9xjzHknhfmfEFQ9PQ0RldoviURFLMVisGNhv3++NP4v4MruHv2eqqlqlqEq4RFHLTkMD
GUZT09CG6H0x0JYIY2lrttowRzzmm3GqTNi8H+LKiWWPNI6MZdmU9NBTs7MWYQWJjZh0Zr+XUQTY
AY2XxIpIs34BzmlzCSonSUQWmicR3IsdSFNxv2OMK8J8gravwzymXKaqCeOOgRpYquP57udRVjur
AqQD02BBHXGncR1cicN1sZ0gyxxyMQhUsRfqTsfqMY5tqbZrx7xRROEszoKrg2kzXNZEanBCfF1F
dyjclrK4sBqsLfbD1s94OqLCOvhax/hzZT+mI/LeD4+IeG8uySpqKg0+Z5zES6JreNSZNgtt+/bF
i4X/AGSeH67jGooFr88kVcmy+uDQwhXDS1Dxt5dG6gLt9+uJXB226ISk4UqM5z/McvzHJayqokmk
p45GSMySmRiA4HT7bH0OLn4dcWvxNUQZoIWgrYNdBEKhNxCrWBv/ABWb16b4p3iZk8fBFJnEMUlX
VRQVEkaRyC8n4bhQPqbDEv4P8Rcygr8wSmWoFUTNKkiaTCx8pUKNiRpBv31HE5b4m13BOppexefG
uFM84IroswaaoWCqilVo5bOSEJBUruNx0OM7yamyqPhPKsxznMaajWpjjVJ6msKCVuWrN6C+97Yv
3GCCLgKdCUZ0qIRqVbahpNiT/Ft3xmfFOXCm4L4YpmZqhNbzAvTCci6Rnp2t6/3xGEfMcYXyyU3o
TmkSL1vBcY8/E+Wi+4AzC/8Avit1NVRfF5RWsjiGGqjdS0jMbCfe47GwAxnc2XxHhrik8kWFbVKC
MuGwtGbav4fp2++Ltxk75Lk+XVsLPLLI0dSFc3CtzQLD22vjVLw/kyjTuzPDM8ibaqi78K5/JU00
GfStCsU6LBK1hzYVjIst++zdT/ti25zWDPuFM9eW7wvBOnzA6lsouLdB+oxRfDo08/D0UjRxTx1l
O8chlFrNp0kW77jce98WmOoNPwPmcE0YikSGVNIj0Xsq2+v1xkfxs1ReyKJwdnmX5ZkrLmsnw9DR
zSwioqatowBrAVT6jsMS8vHHAkg0jO8uFje5zBzfFAzanA4ZqnGtnmqkawGu2lhsFO3fFWp6eY8a
z/h1Qf4aE2Wkj1dGHy9MbsXhVnTldbmTLnlikopWXbjHMaHNjS01InOyuaUyrUQzs6Sry7jr2uL4
vVVxGctWJlbSkkBiJWTTpXkoenfpb2xkVBGg4fyioLy84QcnQdlAFze3S+5xeM6aeqegjMEjp5S7
KosPwo9jfoDbfGeUEnp7WaYStau9Cv79khzmGGIiSnmeKMnddaqw83v9O+K1wZXRZVHPrpwaJpFe
dizaUGp7tYfmfphxxS2YwRUcqQrpV0CSR7t0B3/viF4fp45sir5ZiRNFTvYA2FyJBgSWiyN+suI8
Q/DkkSHOcqYkXuY5zfEXxVxHk2d8I11VkgpKqG5gaSlSRHLAqdIv7Hr74yhopRluQALKPM1vwUt9
vX74v1Dly1eUZwKjmEx1XMCyKEN7Jv5dsbMvhI4Fq1N7mXF4iWZ6WlwXPhGqhyrJKbLqWnSNCHCB
ZNAF2vpt7+uIDivPZMvhqq6VojLVTwxyQuRdyrHcWFthcDttffFlyGF2yPLzG7DU0pbyXXZup73H
YYpHirRQOuX1ElTPW1NW4CKulVEa+VgRvY3I37YxQ3ybmvK9MLXQW4XzqkyLh2hqq2lhky5TEZ3k
jZuWoQ3Y2/hHW2LGPFbw5Crqq6BWY9svmOr6eXGeTCM+FUzctlkWEIoY7i8ZH+2IowzpV8IveruI
30bx3FrfL+f8WN2Lw0c9yba3MuTxEsVKKXCNS4zzrJs34BlzDJKeCop6phDHyKd4pHKyoCBfcXvb
t3xceDKDLstoKKngWKnhMDpHDFKYwjargaR1ue/vjOaKmWq4RjWpEmqGsZ15rDUW1p107fljRclm
lTIKVoxIYoUM0mkKourg/MfT06euMGVeXcE+GzdjeqpvqkUDxJzWbJIsyzuCjSlrKmeKKrWdB+LT
rstwPlIa35XscSWTcRUHDXBWRZrW08FRlp5QnkMTSlF5NtZAPmA2/TEB40cTz5vwvU/GiF4nfyCN
SSJDfRvsNhubD0+uIgwSzeBmXyVkAjrYgsSKOojK7HfuQqn74vjHVCKl3ozOemc9PRWaXB4x8CRi
0qR6m1EKMhkJ8vXt274U8Q6ikz3w7pa3KqSnno8xqIlWlOXiCSULOoIYEggbEm/YYyeojc5jlzMK
kH4ap0kVCX+YDb0H9caRNTwVPC+T86Is9LK7xl3EhDGQ3JI6np/2MLLijh0yTfJLFkll1RkapkRp
aTJ8mo1SGngWkkjjEZZSm6gaVXy2uf64x3xvzTMMhTMMzqsxeljBgp4Mt1Blq4wDqZh/MNRK3GwT
tfG25a5kyPKm5jrGlPr0AgI5AX2vcdRb0xhX7SWdS5jwcorZohKsypFEXs9yGbyjqbDTc2t5rYy4
d8qTL/E7Ym0BQ8a0ORcPcN5nLTx5jl8qI0sgpFmeNNIj1bkFrEqLYnH8beEYXRBltQWZC4AyFRdQ
2knr67YzvMJaWs8HMmrBDGszLHFEEsBGNURYA223B/PETJGWzOkIJv8AAOf/AHwX/wA9rb9vp98d
CHh4ZE275aMU884NJdUman4jZpFnHD2WfB00RStlhkFDJQxxE6ZN9e+1gCSN+gGNby6CiXKMpFUs
CwRQP+EYWLcsW2Ursot2xjTU1PWUWXvNEkk9Go5LF+YFu0lyD36DfGvEueH6RI05xanPl12BOleq
jdsc2bpUulnRgr9XyMi/aMyVJ8lzuWhaKFZ8uEELAG5jj1u4ctYDUSoHW1vW2K14W+LXD9Lw/SvX
GlinaKEFXjtrYIEKrZb7EAdep2w78Y89oqbhzO1zKSOqYU8dJEtiyM2rU1j3a23/ANrnGvAaOdM6
aWBqlVjYC1OqG/8A6u/v2x0MGBZsLUnwcrNmeLxC09UehR4o8O8RVkFLRfBS1DyDQqhmuem90t1x
TaiemquLcxkZTUyRKi/EGEKqMCbohtf32AwTgCCWn4WopbVYiNQLkCMR/wCee/zHft64NVwQ0dfV
clXUvIXfUSSzHqfpiieGOFuMWb8GSWWpSQ/Z6cWIudv4dsdm0lDScL1OaTySCSmqI9EKR6jNYElT
sQALXJtiPMvS4Jw7qYhV8F5oCXJhdZlUGwvpK/pqxnhGpI25neNjqk8ZMroaVI+ZFMzFiG5c1/U/
wdr4is7zdM/4Zq6kySiFmYokULF52J2WzAbb9ThnDRSnM8gUrW+anq2FpIge19Pb6364n8+pUfh9
OcJGImuBI4LXA21Fdj9PpjbPFDE00crHklltMhIHjjiRFhWPYEqLCxt7bYc08kXNjWzXLi++x3xE
l99ifzwpC2maNybkMCB98ZnE6ilSJLPuNo8g4sraGlNZVRGQSf5DkMxuNChBewA6k4TpvEA8Sy0s
dLDORfWrrBKqkbi5Y7dv0wzqC0PHNZyTKrSwiVylQEJZo2Yklvr/ALYV4JVl4XygfiaTElgatdO7
N0jG/wCfTrjW8EPLU/Y5CzT8zT0suUktTFn2UBzWqTUQ2vFDfamHynoTY9+o674vHh/XgcGZq7GQ
t8Wg86gH5V6gbYzErFJxFl0ogpHgjcs7ill0f5AA1D01bbd/bFt4GnNHwLmdPpCzGu1LGFKkrYWI
B3xZ4hrylXsLw9rLv98HpvwQ4vOUZnBKHEahgSxNgMe6OGOM8sz/AC2OaGtiZwvmDMAfrY9sfJ/J
uI8wgZQgmt02Q40fhLxUrMvrQKjmojBY42cEBbG5/S+MWDxMvDNyjuXeM8FHxNO6aPVX7TfFFLX5
a9HGpcQknnU6ozbo3W+9vpjw/mlD+863KKJ3lkp6mgMQ5ujRpaIrtbzd++Lv4peIkuZGWKF46pwi
6QYXkJ/Dfa497C3rbGWZDLLV8S5DI9MiFKRFllWneMq2jcOx2vfYnvjT5kpwc5Pd2VYsUcKWNCv7
NeV11Lk9bTR1iLDRSSyxeYG55rqx2HQ8vodx2Nsb1n9TNURR08fNjBpIbxLOG82oMTY79sYb4E1B
y6jrWk1pzhXJZoOWbrVMRf12b7Y1vN6hqjMgITc6oxvBpsLi9n77Y5+Z3NmvCqgjMYK+EZbn8UxI
V6SosAbXPKawwpxpmtFlk/A7TcmWFK6lnaMZy7gr8AQ17Dydev2xI8U5fTI+Y0tBTmORqKZCgiYl
pGRgo/Ub4b8XZaudPwstPJLL8HPTGoc5YictFpCjbfxWfy273vjPOFyW3f8AYsb7EXxTWZZxNwhV
U8dOrUE9DFE0XxjVANg4I1ncdtu2Hv7N+RtknCkjU1Tpp4USojh1ljqliUk/6QSDta+wOFuGshig
bkV9PJLTPBpIkptA1BW2sPQkb4eeEVQKLIY4nZl52XU+kMlrlXkW2ofPtbf6Dti2C04nFcEHvJSf
JoPEtZK9Xn34RZUpIow3xCsB5WvZf4d+2MnZRW8KpQygNDNV06urOUG9ZEN2HQWJ3xporoaviHN0
mIeKSSKIqYdGob3GrvilZlV5XDnYpKImCKCtpWk0QNIseipjeQkHrYKTbvbEEv4LG/SzSeAuA8k4
C444TjoKemSrfI+IHqZ4s2YawJIlQEgDTb0774o37UXLbPuL1sDHJKptzjODekW/nO5GNYruL+FZ
vELIq+PNYhlMGRZ1SS1K5Wyqss08bQqVtclwrG/a1tsZp4s5jkPF3GXFT00yZnlk0DPTzCBokYrT
AEhSBaxuN/TEYqakpS+9zLjrU9ineDOQPQ5VmJoJII6AQxL8NITJYMgkHLa/kGpm8pG3TFr41qmk
hzKJVaOlhSNEjEwkRfLvYD5fpiv+HFbHRZbNHK5Tn0dK3mTSSRqXr/FsPm74sWV1NNmecZhHVos1
OSAySQ6FNh+u+L5u5Nl0NkkQvAHLrc34Oom5apJm0eqSSYxKLcz+IbjG78H5dS0vidXwzzQzQHhb
Jule4XfMJf4rXxjfB2b5PlniTkdYS+XZRQZkJZZkp9YiUJID5D13YdsbPlHiJwZ/x7W5lUcQPHQv
w9ldEswoCS08NXJJImkLcWVlN+hv3tilwlJun0/kz5pbpVZ5e8a8wikz7iKGCFIaeLM6kRhHLi3O
GwJ6j3w74Hy0UEmbrTPHFHPKkjRr5wdcYJ67ruTt2wrxVFR5nmXG881MJ6d5qmpop3jKgq0tw/tc
WNsJ8O1gWol1awZKeme7IBc2YHcfN0698Xt1jr76Fi+JP2LF4jTxQ5DX06kBfiIAqifmAWTf6fTG
ccWVsUnDvDkb8uyRuQZJmiH+XH0I69emNQqauizPMZYquH4qn1s5jmhCA2S17Drv3xk/FsNRnccA
yyB44IJJVREVQQpVAos3by/XbFuFpZI33HlvQ6M1qjAMo4oTXBYVlQRerffyp0H8X1OL1xA6TR8O
Jyw6Hkrp66hzcVKp4YzuKizmAwT3rJ5ZIgoiswYLux7fL0xoNHLRDhTk11PGK+iMAjlk20jm32bt
joeJnGWnS73ZiwRlFS1KtiW4HygR5NUuxRJKcKrxCzJKSikP7Gx39bYmc4nQ5BnSoq2RJjdXLj5E
7n+mK9k3EtNSwV6PUAFoYHGtlBvywD9flwueJqKopa5ZquICRnukropKkIOgPscc3rZtT2M7zd45
ODmdwhT4vcyE6fmXrbfFRR6T/i1yPggvw0PeXT3v73xbfEviXKKDJqj4WeKOOOSNglM66rlkuQMZ
WfEGh/fhrPiK3SYY4wdS6rr1+2O34Oljd9/9HM8VJa199y/0UsacIZUFtcBzt0tv64vdXMstNG7E
QnlRkFmIIOmMbev0xQOBM5y2tyWiWomgb8MnRO633J6374suZcQ00kcqx1EZtBa0ci2FlS17n2xz
8sfW/mzfjktC+RI8RU7pWBZHWXWDKoclbMSijSo6/TFIyypZeH8zHW0LX/8AU+LJnPE1PmFXDJHM
VVI4w3mUA+cXv+XbEZmFbDNk8NLS045ksTBpIwADuw3OIJPTQN72ZmzQLl+TEfCXBe+z36d/+mL7
kVUgyfOyhh03DfgBgvRP5t8Vk8K5hNBQxI73g1FvxNunbbFw4XMuTTu9XHLUpJIn4bEOSAAPbb2x
1fE5Mc4NRd7nP8PjnCSbVbFx4YlSr4Xpw5h/89UMgNwdQ3Ujv9cMOI+HXyjNsqimqI6t44zLT647
tHeSIWW21+vXbriZrs1jhM8UaclQHOiEqqjp1H9sQvGvESVU0EyGQolNCj2cKu8q31DqR5e2OPHe
R1J/DuUOomH/AIcVSNY+Qe4HlcYg5TB/+Ld1pLhH1f4Z9+nzfzfbF34jgPEHC9Jl1DEkDNSqTJcI
pJBtcj64g24OzVzln4h/wYYE/Fne9vl8u3THV8PkhBPU63OfmhObWlXsiy5Qynh2YRcpY1qWI5Ub
RqPNH0VtxjTuGmSoyGlR1hDGmmWOVwSwJ7rbpvbrjPuFzNk09NFVI9SJKhiy8wSmxK2uSBfpjQKn
PYYJnjQyRoFZQsTrGu/S47/b/fHLz+qTruzo4rUEmUHxA4ZlymmyqjnnSugYz1NPEYtTIxEag36X
Gra+wA+mITN5P/0QQsCCPwdV9xtF6Ys/HvEMGZw09tSrFRKja3su80d9QG7fL0GEuLYJ+KeFcuy6
kjSBPgoRzmYKpblj03vvicdtLfcql/zS6ooDtEuY0BtCQ0FUDejax3HUdz/TGlQPbhqBjYKrWULH
yx8/8vbriqS8C5mz0cgniUwpMhvVOb6yCNO21u/ri/8AClY+UVGW07wrUEswfTNrIBN9R1DcAYtz
yjOKSI+HjKEm5L72L9lNRryrK7BTqpHAJRiwBUDYjpjFfFTgXL6eppq2SL4iSphlqHDprtsigAn5
bau59fUY13N88ihqomEgVSHUDnaBuB/D/FjN/EfNoq6ji0urCKhCNeTbUZU/hHzfL07dcYcVqSaN
OapRaZWeJFp6TwroYYESNVeMJGqbD/JJsPzxW3TRmtLcHagk/wDyLb/Pbt3+v2xoHGOXVPF2U09J
GI6dVSFllaTZgFQ9AL9jiFbw7zGapSXnQhUp2hI+IlJuZC9726WNrffHS8PkhGPqfVmHNjlKdxXR
Fosi5RSy76mAD3TRbzS/w9vpjT8vqdMdCNSqDCVB5Wsm8a9G/hxnGTVU2S1NJBIscp06CA5IUam3
8wuQA2/fFtzHPoVr6dmkRdja8mgG4XcDvjlTW/5nRi/SZD+0Rw7QwcKpVJG00jrLNpCkqumOwYgd
Dc9cUrgWhpqNcojMdOFNNGx58Dtclrk2Xvc4u/jRm0WacJ1aLJGwp8tmX/Nt5i6dAPmNh0xBcH5F
VxUWTV1NN+AKOLUIasI3Y9SN72PXHU8NPTjWp1ycvNDVldLsOeBHg/cdCAtIZhMBcQSc3/OP8Xyj
/sYe5tIY8xlAIFjgvCmUZhklNS09SzPFHMJCI6xTHbmFvltuf98J1bRVeaVOqojpyr2/Ga25JO2K
vENSncTX4W4RSkqA576R5/th3JOf+F86Trqh7i/cdsNvgUJsMwozvbeX/pgXjK5dV0aSJPPUrZWi
e6puDdm7dNsZor1I25Jehoil5SVmTWjpWHw9VcfBSEduo7/bpiyZy+nhqm0BFQ1JHkiMa/J2U7jE
W2V5gJqKQcy9PTzQ71293ta22w9R3wvn1ZoyWGKUNG/xOvzy8z+G27Y2ZpKdUzmYYuDba+9iDaZl
2FvywMdUVkXrsRgzUsRYWrqVr91Ykf0wEdBHzlJrICL3sGP9sZ2b9XYUqLNxvrZQxNKh81IZ9xEf
+/bC/BEinIMnIC35cYOmgKba26zHr/v0wWakq63PzWRxMiCn5JiaZ4mJ02vsNxgcgyesyaioKaWM
uacIGYVLlTYk7IRYXuManOPlab3o5qhLzNSW1moRQVkpULS1ZK9SqqP98SUNBmUuWSRxUtVDOzqw
Z49/pcXwVOJqGGN5Yq5XCSBQ4uLg23t7b4sNFn8dZB5M1Rww3H/ZxzZcbm5Pcg6fI8/QeaWcb7Cz
4SqYM2oc/wAijqZJ3SaqYBdLfwxlja/sMaLlNHHX0ys2Z8s3I2t19dzio8a0sg4p4PiOapMGq6o3
KgabU7HexxGCTZbKclES4p8RKThCMx1Y5czL+FzopFV9v5gpwrw74g5FnGXwVdXxTlWT1gustHUE
Fo2H/wA9ivcHviLz6iyzOYo6KvngzGBnW8EjbLsSCN+1sVeo8OuC63hiuYUsWW5pTwyyxGHVrVlB
IPmbfoO1t8XRjjap3ZklLInaqi4ZTlvDORxcuh48hSIs8l2jJUF2LMQQ3Qk3/LEynGuVZbVCoTjz
LayxA5M0bMFI72D4gfBniHKcuyqroyVekvDyIHYyaS0KF1QbkDWW8va9sXfKuLskBqRXQUsc3LDR
RSRBGZt7gC3rbFUo+p3f39CcG3FNURU/H2RVhWZ+Lcq5pXSUEDH13+a/fDSfjfIy9l4ty3cDpBv9
rnFupOJsgUa3WiE7gWiJUEb79sJR8U8OpH+PHRPO9vIiliDc7dL+m4xGl2J79yprx5k0bMv/ABVS
te/lWma4NreuIrJ8w4eyOGOBeOYFjVQiGWPdVG9huLC+/wBcXrLOKcvipqtKingjqtA5KCInmNv8
u24vbAZRxRlNdQzmvgpY6u3kglhC6jv0Fu/Tb0w72qhU+5C0HGGUU1RLMOMstl1m9ptyD6gF9jhj
WcXZL8bJL/xdlaMw7pc3v/z4suWZzkTUlWJxl9HXTRqIjOirZiD2ubi+32wbKs5yGupj8XT0SVSe
WVGVQGYE7p6gi3TC0rmh78WVYcb5K0pjbinLAD/EKckf/wCRwZuJ8kqaWemXiqgdZEki1rEw06hY
n5vfFiTP8oipm5sNAkrR3VQp+bewAtc9t8IZTxVlAoqiOuFNDWNGBHGY/max6bdL2wtPZff5Bv3K
RRDI8taONOOoZUiAUHlA2UdFHm2FyT98SlHxLkNO88f/ABZGwlHVoWJvfoDfbFhyXOcrkpZXqoKR
KkKCqCOwJ3IsLeu2C0me0JoZ0qkigr3iBROUAS2/QDBW+6D5EWvEnDuqRhxKutupNKwBP1IwWp4p
yMAfD8SU4YCxHwpw+y/iGkFM61MZjnKgiJ0PmO/QWxGScWU9FUwJpUGYElFgYC9z7X9MTr2I79yl
cY8dK9RSZZlnEFG0FajwVdTPRueSvVTYHuRbEXS080Suycc0JB/ko5jYDoBv29MTfE3Ehy+V6uoR
F56QxkFOjxyakYexuy/cYticT0dJGI54AKiRbKFjNjvYW264taqKpff5FSXqdspdJmtRloZ14wpp
mOxLZXMxH64PLmMqxNP/AMV09rFrR5Q+5+5xb8u4upzR1NPWFoqp41WMmP8Ai33AA7H/AGwfL+Ja
YU8yVSstUygJHJGQZCCdwLYVPt9/kSr3Mm4m4yr6DLDNl/EUdVPdRyP3UylvWxxU+HvFn/hKhqaX
M8lTO5KiqacyTx6TGGsStiD5Qbkel8bbPxPBTJ/i4is7JZByCAWudrfcYxrxkzWGcZe+gfGSRsrk
JZmsRa/6404lqehxMuVOK1qRqcc8uZ0dPWJwdlTQyIro/MXcEXB+XCTh5llK8IZUoX5mZkP6FcMO
H89ll4My6meRVcUioGLAH5QNx2x1TxdTwxvCKmmqEdVuyyqtrDcYr9b2RctNWxeQCpLRJwXlKEDq
CvT/ANOG0UTKgjXg3KNQ2Bcrv99OEKbic0hf/F0ssdyBy5gWCk9ycITcVQJO+itglLNcjm7/AP2x
NRlwHp5FWqaiGQqOEskUg2N2Xa/T+HCVVLXJqVuFslRwd9Li4/8ApxDVudn49qwVUBLkfg80eWwP
23w2reIkrK2OY10NPIQF0CUE7Ynob+2Q1Jdf2FuIM9/cMMdTPw7RBJGC6UUOxPsAuKfLxA8uZ1Nd
S1UmXvOqhqeOkLothbbbbEvxJxBJmnwsduYiBv8ALOoA2tvbCdFnQWMSRq1/lZSLatsTjBxKZS1S
qxWHPKho7rn9TrA6DK8BJmtTzFLZ5WAjcH9098Sz8WwVD/gsfKLONJv0wlmPEk9TJGaZpBGBZyot
2xLS+33+RK1/2/f/AGQtRW1NbUXnzysLdicpNsMM1qJaeNpRmdVOyWsrZWVuCQP+/fE7WcSVFVNG
1KJiqrpkQqd/zxHcScUPPTtKEmARURwVIVgGB798TjF3x9/kVyaae/7/AOybyzPspgooYpXzhTGB
GdNKdiO3y4eLxTQKCgbPbDo4pz1/9OImHiT4oJJEkpLEvLaMgm/QfbbD1+NlkkRooZ1UEBg0J3H3
xDy32LlkVci8XEtBzdUjcQuym6n4T/8A5wtLxBlldKGqF4gJT5S9Hf8AMacMaji01csbUsc4CWDg
xstxv7YJVcYS180Ro1nTQNLBoyt/bC8t9h613H9TUZFUoC+X5/MRuLUjdbdvQYewZ1RLSwxfuviZ
oY0VUUIRpA6YhKniisqmieCGoiliAChgFRxfe9zhzNxTWVioYYpoHUDUQgAPW4BJ9+uDy2PWr5/Q
kps9oy66so4qA+lr/mcEjz+KmdJRlPFEUgvpIjB2vhqnGypIisskEiKvll0IDY721NuO2FBxocxk
tAsoZApJYABxfsQd8LQ+xJSX/b9Bes4mosyKtV5fxTLIosL09tu9rDCTU+RzBWk4e4pYWJF1bcHr
3weo4wlzCeM01JUxTQAKBLpVH33F9W+AzTiisrZafl001E8aFW1OoVje5A82+ForhfqNyT5d/QkI
82poYlSLJ+KEVQFUcvsAAO+DvxCAImXJuKUAO4CCzfctiOqeLp60IkMVRCyjd2KqDv8AwnVh3Jx/
CI0jRZqeSNQuqRkUEgi9rtuNj+eIeW3yiWpL/kLniMOA65BxOzgWBa3T/wBWEqvMvjmQz5DxEu1o
3mYDt28+CVvHP7zkAhglIAIEnlCm5HQg79O2OquLWzR4IEilpXiBDPKV0kegN++2ForoCku5EZ1N
kmW5S1Tm2SZw1Ig8xmkVQ46EfOb3vaw64omaeIOTvSx0fDNBmWWGIqGlk1Pyl9Atz9N8XXjfipkl
yQvRMyUlSrMtkZXPbSL7jFb4LzOrTJjTZPl9RU17zStN8JE8j219SFv0uMXRSUdT/fYyzbc9KdfT
cm+AuIM74miZHihigiI1z1pKlj6BQov+mJyp4XpvjHkkrImeViTpZgL/AJYqk2cZvSUkVRUQ18cE
nkSZo3VHIvezEAHp2N9j6YmMpqjOVaVqiQ23u/8AXfEJRXK4NGN9OWSI4bpVfzVEX/8AcP8AbD2n
yinpIZVhrqePmWLawzdOmOlNNURgNDJcbatQJH64jq2WCGkZoIpnnAA3ewv+eK1FNmltokaKGtrJ
5I1q6SNFJAYr1sbeuBzXhh62NI6jMKeQBtQVFI39zfFdyvLOLqgq8fDWbytXwmWmFPl87iRBa7Kd
PmUal8y36j1wbLM/eeoWKty9oHWTQVBIYkGxDAkEWOLNPZlCmpbMkf8Ag6nWRVNZGoB8wuTtg78G
UotJHWKAD1JP98SCVtEos1IS24Nz3/PDKrqolIEVPLZCSQZNiPzxWXVQWab4aeQjMYkY2BvGTe33
xHy11ZNPaLNI2Zj5QINvub4Y8PZBxPx3mFTQ8N5BmOeViRtK8NBG8zxoCBrIW503IH3xaJ/D7i7h
rJkzjPeDc4pssqNPKrKyleKI7X2ZgAe5xKXlw2bV/QoUtbr/AGVjj3L6OhekqaCWdJZMoklmWKoc
rzruAdN9m2GwxpPhwq1HB+TmSpKzfDpqUi7E2uSb4FKjK6ak+Hl5XxJ8q8yQCRr9+u597YZLmyZL
IkMFYXkB1WkAYgnt0xCc3kSilwPHj8uTlfJpQzE0lCI45A4bqXQ+n/TFTzfiCOq4+4N1yIipUVLm
TTt/7uwthCPi34mjeBqoEFSt1j/6YqtXXwpxlwqWZwiSVIJt/wDmTijHCr+v7Gib2X0/ctfGuU5R
nTZs0tTLTTLl5lhmpZjCxkFRGLgA+bys2xv0xmfBwqMx4i40y1qiSSnFKI6dq13dAOSxYqfUkdu9
sXzNsyyynMlc0ryBSARPJaNR6gbWOElzWhq6KSrp5SbRSGMQS64xdCp23/rjRHI449FfUyTwqU9V
jHwUGc1GZrS0lTJLBU00dTOaPTHNE5GlbnfqF9O2LpxtSzZXnJT4vMaaUqCTJUC7n+axU/pjMvAr
M3p8+qHSCSqYUtOloqjlkfN13F/9sXHxYzyR87gvHLDIYVAjnk5rncjZrnb2xGafm0gxV5abI/P6
vMKjLJ1oc7q2rFUcoztGB1F/MEuNrjbD7Js5ccOtNNV1FNWNMGj5NWHa1rFWNuxG1sUSozYQkxWM
k/QgG4HsP74gjxPlcNQabm0izMbGNCt7+ht3xasTkqBzjF8msy5rUTBgM4zJJLWWQVXQ/lh34a5h
xLnPENRk82e1OY0tNDGVqo1QSxub2VtjfYXvYdcZRHnT08ykOWhJtpZvlPY39MW7wjzEJxdnk4pX
qvNEuumqTEBZB7i53xGWPTFgppyVGl8UVtbl+ayU5zGohMFlJl5TMvS7brcX64pHF3EGeVNGWos7
lNRHIpAlEaakDXYK4S6kjHeI2cP+/wCeLlSiSVQAsr8yQ+xa+4/tikfvVpan4SmX4iRVu7tuAO9v
bEMcNkyybXBoVHVtNlwrznk5q3caVEyuQhF7EkdQfS2EszqKn4XnvmFXr3RZBNYg267DGZ/vbLjI
KNaylaVjblJp2P2PXAVWfVGXSLS1MryQsQVLtcofQnuMTWJ3yVPJGtzS/D7Ns/zHMayijzOaupoA
g+KAUOHIvpIIsdrG/vh7nucVUGaPG2YViPFYHU6KVPf+HD39kUU+a8Z56k9F8VC7R3VZdI+X0P8A
XGjeJvhvw9mXFuYU0NPLl9QzeVUkvba9267d8Z8sowyVItx+qFownOs6ra3LZYKfNaqKa4s8k3YG
5FwLjDmkzBTlsUrZhI87tf8ADqCdO3e+JrLPBw8SZ5JR5ZmJdUbSZKiPb69f09MeguAf2CK/ibJZ
Zos2yudVIF4HJF+tjYbHF8XCdRjuyucli9U9keTuLlkzDJKiH42plIGoRvLfXbcgbff7YbcD5rn2
bkRHNKyvpkjTTMGVWUlblTt2uMejM+/YR4/jzGWnp6rK46fUUDzTsWX3sF6YzOP9m/O/DrhHLM5n
raWsizCjmriIpWjMaROIyu/UkjEvMx6XG9yHxTTXBS8wzKsp6t1auqg97MBMLg/lit57nldWU+mD
NqtJUcPZ5yQQDcrtvi98IcP5LneTZrneavO7UlSV5KvZQoQNcnv3ufbGl+A3gPw9xpm9G/HdNU8O
U2a037wybKC3w/72oORI7VZqD8oRkW8QIaxDHY4PMjG9uBZHS36nn+vqZtEaw1VTI0+55UzEA+5P
3xRuKssraupSSateRRcIrNcqMe/eC/DzwQzvxa8QeH5Icqnydv3LHlBhq5IkLtTSGcQyttdmAJJO
9tr48l+O3h7ScLZnUZtwlUVuc8CJMlFDm9XHpvUlGaSNdhrQFWCyWs1ja9rmeLMnKqr/ANM2R6oj
bJkEHDcdEZIjItF87HzX031fXGNScOiSsmKSmIM5OgNsPbGoNWGkmaNZoA3ItZhtuuM7apcStFGL
y6gqoovdugAxowpq33IZ2nXsM0yMNVNCsz7jyFdyT9MP6jhMQ5eoZnWs6soVg1vW3p/fHsX9kL9m
nLs2rMoz/wAQ6Weg4RzWd6TL8yia0dbWxyhDTySAfgRMdaq1xzGUjUPKG9A1HDngHR/tGQ5LJlvD
i8Mf8D1FNLqiLU/xP7yjQEzWtrC6l5l9txqxJZbl8jO0kqqz5PTZIwZ1WdwQtgT/ADYZZTRSRcQU
8bTI34mks3QDvj25+2l+y3knDdXnvF3hRTVVdwnkH/6wkuZKehneQKsUEhH4oUG72LCPYE3JA8YZ
S4OeUzal+cnzDYbHF8JqcW0UyStGsUtFHWcDPF+EkEdWrO8J0sSb239LjELUcN642dK5/K1irOdr
9MTvCwNVwZmh5sd1niN9PTzHG+fss+CsXEMqca8UUsi8E01SaOvzZIuYtCzKDFIUsbrewaSxEYZS
Ra5GBN65JdzovTpTl2PMlF4ecQV6Vc8WWZpUxJHqEiU0jKV6XBA6X/riFlpqygdaetFZTTqbNHOW
Rgo9QcfW3xQy3wi4Z8TPC7LkqaF6IV1fHmtqqWZDD8C7BZWQlQoco1uxsdt8Un9pXwc4UrDTtwbT
1HFtPT5fJmOY5ZDIK1MvouXqFXBO1zq2uKdmbmLfSFNidEvMjb2ddmZYyhJpbqz5iBaqWePlVUzl
j5RzTuMBxBSVK0kTSSSLExsbylrntjX/ABW4b4docj4azDKKaniqqyoKOlPqSOSPllla/Sx2O3rj
V+Hv2Lsr418O6/ODn8+WVlJm9DQLDEEqIis5jBY9Dcaz+WKV4nGkpS2sveCW6PKtLTTtGo5kxIFm
IkO2EaqjjjjkMzszgba2Y/74+kvhd/8Ag3srauljzLir4yOx8qUmhj+bHFJ8Z/2KeAOFOIDl9X4i
JlcltoTAmq9tgSTYYa8RBx1rjuCjcvLvc8DU9S9PGkXxMz2Fr81gAPzwNNqrK6GFGaR5D5Q0jWP6
42jOfBTh3h3iKSjeoqM0hQ2EpkChx6+TY/mRjWvB3hrKMq4zyuGmy/LowC34c8QETDQSCzG59D9c
VT8XCKtIuh4abe7PI/E+VTUE1NHUc2nSQE6A7qW9Ovbrhzl+TLW0azGRVjBKfOxIt7XxoP7WzRwe
JYMb0NtG/wAA2r164yfI696uN4NxHH5rHoxJ6n2HpjZBueNTM0qhkcSUny/KEoHMollqVvy9C6gx
t39sEyukoqCCKIQl5Bcl5dj+QxDVfE+VLMYhUuzjYyAHQP0wY1zQyKjMHjddUci9GHtiWmXUhrje
xdMjMFTnNPThISJbq4k+Urbfe+2I/jakp6POY6d5AtGwN4qdzYsBt07dcRPDdSRxBS6uXJuTaf5O
nU4LxpVhc0jkD0/Uj/Ddeh/TENPrLHP8P6jlpqKFVURIUUad+uG1TnGXDLzB5YnDllKR6tRtYA+2
KxUVplN2a47f3xZaDw14trqeGpg4azaeCdUkhkjpmPMV9WgqOrA6GsQD8pxN6YK5uiuMpS2irFMo
eipaeOEqJzcszyDcDFiyj931OZwQQU0Amkv5mXYLY37+mM9NQ1O2iUWubXIsQe4PocSeRZixzOJX
0sN7rLtH074HFvclCdUiZ43p6egrqYR2p4muvLpnIubbXIPTbG1/sMeKmQeCninBnfE9TLR5dNl1
RTh0JPneWIDp22JJPQAntbHnji6sV5IHQwrZ7EQb4Uy3NKWmy+M1QUcskrI5vp37Ypy4VmxeXLhj
jkUcjke0P2jvHPgLjP8AZf4Z4ZyXiAVnEWW5qWbL9EuoxXnBkuV0AfiLYXvjzfQrUssPKUhdIJ1S
b2/PFLk4jy3PamOJSssgFwrrpJPtfriVq87joaUAR6WIC3Vu+M+Lwy8PHRH5mpZlJuTZdY2dSxdd
gP58QqZmZZHFnZTfbXiqLn0rqSJmUN6ucdVZvEgZIrI9vmB72xcokpZ74PfOTft18A8McKeGtDle
XZnNm+Q5MMrqqipblwRM6QB321M6gwsLKL+YHtjx1xVxLBxTxznOa0moU1TVz1Ed2sQryswv+eMv
m4rgopNAkCm1mWNdgfe2JCjr1mQSxBFjfa4Nr4hDwscUtcVVmeOe/Tdmj5fnEEYInhaQfy6r2P54
kRXUlTTzCOlK2B6tjM0qxGhIZPu2FIq9mfQJANW2xOHKC5NUc/Rnrj/8Hz4scI+Dnizn2bcY5vFk
lFPlUlPHI6M4ZjJGwHlBPRDjZ/2qP2t/CXj/AMEW4T4az6orM0gdDEjUMiIwCsPmYWHXHzazuvhy
qNJ5njKjYOBex9vfDfL+MKPOZhESruBssiWufUYUsOuLtbd+vT/RkuCyqV7r7/kjsyyHPsyzL4mo
op5KiocBC1ibkalA3226Y0DhXOp6fLIkzZZhWgmMM7XJW3lJ3wxlq6cS0BvTbSw3/Gk/+F39MOsq
WJ6aOYCMgMd1JI6DucackrirI4Fpm3FlooOIqanpHFSXYlvKF/XCWY5tQ1HFPDIjjlVRJPqBPUmK
w7+uIKtjLShuaOUSDpC4R4kqEp894aaAKigzaiBcnyDGVRV7G95HW/Sv3FPEPKM34izt6SioKioo
aXQgRHUrrcMwvcjey7em+IXw/psz4fzFZqiklXKayB9Y1AKbq2lrA9bgj88XjhfOqOLOqk10VPUg
zQ7VDSXvypAPl7XI98VmjqKcZfRWanYimFwrPq/8z12xpT/D0tGKSXm60yT8LpUbMKy6QS+SELzp
eWV2O17b4sfHdYYM4y/8GKA8vUFilMgNid7npv2xQfDmsVMxrdfw9gyD/ELcCy9sTHHdcP3nROpp
7cs70gsh69ffFDX4pdCdYfvuRdVmEy0WYSRxNLLpSNQrWbzGxsfW1x98ZpxHWmoreW9OaXljQIbA
aRfpt/XFzlqwcmrpCbgTQCxvb5u+KHxFMHzacgra/wDDcDrjfh5ZzvES2RoGSZpJUZBSvKxYvD1P
U22/2xePCacVWb5gzQUdQTIgLVMvLNgg2tbpjLcoq+XkGXrf/wAo9/8AUcW7wzziOlrqgyNQjU4P
+MS/8I/TGXKrjJGnDP1RsuPHOafDcU1KRpFGBGxVYX1qt17Nir5bXzrwzmcsdKajn1UdM3Le0jKd
2UHtcbfTB+NKxZs+kljMARoSbUotH0/riL4drV/4Un1MLLmcbWYG1tPtimK9C+hfKbc2vn+xHZnU
NLMETK3Q6EZkV0sdR2tYeXp2xKcSVUpyvJZprLLUUgdrm5uGI399sQOdZ1TU1UWbQxMFPZFU9r3/
AK4ccUVxkyrhlgdmy/UAO15G2xoa3j99DIpfFv8AdnoL9jR45+NMzdko3YsljVS6D07Y3nj+nNBx
lnGl40/BNkgOpVDAXs2POn7G1ei8U1xeryymLad8xjLn7WIx6E8Qc1C8RZ1pkpZAaW+ujFoibr8o
7Y4HjL89o7Phd8aKvwpI+V8PNWGnMxqMxkp2tKEvpUsLk9vbvsMbB4U+PeacGZRItA8kfxdRy3Nl
N3tcC1/QYy7hGqgm4Hy1ZRFKHzisukqFwQIGPQd9tsU7hjibL8v+Fnkqy7R5iq8tz5mUxtvb2IA+
+CDe7XIsijLaSs+pGcolRWwSsgV5Io3tfuRfHjvxZoKSb9nPhqvlgoJZRlWYRK1TKUcD4hjsPtj0
pxLxclNndBEJB5qWBhv0ugx5J8WeMoqb9mbhGlWegdpstrgRPCWkF536HtiiM05v5ooxwlGMfvoe
P4OKIsq8Ic/iqC/w0+ZJTycncxxMq69J7krqH3x6h8Sf20vBzxLzTgfK2oM5m4KyjNZK+uo5cq0G
VIabRRxot/lLk6wLAgb7HHlfhKNcx4BzanIQ685ohZEutjJGOmPpxxjwxQ5d45eFVI9BSsiZnn6I
FoUUMq0K2uOhsfyx13pt2ur/AGRkm23F30/k8q8R/tgeFHFHHPiF+88szjMOFuJ6fKKdqRctVSRB
TyRynTfyFWdStutsZnmf7S/DXE/gBUcEZhR5pLnDZTT0MFR8EBCJaapb4dyw6fgkBj/NcY928AcM
ZDL+094lJXZfScqOn4ZMSGjSwLLJ27XIF/XFd8X/AA94Py79kTjGo4cWOrpqfKs45NUYFDn/ANqs
Tva40tqX6AYI4oSWuuK6/wDhDzHGo/wfNniBlXOXiMqBTEBfl/6cUTh/MTl+dUlRo5q08okCW2Yr
cjf6gYv/ABRIBxM9pnFlA1BPb0xnOQPq4jhW5IMjbjp8rdsbcfwfQMvx/U9+Z1+2/wCGdZ+zxwP4
ZQZNxIuWlcky/PknyghZsvQo9YsTavM8hUgEC7BiQcW4ftpeHVZ400vE+W8McQf8NwcGy8P/ALuO
TBQC1ckgj5V7crlLpv0vYY1TiHL6eLwd8B5pYYypznglWZo16CEDG+5IuSyeMEFNyYWrjw3MUsot
yRWjWLf8xXFcYLI9HHK+9jLqUFfPU8H8N/to+HHB/hFxt4cT5DxB/wAOTVOc0WS0sWVXWHLqpGeK
KTzbMkruN7kLpOPnPw/G4zOi1MQwG5tcfKcfdafgOgSg8WWipqeV5s9rqli0atpLZVFcb9N/64+G
fD3kzGibzLZfmG/8J7Y0wh5epEvTKmjWeCnI4JzvzliHiI0pv/mdseofC39tXhTw2/ZWl4Ay7L86
Ti9qKtjar+BV6X4ieZgX1ltwI27jqAMeYuCaopwXnSMZCSYyBa1/xB3x7o8CPD2k4k/ZBWpkijPM
y2YNJJAm3+NG4br0BxiUnGcq7/wbJxjKENTGh/av8LshzDwih4fyHiHJ8g4RrqiSWL91BWMTUEkA
ZVDedjI4JHpc4d+G37dHhT4f8c8bpQ5Fn9Dwpnc1JmcNHSZIGeOsZSlXdFbaNwsbjtcvYC9sexeO
YOHslzTguiqMtpnr6jMJBRsIE8rLTSaz73XbFG4Byekh/aW4xVKONFThvJAqinjAUc2o9On/AH6Y
2JShPRz/AOnObhKDdfdnyZ8Sc8yviPKKI5EktPkDZ/WigjrE0EUwZ+UHH8JVWVbdrY93eFIoIfBC
aSFsqLS51leoUDHUdMkXUfbHiz9o4Pl3HldHDEoReJM0dV0CwPPcW0jHqPww46rcz8FHpa9o1igz
nLnTTRmG/wCPGPm6G3pjieLVKNd3+528XqT+n7HrHNszkybI84qcvfl1EVJLIjFrWIG362x88PFn
xPm4kzOrjq6WQ1SyrG7N5hrZ2j2PfdTv6WOPZ3GHFEFJwxxDUyPy0joZmd+oCgXJt32HTHmvjjJ/
BXiakqc7p+OJcrrGzGaVqNKWa8kaSloiAF2Llibfy7HpjD4bI0uGy+cFF7mLxcOZplWT0tRXxRxJ
UzQ1FIVkDXgkZ16Dp5om2PoPXGkcACJOMsnSUUgQIxY1+8JsrW1j+n2w04/4j4V4gpMoj4UzEZll
lDBl1FJMaZoGMyRSNICGALEM3zd/U2w78NcwiouPMtmFQYtELnUkJmYeVv4R1/2xPJKUrbW5bjqt
jzT+1fKieJFRy6ykrB1Bo4eWqC58o9R7++Mt4XilrmqqOKYRPPEsSs99KlnVdX21Y1r9ryt/eHiA
GNRNULoFjLSmC256AgYy/wAOa+lybiakr62R4qOmlgqJ5I11MsaTRsxUdzYGwx6LA2vCxa5o4eWn
nafBHHw+mizf92/GRFxUPT8zSdJKm1/piZ454Pn8P6oZLPXQZg9HU6BUU4IVlKhtr/XHpPiviX9m
/wD4gpuIsn4s4hq6mbO5q6ohkyt1EcBYaRYgebdjsLdiMZL+1Fxvw34j+IuY5/wpV1ddktTVqIp6
2nEEjaYwDdLCw2sNsZsPifEZcsY5ItRre11Jzw4IY3KD3/gz3JTbOqW7qigX1uLqPthpxfMP3gxW
VJPNe8aaMPeGrjiOjAdoyFNmVNZ6Ht3w244YzV8l5JJALHzx6O/0x0F8aM8vgZC0avLWQqpXUWGn
UNQvfa47/TGs5LnXiDxbxhR07cZR0FUIpTTVksQRYFQDyR2HkB1WAWw3O2+M24LraPL+LMnqcxlk
hoIamN6iSKPW6RggsVXuQL7d8eyOEePv2c+AX4fzxeNs4zDMpKGoFdTjJXfkSNytCqCtg3kbfcC/
bHP8fPJH/Hj1On0T/c0+F0Vcp6d+7/g8j8eZVmWQ8TZvQZrVw11dBWustRCmhZG66gLC18RGWVJG
aQkkKADu41L09MXn9oPjfh7xF8TuIM/4ZnrKjKqyraRJK+IRSnbuo2HTGf5W+jNIGVijAHzKNR/L
G3C5Swxc1TrdfQzZXFZHodqyR4llM0SWZW8w2jXTh1w5wenGUtLTy5pBlcJqVgMkkTyBdVzqIU3s
Avb1wxz6TmwW1O/mB8y6Ri0+H/GGT8OVUUWc1FVDTmoSUfCxBjYKwJ6HfcW++I5JThivHyOChLJW
Tgi63w/mi4VGeQ5pl8wpIwxSJXSQWnMarY7E7E39DY9MFfMxEu8CN39d8b3lniL4ZZn+yhXcOV+Z
57ScXRwSzRCmy6KSmkfn64kd9mUEk3O9r+1secpp1j1EOfriGOWWd+b3dfIk1jjXl9l+YvX1PNjR
gFW38uImpvqZ9fRfT2wpJOGJ8/uSO2GdXWCNSkbh1INycaYIqnJEGoaVh5hufy74seToYFlhaZTp
bYqPYHbFcjmEZSxOx9O1sTtLWpVVc8qM5Rn2LjfoOtsacitGPC6kT75g0kQS6WHfucOKXNeWQt1P
viFWUMTpYn7YNTuDKBqI9gMYpR2OgpMieJ6k1lREA4Cr29yeuGOXRGJ4qgTKCrr5N7ne2Fc7mCzp
qLar36e+GtNWrykhu+osNtrdb43wXoSOdN/iNs1Rq+ZpKO71BtLF/Gn/AMPth7lGcNDH8OYiVkYB
pZDcrsBe422xX6TMqWljiq6nLIKyDynkhWQselgwOx6i+JCozeGikaHL4ZqSndiUpaqzSJ7agAH+
tgfUY581ao6WOTjK7HWcVYy8RQxyGc6SxddyN+mGc2bSS12RjRfkiS1wbm698MaysmihlnKaix06
Syg3G+++3XDSauqkkpJ5q6igaN3UIkiu0Y0jc9iDewt6H2wlG0TcpXwWzLc1nXNanlPNGedCx5Mi
rY6W3374SDzNkVIzvKIeQo88ikE3a2w39cVaPiqKJ+bM1JJVO4Z5rF1IAsF0W277g/bEnwnPDnyT
0X7yoaEU9OZVkqoeXzNNzpVr9ftviU04xsgm26HPBdf8JW1Tc4RLqHmdS3bDrjXNTVZhRsJxN+Gf
MqaO57YhOHajTJVMplQM17Iuo9O+DcRS86uo9TSNZCt5FsRv2xGlrDU9FCElayZLVi5808PQ274g
M7RRVc0+Z5AxOog2scS89KBDNSmQ+Z0bVoJG36YYVWXxTFS9agsCLKg7m/rjRjaRlyJyHMU3Lpad
BsBH2Pvi0+HteaWZzz1hBY/PCZN9vTFWpaJZZlgExOmO+rRbv9cTvBs7U09leZPOT+EgbFWSnFl2
NtSRYeMavn5zfmCQmnPmEejt0tiEyKbTwfWWO4rk6Gx+XElxQ5q8+iDPMQ1PYvKgDdD222xBUiyU
eW1NEqc1GmWYyFCQtv0tjPBelL5F83Um/mJ5TwXmfGdZmKZcqyvQwxzzhnvpjvYufRVJFydhffBe
IG05dw8NV9NCVI9CJXBwIqJIKWujieBRVxpE7hRqVQ+rax2v0Pttg2YUElZBRJK5V4IWXVyyNXmJ
vv8AXF9u1fH/AIUpKnX3ubb+yHxD+4+Jqt/3j8AXKm/wvPuL/TbGseO3GklHnOc18EqV8kkEKcxk
+HDglB8ptpP16489/s9ZnNQ5vOYZq2Eso2okVid/cHGgcbZBl2acXMwhqebNokZ6m5cubXJUnT9M
cbPGP9y3I62By8n0lj8LeL3zThWijbRTtFmlTYJVLq81O25IuAL9B3tgOF8yoqvkyGFfLmsSl5HC
kXp2uLHsTvfHnqLxYzThXNqmhyylg5UVTI6K0YuSQVJa3ex+2DZF4sZnXZ1T0r08UUb1McuiJRs6
gp3HoemNX9pOpSS2Zm/uYtqLe59LuKfEDVn+XSLNrBoaezDt5cebvFHjeqh8D+D8uinZYVpa6Nh8
PqA/xL7avU/phNfEZTlWd5rnuvLVySmh1R06mQlSnlvqsbmw6DvjKM244XP/AAg4dihlrG5CVUUi
gDQH5pY2+zDHKwYWmm1ta/Zm/LkVUn0f8FEyjiyXKuD840BDO1dTyRsxsoZXVgSPTy49gZb+0V4h
cdeKHAVfmWZ8DU1XSZ3mUENY6TR04M9INckw1bKFAC2t5uuPC4qguU5jqJN5oyC2xvcdcelMj4ip
YOL+EmqdGuLidpJ45Jo2uvw0XUWtbr12x2ska4Xf9kcmL1c9K/c2Q+JfFmXftEcSzjirgL4qpOQJ
LV3l+EfQr6NHnv5d9e/cWtiPbjfi2o/Zb4qpP+IuE6nKGy3NufRQxytWaWzZ9QVtdgWZiyki2m3U
74RjzbIuJP2k3qqpKTXNJkYjKyQrGrCmlZ72Gm1h272viKjq8mpf2aeIo6epiiq6nI82EkYqk1S2
zqbQCvU2Cg27jfpjHq4pf9S6lW/ueb+KJdPELkNNYoNyN+mM4yF2fiKJo11sZTa5sTs2L1xRIV4i
2MoGhevXpig8ObcRQkDcTN1O42bHSxfA/kZ8r9a+Z9VfEGbi+HwK8HZJarhtqJMz4NaAGGZGD8ka
Oa2q2n1t26WwPDnGnHlH+0NO9LUcLS1S8K5oycppzByhmCXubk6tVrdre+A8ReLqFf2fvBpI8wpZ
JIsy4KZo/io20gQ+a47W73xE8N8ZZMvjnXRw1SRwjhHN0qQKyNdTLmsLKqsOgtfba/0xhWRqVr3L
IRuLTXYvfDnH/HNZl/jJGtRwyHHFOYxTc34hhcZXFfl2I8tgLX3ve+2PkLlks0UtO8CLzAlwXa38
OPsBwVxxwFlk3jklXVU2XvLxNmaU8D1qWLDKoQWG++q7C+++2PjzR1RgSOZAGKQllU+y43wnKWq3
fBRJJVSounDHFmaQUNVlsi01VBOFUkSadFm1ffHu/gLxLz/If2Gaalyyq4fMZoKlZRNFOtXHGa1Q
oDA6Ga5J6WtbHzr4Tn1VNSGpkpiFUlE77E3+98e9PC3O+G6z9gTiBGlhmzqhoZpmheuRWWP42Mgc
s73IvimerHJqPNoti1OKcuDUvGPxQ8Qa7jzw/fMZOEo5KbO6mKnamNQ0bP8ACWPMBa5S19x39sbD
4Xw8bzftF8XP8VwoZzkGSvKY6aoKmK8+jR57hrg3vcWt03x5k8d/EvhrPPEfg2fKTBQU9JnxDImY
xvGgNAbkEXsCe/S+2PTfhx4pZDl37SPEgmzvLQlVwlkIjaXM4tLES1IYBuhIDAkdd/fEcOW5qU39
2LPDTCor72PnH+0vRV2UeLuYUeYcoVkOc1zSPSqQhLTOborXIG/fGs8P8bVMfgXUxST5g4TN6RlW
WFRDYTIQQwF77dMY5+1Tx3Dxx4z55mtLoaGTNa1Y2gkDBgs8iAq3cELe/vh3BxA9H4OVaMlaEarg
ILTaoyRKh6X67dcY/ER1afn/ACb8MqUvl/B6L4k43+Ky/OaeaQmmmpJY21GwIYWI/XG55/8As28D
RZ/wVF+78ljo8zramnkIDPa9GXUMbDUQVuPc48WeLmZVfDGU0stBIZHq6aWR1ns4VVVWJFiOl++G
3Ef/AOEG8T66po1qc7yulqcuaUQ8qCGNoy8fLY21bHTsD1FzjDg8LrjbV/Vot8RmkpVF0Wb9oThv
I/DXjzMsjyKOnioUq6V1NNIWVmMThmF+l7DbtiJ8NMzdOOsukWSoRRBJ5qVQz/K2wBB++Mn4r8V+
JvEyth4h4iMdSpaECeCJIxKkYKAghrE2J3sd+uLpkBXJ+OoKenNVKopWZUSYIxurfxC1sTlicIVL
mvmWQyKRl/7VFWavjm7S1stkAvWhRbftbGQ5a2qKvU2ANMRc9PmXGkftAOZuJldoZomMYus03NP5
3OKLR5WBDPpLsHhAa1tgbetsd/w7SwRTOJmt5ZEeMm8oEbwyKszIZI21AgJcna+2+JviyiTKoqem
jEegTI94gQu8Y9e/riKoM4iyaMxU1YYgGYkawTcjSe3oMSmaVdZxBRx1ldK0wZwUlbTqYKoUdO1r
dsXPUpJvgpjWlpcjjhfUvEtGwEluW28VtXQ+uGXHJvVykc/fSfxbf7YkuHipzqEIrtaNgAslj0Pf
EXxipE7FkZPl+Z9WIRf4iLZf4ysvJo3P8rD9MRImLPvsPS+J6rolE0aKWbUlzbtiO+Go1cjngafV
/wDpjbFowSTsWpmC08ii1tY6dPlxIZW1syhI1X0t8nXphClpY3Q2curNs179u2HNDGq5iiqC2nUP
msTtiuTTstiuB5m6M8Olg9iQfPjbv2WRFTVec5g3D2TcR8qpoYTDnNAatUDyMSVAGxOmx9QcYnmB
si3Rl2AN2vi5eB/7RHGPgFm1bW8I5nFl8lWUMyTUsU6OULaDaRWsV1GxFuuOd4nFPPgeODq6/dG7
w+WOHKpyVnqXPPDjK8z/AGY2rhkuTUdZDR1acymytkqWY140guB8wW4BPQbY8L1crh2W1yGNwe2N
l4j/AGs/FXinKK/J5+LZBlVdI8s9FDS06Ixdy7dI7gFiTYHGNMCrO81mv1IPfGb+neGzeGU1mldt
tfUv8Znx53Hy1VKhqjMZASp5ZvqthtPo1HTexwu0hLOEbSu9rYaSOA+m+/S4x3InIlwRxG5B2PoR
iYyyHkVEkaszgEbgW7DCAoYLgFiD13bCvNippi5kLE/MdV8WSepUiqEXF2yWiliGoNrv7YVUASqU
DAAYio8wiIuWA998KjMEa+kn63xlcWbFKuSFzaUz1O5+W43+uEKaIX1lt1I2t13wvMivKxcWN+xw
AjWMbarHtqxuTSVHPablZNZm09HVS0sdetRTpKWjeDUI2IOzICAfzAwetqJqgBH5gULcBrkg+pJ6
n9MMaaNEnUvTu8agO0SyFSR1I1W2J3GJ/Osryr4H950WaVqITvluYR2mjve1nXyyj38p/wBOKKim
atUmmip1kL09WQxUE2uq/T2xKTx0+XUrwzUwMsmkpICdSWNz1PcG35YSosvaR9E0RjlK6wXU3Yff
bbDY0YmqQEBIeQqna/T++J6kyupJX3HlD/iaxY44xqc2CnYBfr/vg1VG2XyzwMwvHIV0A3tcX79s
SMOTSKomWJljAuswFrext0t0vhChy+bN6mpq2jaZC2kOQDqI6nFOuO76FuiWy6jnh96mppKl4pJI
wgBuGtvhtUZ7JVNE1QeYfW+4tiVp8tqaWNlijkjVtmCCwOCjIGa16RiP+Uf3xTrhdsvWOdUManOF
dSV1aSLG4xERSa2jjCAE2XdRfti0jh4sd6RvyGDpw+sLBvhSGBuCBvfDWWEeCMsM5cjPNllyGvpl
u15KZXsSDvhxw4tVU16RRVEiMxuQjWtiRqMpavdXqad5nVQoZzcgdh0wvRUH7umEsEJikHQqdxil
5FprqWrHLVfQZ5tPXQVUU9TKZYmSwd2BKgdvfCMHECRGrQMzJNGYyLix2+uJf4OGQXkpQ46+Yk4O
lDQLuaGM/wDy/wDTFanGqaLHCTdpmbR5FUyOgRYjv/OuNBzCmek4Hp85LuWapEBZ+6spI/UHEhyM
r0+bLozt2B/tiUTMKWWgXL3olmotQfkSboCNgdx74lkzOdbcEceBQvfkr/BdVmOVVMUlPO1PztNn
hlClQe5HfGi5rxNUZZmqx188tcy6VM0h8y79yeosMQdI+VwMpXKqcEdLNuPyxZqfMaOu8smWRyMx
1XVdRxkyLXLVRuxrSqUjKKnJqGqzfMCk0vxEilo2QhVDE9/a2GFBkFRlOd0dXLypRDURNZ3BDXY/
2xu1Hw5l+YsOXw3JLJfQCikH6bYnqXwxQyKE4PqpmUqwJLGxHTqe1zti7+4klRV/apu7MqGaGCjz
Khmq5GyWvQrUJcAs3VRq9NrDEJQQSj4HI4CBS87XqWpJDFyL+X6WxtGccEJl/N5/CpjIO/Ma9iO/
XrisusWVTFocjjgkBuH5YJB+uKYvaootePe5Mxfj9VyyfM6NY1C81CukWsNx0+2KjlzvzWK3vbrf
G9VudqrOTl8F26kxKb/mMRUubMzEpQwL9Il/tjfDK4xqv1MGTApS1av0MnLy6gbtf1BxOR0fwuR0
FYQedJI7j3UMRb/6Ti8pUVNU2sUCPb+WIf2xHy5i0VQOZSRkxkgKw2H2+5xJ5NW1EPKUd7IeXi9s
5zKF+SsUkmmMlWJY9uvriAzmoOT50/K8psJFt7j+98XisrssWZHp6KOJgASQo+b2wkuZQFrimjkP
S5UHEYtQey2LJJ5I7vczaKablRi0lrC2xwqpqrFgsw9wG/rjYco/eGayLFBSxon8xjGw+tsbpwB4
Z11VTE/uOOohCmSWRnHmsPcevbEpeKUP+JGHhNX/ACPEspqHZiY5WPUkqTixUeWz1FLTCKO8klO5
Jva1wQLntj1LxPw7X5VLKY8ggWIxm9O5UsoBtcfn0xlGYigaZgKVaSXoV+nbEP7hZFxRL+28t3qM
14TyrMUp5nkR1ZlBU9TpUkH+hww4kg+CzmVUWyOiSrYdmUH+t8a1k8lHR1A0QmWQ/wAMR69sa5wb
RVVYKaKHIYUptkUGGMnbsSw6Yrnn0Tc6uycfD6oKOrg8eRySlSFRrHrYbHCNZKQqApsL7acfQ7O+
GKtMsRhw7DFC62UxU8exHfYXxQnqpqKZoajJKaoA7PRxk2+tsQXjd70fqTfgtq1/oefOEFWs8Oqq
qaMs1BEzjyjoJL7dxsTe2GtLx29RljZe0YjikmXzGZ9KDUCNrkdvTG012d0qzOv7ojiVrqyGEKPf
oMHoafL8wNo8npyW7fDqwP6Yq8y25OPuXLC0klLoUPjfimrrvDyojqK+eaupZxLGstnOgkCwuNti
fyxn37jqs7lkr66ehSqqT8RK0sdiWbc7KNvpj01FwkZoHjHC9PUwPs/Kp1ZW+o74SrsuraVf8Pwm
0q2t5E0nbtZrYUM3lqoIc8Gt3KR5+GYxfu/LKNqhE+AQRgqbKfNfYH+2L1QZ5JxLVZnURy3kpKJX
DwHSp84AUnr0JG1va2JHO+MjlMhiqshlonH8Ekem/wCmK5WeI0M6ugpWCts2kix77+uG4yn/AMRJ
Rh/y/QyTiHiGozmoNRLZCL+QOzW9rsScTs1Io4UyiscmL4iN3LE9bMQv1G2LHJxbTbhaVYl9OWpH
6DDOp4sjlCjlQtoFlLRDyj8sa3J0ko0Y9CttyuzPsqoYVzumNZKktM8wEixsQwBPUe++JfOc2jp6
uSh5IaKmcxxvqI2GwPX0AxOTcQa9xDER6hBiPqc1WW7NSwE9SWjxY5OTtop8pRXpkR3D9Z8dntPC
WYrID8pII++IrN8ycVckDll0bA9b/niYeujLXWCmU+yYRkrA/wD5cAH0xYuboTi6qxLL4xXZPW1R
YmSKyK17W8pO2KpLEQWPMV77+XFsapuCNEVj2GG5dQf8hPsMWwnpvYpli1VuRlHXtHCg6aOmFEzB
nqPKdLbm/cnDx5bXPIUfbCRlB/8AKXDtPoLS11GmayTU1QI1Yge7HAZNJ8VXFXGwRmuT7YdFwx3j
U4EBT/5W/tg1KqoND1XZG1FZLBOVjcjSbXwouaPpIbe/cDD1wo6RfphFiP8A4YGHafQWmS6hqQrU
UdVITpdV8tzue+I4Vf44Zl1IDfSdtXscPTb+UYKQD/CMNNITT2G8tas7SaYEhQktojJIUHtcknCY
MfTTt9cOTGgPyAfbAGGNjun6YlaJqT6pMQjniRiOWSOm/TDmKopwRqiud7+YC+E2pYmtdT+eDCnj
PbCeljWSSVUh8lZQxyxuKUuVIJEjAgj06bYjK2o1VVQYYxHE51BBuFHphSOkSMkqNz674VC2+v0w
lUXaFOTmqqi2ZjneTrBnQp5HaSZlNMUF1ACjc/e+CZfJDmVZFUZormmhty6eErdm9W/tjSpPCSiq
6oSPVSyi4azaSCve/wDe+Jik8FqOln58pk0RsNUUgQqb+t1uBv2Nsc/zMajSe5uWLLJ21sZpmc1F
nkJp2op2t8jqQGS/fFejybN6itVzRyyGGdpFd4nXmbjrYW/hx6Oi8OsoXd8opkkQhSTAgMfSwJ3t
cnr74eweHVEgDpRGFSxFxIUI/wBJUEWJPS+Ko5lBUkWy8PKbtswCrgzXMzOlYnwFJNIJJKenhkXW
bC41EbA2vbFpyyrWOCGip8vp4I0AVEtY/wD1D9ca/T8CI0oiFOygeV1eZyxKjzDTq6j0wE/AtIKx
len30akcLsR3t9vviqU1JUXRxyi7szyKimsGMVNGb/KZEv8A0wD0s0nVY1A77n+gxaanhKlMh5CS
abXVgCAbn1viOq+E3VnRGbUATpO+wO536YrUUy+2iJ5JHXkqOtj2/XDeWJFFiIie5AJt+uD1WT1M
DOtvMuxA7Htf39sRVRHUoFVyBe9hf0xNYvcreT2HEjJq1FFPbdT/AHwiZI0uABY9rd/zOIySWU6t
9hte/XCL1Mh3IIPvifl0VvKSzToDfSNXY3wg85YmxYewJxGmpdfQe5wVqxrlb74PLI+ZY+Ygi2/5
74LZdtr3wxara3UfTBoqhmuB19cTUCGsm6Mqeijb0GLjkDAypbSNwQSMUalq1S2rfcXNsWnJM5em
nDQoq6js523wpR2LIT3N44DpqeSqAMluYLsFFvvf8sbtw3k9FHRmIrMoMYfltJe+3X/v0x5l4O4n
r5HpUWSCFuaDdohfSOtrn+mN54b4vqIis1e8dXGxKhIp1BjYdNa3PttYD8sYpRaZrUrEeL8qV+bF
HDK7GxBiW+1uh99hjzzxlldTLLOojeGKFrEtsT9sbvxjxTXVGWrI1TBRVErssgiYhZrdBc33N/bH
nfjWqrJijTtIqlm8zPta4uLj0GJY1uKUjO81hWnYHUxPTfEejnWtlsD3wpmZ0ytaUsb2FtywHfEe
KgCMeYrJtfa2N9HPlLcs2UCWadQAx07+Q22vis5/HGlXUaDcl23v2vicySvLEa00s3yM1xp+nY/9
cVTOJpGr5zy7EuSbm+98NLcUn6URkjszgAbDEhlVJNNMqohN7YjiS7/Le/QHFlyBo1ZA8RHbUCQb
9sTfBUt2aVwLUZhQj8GjR9rKGUEsQfQ9sevPDd+I6bh2J/3fTB6liGaJB5Qdtxf09MeTOB66GHNq
KSbXpsbJdjbuL+g/3x7J8Oc3pqiCOKGBpFZQ8kZlsA3Yk9r2P5HHOy8nThwZ340ZRUZVUnTQxqZF
BeoFh03bruO2PIHHlDKmcTIx1WYrzBte2PX3j1m0ktNVSxNETG4ZdKMzENYXBPbHkriOqNUApS8k
bMWdj173+uLMF8lWXihhwxTlqyOPmpFfq749BcMZZmX4b0FcHRCEYhdQ+u+MEyAoj62s/wA2m++/
YWxuPhlWzQIWjuJTpMYIuG2ubgYeZBh4NofLuKaPKkhbNI9hqiBiBLKR0P3xmoosxmr2aprlJjuC
Iltcg9N8aNm3EFQcsXmSFZmA0kIvQC/UX98ZfmFXNHXOysE16iRGABud/vjCkaWyncUKGzOUc0Oz
E7HoMS/CNVJG4jilCNsCFBsbd+m4xWOKJRUVYAckrc7Lvf1wfIKjVNHJIjmNDewNr+pNsatPpK73
PSmQ5zUpDDGFjl1gBlZAVG+xB7n2w44tzgCicmQIwPQMNmHe9sUHh3iArTNThXcA/hogJuQL7G9v
+zhpxdxDqhskMdRARZyoZgDbp6+3uRjO4l17FV4v4trqFJllnSp8tgkq6gQe+/8AtjEOIswo8xkP
xGX0gkJJMkI5ZN/pscXXjDM5Zi6xzuEbdQg1XBPQe+MvziRlDXZ9R3sSLAHoPbG/FGkYs0t6IfMI
KLW/IZ4R2LecfniImpZCfw5Yn373Bw4qZGS5Rwp379fthr8WQCGVW/Q41qzFyJPS1IUjlxtfrpBb
DJ2mUaS+kA/ykYeSVG5sDHt164Seplk1ebmg9bm+Jq+pB0MWkcA3dTv3GAuP/wA3+VsKySLcao9J
6XXbCZSJj5SAP9RxaVhfJfe1v+/bHNy7DSw+6YKUcEkRq9vRib4SeoCghoQD7k4aRG6FdRv5XT77
YKJHHo32vhAzqQPwx/6jjuegtaP/AOo4dC1CpltuQPuuDLUx940P2OEVqLHYHT6BjgfiFYWMQfBQ
tQs88RWwAQ+y/wDTCRkT+f8ANcJF4z1jF/ZjgfwSPldfvfBQag4dT1dR9VwFgTYMh+2CARdmt9b4
HSCbDQfTzYYrD6L/AMINvQYDQFO4I+xwHJY7iO4G+2+A1lP4SO/UjAAYFelyPtgVCfzn/wBAwU1L
EEEX+pJwIqAesaHCpjtHAKTYMP8A0b4Py1A2lj6X3QjBDMoG8SfTf++DiojNvwAB7Md8G49j2TQ5
WJjUwwonMOmVGgFlSMdDct30m64naPKJaingkmVIlzGM1FMrjSG0quxBOzHYi354PwnmNXFT1b03
L+JdRA1LDEIXRb+VRrNmLG5XUAdz9MT3C80VVRZM607yZZWy8iFhZRHIbhWck36jRbYC+2OFKzvo
c5bkjV1HFPNSOWq6vkTUrR6niVCyqb7BhqA37Ak9sPIOHJ6OIrWQ8xqOQykoh/Hjb5dBNyWWw9bb
i++y0eX10+aVWV1eYTw1boKqn1lWjqE811kBYgAFlBse69OmHVFmYejhzCSG9DCWoc0ppSJIYCCV
dlU73V+v8yFjY4rJDZeGkjmpwqGskkieJmAMayx+69Q41W1DY33PpF1HDSTThWaOOieMBpZDdZCr
EBDp6OpB3uL9xi+5hl1XRtUURPIqI7VeT5jVsJEVdtSXvvp3uGJ1I/tcQwjlp4xmKU60y1sLQVOW
OgEU7qN3UdP4gD01XF9xgGUGfLAlPMsg03NpHBYcp7XUsoBsNr6rYrWY0MLwaWqGSREDyGEA842+
bb5gbX2N/bFuzxHinFNV1EbyU8gjgkMwQxxtIF5LkLqZife9gB7miVdE2ZTS0dFS1D/EOJYaZQLx
oSbsCRcC5B0k3HfqBi2KIMrtWKSiLLGw5OkswVbsWNuoFgOvfFcqmp4naOyWUBWa2rR13+1rYsE9
E6SVEbpLTVMV0aQRsyABSDra/ka9h6W62xB1eTmipFIV4pZlVREGBY3tsNtzbfscaEUSZXZ5VZb2
udyxPUAd8MJ1umpSPMLiwxMV1LFRycmMc1ldlk5Z1Oq7dug98R7qImPLTXbuW1D69MWmdkY8EhAY
mwPr2w3kiFiTcD1tbDpqgRyoZLEG5C9mv7YayzGJyBGwJN/Md/1wyIRmVVAuL2uO2CKGAvfSe1t8
CzfiG/mPba2FI5BEqq4Kk7ggXBwyI9o9UQ8zaRtci32sMWLKJHPJV1YKCzfhLdj2A23xXqJ+YX5j
JEi72JsW/wBsWHIV5s/I5sSpIu8chHTudV7Xt0scJ8E48mqcDZ1Q0GbxQzyhplAcyyoG0gD+DSbX
+v5Y3zIsyq63h/MKoUcsao6rTLDSrHLbcgC9iep8x237YwnhXKXzKC7Uplamm5d2qVgRlboAYzc7
jckHqN9sbNlHAIyxIZainra2rii1R5TFOYzIlxblsVY9ANxe+MU6s3xuiv8AFefKKSrapy1jqKOi
lLFmv1OkXsT12tv1xhnFecwxPKY0SB1uWgUkL79R19u+Nj4zFR+63rWq2M9O7L+6oiz8vzEG7A/N
7Gwvewx5/wCMXy6maaOKntPzSURmK2Hc2Ox9PqDieJWyvJKkU6tqmmLAWJuTYHYYShneMtruB0vg
1ZUKRzIgt9PQA2XEdPUhUVQ5Bbe4Fh9cbDntlgpM6aGKQVGmaKQFSpHmv2t6YrdbVCdmYggk7rvY
YI8z3LhJHa3zA2thi0ofYEnuVxKMeonKx1BKisCwJXe5BtiZyyqeSQCMdRtrbuNh+uK7GCWBXYi5
v/0xIUNRcAsGY6rBl6Ef7Ww2gTN68OC1LVCoSKOr0IHdmbVoPYn9dvbHqXg/OJo4C5hElAjKpmgs
CrWG56EWvbfHjTgvi18upJJPhGnAKxOIxsb7mxHtjdfDDxqcLUUsNPIlM7hJZKkl28sZBbVe6jVZ
yLdL7452WD5OjCSpDrx0zjiDMq6qRolXkkRzFYw4CXFrdzY6R9ceaM6p6mapqddxqcEELa32++Nw
468R0meEtUyF7EioikV2kJ3Z207AkkjT2tucYrxZxVTVVUyZcJY4+gMq+Y9zt2N8WYU0qohla7jO
jpS5ZmV0Yd06g362HQY2rw0zApyZWCs0EQa6qboL2J29RvjD8kzSSKs5ogSZFAZlYXLfT741jgjj
CkoHgPIenqQunS1yHDAbAKDcHe2JZU2iOJo1+rq8qakmrpaxJpZV/AV5mRyt7EFbb7WN+3TFKzCq
hrYal4JWiWlbzsxPmN9tgL9cSfE/F9Dm55EGYtSfDoDJQiHSYz3DXUErbuCemKVV5tl+WfEVOtqs
mXyEvoFrjzaT0G3U9cZFE0tkZncmiukVpyWA1BgPKDb1tuMJ5UlUktxNcyEPqYalA+g6XxG5vxbl
+dhZXzKSeRUZHQgFdROxBvsB/wBjHZLmtLLFyzI6HrEdJOoDqNKm/r1xoUXRXqVmz5bVfuylp2Dc
v8MTWgp2te+3Qna/r6YZcYZhBUSiob53UK8ellYi297nfsT1J/pCZVxHNHU0YpaaapqkIIfblqp7
gEWNr9b29cOuK82ppaeNqmakrUkmZEl1aGcgAkFVumoWPQ98UOLsuUtjLeK6l4qdUePkCZt0C6Sz
AWAuTYE9bdsUTNYzOWQtpBu4LAn6gEC33OLxxdmtG8rfCsjQCJlEUm5YE7tquTc7dMZxmtZCkroE
lF92BFyD16dB2vjbjWxhyvch6uyuDcDbbSN/YYjXPLIuQQenvh7XTps4vvdmANx7fXEZzFQdFY99
PTr/AFxpSMzYMrKFJ3J98NZLAmxsBvhaWVSASvbbDV5tXS/piaRBs4VD9GIZb2scB+EwBKlT7YSZ
9xqAvgyna4Nvc4mV2KmkDXaN72322thMq8Z8xB3tZxg0alm2OxPS9sKSM4bfzgGwGFfQlQgxiJIa
Ff8AmGAFPCdwWv6YWOgmxupOEzT+UlXDfTDsi0JvR6d1XUp/1b4RCohu0bLfoS3/AEwo2uG/Vbn0
wYV5TYqr/XEtyLSEDLEoFomJ7nWf7YKZUv8A5Vx/z4c8+CTd4grk31KLf0wVqaJ/kkGr/UL4drqR
p9BBpUH/AJS/+onACZCLCNT7gnB3pJIyfLfe9x2GEmBF1tZvfbD2ZHdCiyqvSFQfvgwqCosEG/a5
whqbYajqPTAM1tzufW+CgsX+JJW5RCPpjlnU2ZoEYfcYRDX/AIRv3wBYAi498FBY6eaBjvFo32sb
/wBcCeTq8r6V9Wi/scNDcC21juT1wKkBdhYWtqwUPUe9MkyXM24lzRJSYfiTDHT8qbQZQkZN0Av3
O/8ATEpQUGXU/BmZR1lRWUNQ9XPTPEBZgJJCVUFhoLLe+zW9xfaCpqulfNKukqR8a0FHAQ0LFpTZ
9K2W5JZSDZgLD2NiXXCPEub03EWb5NSyT6KUCujiq6ghxBJYNd28xAa47m5sccGmehtF4aWmNBSZ
29FUJMpaeGpe8cjWsGbluRrVlsti4BO9jYXn0r0oNUFY5oKvMpJXhqY5AbDSBci3mdQB0PvcCwxk
uQJLmE0PCDzM9FVLyaOoSqF3CsNgWO8qH+FRawBF98aNQ8JZjltJR0fHdPy6XnXyrN6SccsuQdAe
RfNFNpDC5IViDY/wmDVcjTsNT59mVblWc0tLVUcmY0RYxCKnJaQLGURyjNsjEjzBtyN/TEPnXFdR
NHRTUtJJUmiktmNCVZZV1R6S5V2vqBI3HzAGxOwxYc+rqzK1WPP3hqAkwSizrLohDNTq9gBOyhVX
+EXQkuT0FiMVWoeOjcrxHT11Xy3ElFm1KBA57kyE+UqD1JuBtdSL2KGxtNmNVXZXPSVAizLJZ3KJ
RRECehk3MpCMbqCCPmIK2uL3xVaqJkyuDnVXNSAyNBXRjTPG3VUc2BJIVgLfNbe18XFKJZ6yulzi
GOWPlzvSnKAama7C5UNGoJsoAKkbWuOxxQKyprc+yiOkqBPUTUBWSE0slqiOMPd7lgSWVr2FwLX1
EnE0RZVOIuIZ63NXrFCRxyWGiOa9wF8qsvU3I6km5O52xWcyzQGB6YxKDo1yBRca+5IvdL3F9JI6
WxM5rH8XmFZm6xxyvM/xMUUsYE8KjyjSbkMo3uALC4xA1QhpVqFhk1M7CDRV2EsjDcFGZQ2jptbc
Wsb40xSRnk2Q0riQRtGxkULeQISZAdiVuN+ncepviNqRFG8ixtG+klV5bFtdie4scOZVqI5VZ5I1
5ihR+GV1AdtXe2/zdb73xGzyqJJKcFVidSLzJfb69va/ri1GdsGS3LYbtYBjY326W/XDcSazcC2m
4uQTf/vbC1bK06fiLIseyhRd1T2BG9sNCWMmkAvvayjqPr1GGQbBkcu3mIcjqDg6tqIK3uW2Ci+/
phnzWJKqu43ALX/TCgL6dILB/wCUDYH2uOuHQrJOIjUOZeHcFtSb2I/T8sW3I4aJcuM6SRr0KG5Z
Lg/zAMQ3tYflinUtXy6yNZmeWRioeQXOna247YseWVQoaorSSmfykMKclgB/MVP5dT3xFosia/w1
MlJBW1lRQwUcYiieSIIsr23VW8gFuu+46g22xd6aikkyqszKhnhyiZ6cGUUwkJZA1gQ4Bs217XAG
9ycYvw5PDRzRVlNA1ckql3BiV44h0uYpbayOvlY2xa+IuK88gpQamvX91oiPFSIsaEjoG5TEOD62
P274zOLs2KSrciOLOJFrKKCmFTDUSwSqJ3ifQ0htuz6QpZhYC7HuCO+KVm2c04oqdpmLSICkSIhk
RIyDspPT+pJvibz+ubOqmSaiUTCKMVLur3VBezFmYB9uunzbj0xndTMJtppI3VTZOSwJcDc+br1t
1GL4R2M85BKospbVqZAdYN7G1u4xESzNUABYYzp3824woagNzeSj6gouri+/19OvbDJiZFIldpFG
+gX2xckZWw45ZUFQhkJuT2+mE+YCfNd1F9Vv0tjo7MpZXBVxYx6bafrgryqi3sFNraQ2xGJiAiN5
haw29OuJWhdg3LWNXkFiNFrG+39MRIkVbiwZiLA26DElT1ZgsIypLAAgkffCYIvWQinDFUyx2bQF
miikIJFrksOnT+mNCyCopMyqZpEoKv8AxUbRMssS6b/6WG52Uddr3xnXB/Es+TVESiVJATcFfNy7
ixJv8w7dcXvLfECuqaeWKOapAuxqecylNRB0aWFu17AHrbGaaZrxtUS/GtFlVK8xpmizDMJ9HI0D
/LXT0uQBcnv0372xmGe1DmSEGjgpZGJEjs41ajbVffpi8cZcWZhlTNaXkq5DsyRiNi+n5iCN73J2
2GM0r6paupdI35kEd5HeQ7sSL9+nbBBOtwyNDelqjTzaUj1pb+A7E/74u+QZlJlqRAwLMwvqV0JR
UsNyfr/98UWDMEFtACSsL80Jq0EH0HXFs4bq5cykQSrEasBiPOAkyaf4CBa/sf64lJbEIPcvlfHV
5nmgfMU+HqAFm+IlLFo0sAqBlXYX7sCN9zhPk0tNHHLPT09RfZTLYmTc31New/72wReKKaX93/G5
HHGgOiSqR3jAt0NiWCjbtsSfthpmXFdb8RPHSBIaaVFWCRo+Zr9x5f6W+oxmpvY1WuRlmIaWuYRZ
alDpktHrjUKwPXYi5t64SpKf4+op4wtNFRvKVWQNr+7WFxY777YSreJ3rnWGOOOGdkCzuGLWPuRc
j8sOMlqlphBNIkEckt1WAg2HWxJ6Fj2v69MT3SI2my4U09EXp4ZqSnmp0nCytAyOkp/n8w26b6dj
hbiL905lnFCzUlLSSNCyqtNEgAkBO6Mm+4N7sLXNh0w54afLosvrqha/93JS6ENFVzBBM5FywVgA
bNcWIuNiD0wzzqWkoY50fK6u7jnM8MIMCLtsjsVXTY73W/frirqW9DM+J6WDLZTHHokjLs+ouuzW
uBsvX20jFMzeOnrnZ0SS5UGQMNRB9PYADtbbri2cWZnHI8dSY4po3OqnKwaQbG29za/XfSf6YpWd
ao52kaUBX7wyXubb3J6MdyVA2xshZiyUQ1SVZGTWRouSNhcelht+uI0sjLsuldVxpG309cSkxSCe
7KUe1hGR8p731b/liPrRDIoYdSCbH+574vRnGjkkWA3JtY+mG7ame1zYdPfC94y7EkexO2EXUAC1
rdduuLEVsTN+o2J6euEwxDbE39L4UYDe3XsOuCE3K2B+42xIiGeUqfITc9bnB0qCVIO99hsNv7YJ
uwG4KjbYXOCkGRrFrj1Avg2HbAexdjf7Df8AXBldbgX2He218A/mAF9x2BvgoYBb7W9L/wC2AXUc
RyNpRWVWueh64M6QujO8RFjYlTthvcHqN+2/+2DAaE0hgCRfzd/sMRHdgCgieTSJGA3PTHNQqtij
uG/LCgQu9w7dOhX/AGwRtcS2B0m/U7fph2+4tK7BNTISGdrjoCBtjtZ0+Yg774O1RfysFPe5Ft8E
VkYEarEYYAcqGS11A+gtgjUQckq1gOp74WSAupKtdfrgrxlTulgO4wWxUggy7bdjcDoBvgvw8SXU
uR+QOFVC2JuQPrg5dXIB04NTFpQmtPACLuQT0s18cYaZDYuT3sQcGMCM/Y/8u1sKChiZCVqiCOoZ
djgvuwS7I9qVcdPyI80yGlnGd5eGnR01ywSpccyKQg3Gyk7MSD98P5a6h4qymm4jyaoCZmpNZTzw
h5uSlzq1+W5BUElWW2+/TDHw2yympcszXJ80Wpjhgo+dT1sRjKcwqQhb+NiDuAdrbfSSpM0Wu4Bq
Mo4dq6kyQTpFVZfX5QsOuxtMIo4yWQmQggAkn2xxmjuln4hzTMuM+FMuzavyCPLYFmhqIsyNYCli
VEcscvXzCQgaQG6jC9FSVmd5LX0XGEbVKSVS00jmpeZRFs0cqwoWMQAOq7DysLnrirU3F2e0GTyx
59T5vlEVdUtDTNM4aKeRwGVg7gmNhZrK9xtYHsCzZHmnBud1Wf0lCmZZXWU3xdXTZjTwUJWZbBpo
Xl3mNr3UlT0tuQMRroSs0ety/NOMMukr4c2XjCmpZL0tJHRKylU2d5JnVQkqm5GkAAjYjrimVfEs
eaZXURZfxBXzcQTG1bl1fUSwJHCjHUqI7kIbG+tdQ2uCeuD5Lm/76ihzHgPi/KUr6FVNTl0UbilK
MGPLmgIWxBNw4IIN+t7YDM6mu4lzun4Xz/LcmpsxmCfDzUVUsgaZWLXSqVQY2XSpKkr2AvfCruFk
HVZ5QZLlElBHR5hkVO9SWWuRzDHzDpWRRKrFX1qBa7KRsbA4rmdVlPl+bieLLky7KJGK/vYVUjzQ
pcCMPL8699ViUO2xxN8b1f7ry3OI+LqKkrqWCeWV62KjeoZbnSGeMssa2FlJUvc7kDFLy2tky2Wa
rpEkzemq43ZKnMlVJ4lRRpMJ1EMAQoCsQACdx0xZFXuQk96G3EOdU9blZoXioMzoAnME1NT6JhsL
/KQsrKbXJsTc4pWc0sRkENM89TDGddVDUaFZXHXYElbW2uevY4c1VVU5hDLJ8PO1fLKrVUcCHksV
vaNlJA6BhqvqNjYkYYfvMSzUpVBltXF+JJT0yWkVwxG7Hdr2O++NEU0Z5STItJo6SiiUU7LVLKWE
btcAk7HSeqmx+WxJG4G2IfnSpEWKFWllZdaAkDa5A7D1N/bElFN8U0qzywxTxNoiqJdr9xuQdzuD
bviBqb0k08b1XPh1nQyqbL66R10/UYtRnbCNMAr6Q5I3BjvpYX9O3574ScMKlo1ZCw81ojqAB6XN
/wBDh5ARC0kwKSixTkyagGO9mGm19PX3v3wzlk1SHln4jRa5cBLXF7D0/O2JogwzrNSRHmvoKhWF
iLEddit+2DU7NP8AipoGluofc/W+Gsk688sjRo6bkst9vtf9Mcas6fOhhc7hmUD6W63Hth0Kyfga
pEL82miqFYamBULIB6322GJjJ5mqaZIaoxSTRsJESQNGyoOg1Dt9fTFcymoCzRLVqnK2tL5tPS1w
SRb09MSeWRGV1pvihUI8g5a0huws3RwP6jb1GINFkWahwtJWcQ8RGpoI4p6mh1Xo6+ZWVwRclWO6
C4vq6bDfDziHNKzi2vjqs0lgqJqSORlpa7Mwyago1tE25II30qT9r4pWUx5fUZfIsfJzCRtXKqIo
nE6gG/QeW4t239sT9E9b/gqCNcu4iWZ+XDU1oQy0w21JaxK22B8gPTe+KWknZoTtUVfOeIKZKiVq
JQqRyaohOL6lsdkKjoD/ADE4gaqoNfLQwU8QirgR5JzHEqoATcybb3/ricnrKeetrXqKqLmxF1NB
V+ZIRv8AJuO/fe+2KrIzyZjyafmwMRqZGQAE26rYWH0OLkiiTGOYVE6SM11mcs13BJB3+bULXGGW
uYTEhQfLfUTcjEimXVEskqyGSMQAks+6N7XUXPUbHDUhZnCyyJHINiQn5A3uf074sRSJxzNOXewA
6eRgF/XCWr5gtgbXsDb9cLRlBEwF0N7kKNm9BbfCS3JVY1IBJuQp0j6364ACxnQAZFNx+R9PrhcM
vKa6MGG4IF9/f2wVXdJURgC5Au3Tr0sMSNFTQ11bIs7yUisPKZVPmsPUep74GBPcNB8wIEVSKPRc
GUKQgFtwLbk7na2LdlHJoaySOsoKzMzDZY4KYlHWUC6ynYMBfSDcEbdr4puSUiU8xb4ULUxvqjM2
nkxEdyQd/p74tNTn82Y0FZUNNNBKZNctXFOalNyAdFx5R9zYHFMudjRHgSzCONcvE+ZB/j5HKzBD
d3e5J2O9uh74qa6EWynl3NyhBXb1uB0Hv3xYpuIalsoegLGrjiQMDYTogJtugFwSfe298QLSVjwG
Oo5UAQBkllkA1ei6FHbrbDRGTT4CRskcbtUTcpdW2kjV7bYmaOqpFallknihXTqWSRtKM3tcHSft
ittD8TqZpY0ubBWJQMbW+t8HpUJqDFHqQAIjKI15igdfM462Oxw6sSdGiQVtfNRw1AqHq6RRoEqs
iyIPRgx8y/8Ay4ZZhmrpSOj1UTQ3UqIBeKSwPzaioB/5b/TEUuWymT4qPMjmEcI0JyoNMqjuGcix
Ht0wiCBUaYcwkqEkZWblRI+m3UNcgAfS30xVpRbqY5pamZJElSbkK4ty6cByPqwA/LfCwnqoZykG
ZvV0wZXkE66NIHfUewufNbETVSJT35sSiV5NKIr8ktva4Xcfrh3l8lXR0bQvExR9mqJyQlgej72I
/IYlRFPoXykrficrmV5Wl+ICuaadAYT5ratfMS++1je++2Gmf1lNmRlo8thZI6kK1ZO2qOMbf5ej
UFAuLi2q/UgYaZRDS1eZU8VJJlbVMy3MUkgihuRuCVDWJtfcD11Yi6k1NNPW0lFQU9VPGC8nwEhc
qoa9ywksRcg3I6YqS3Lm+5H51UNyntOJIEXlrCEM5i9DrIA3I2FyL9emKvXZizmAKtNGssermRoT
KWBOxLfKemym3Tvh5VyVOYViqeUjqgUwRMkagX/i5dthc3Ygn64Y19HMKeMyRGmSRiyWA/EA2ut7
E29d9z2xpiqM0ne5EZrmLyzFhIqyjckeY+/oAcRksx5auQAP4bG7frh1JFHLMDzBCjAknp9r+v1v
hLRoSVkcRC+507v9ji5UihiTzWjv8pI3ZhdvthF5bDYaVvuTsTjlUM4CqbX+Zu4wiQpazDUP5r+/
3GJJELCs1n+SyjvjuaLXOw9LYF4kU7EMetgtr4BlsAXJv0AB2xPYjuCHOi7X0job9cdvpDBSq9x6
YCU6rBvUdLbYBtjbyi1+o6YQwoYA6bgDsE74H5evl+mOBWRwb6RbpghOqQEC626jDI2CGKtewUev
U4Wu0akhSF6lmG5wl8zBQN+t2PTCjoq2uNbEbb/7YTGjkme5YKTcdW64KzHSQpLX6kE2wVkQHVrG
r+mAaTWB1C/Xc4KCwzlbDRuwFr2uTgDqQAfKt7m//e+CB7L+HdVve99jg0bAjTYWvu2Chch1HXQL
e3QYMkkisVU3A369MJSFAAN73+X1wctpj2snv0GCiQeOVGY8wG49N9sKDlObqbEdBbphvDKqKAVY
jrcdcBG0brc3U4TQWOTCzkEgsO1jvgrAKQJEKjrdt/0wWFnZjoZVA2+a1x6i+FeZKNaPEpZdyeo+
uIkj2DwFUcOeFXGk+VUa5hneV1gSfLXqYkepp3ABkhkMTEIFI1DfTY+pOL1xhl9TxxPVZrT5tHRc
XUVEWpPgX01NSAb6KuViTJGPL0HlLX7WxjmdPnFdR5ZURUkeVZvSyyVVHBFFCrWdLyqwZSTdFuG3
0kdBvi88N8Zy8RcNLmOV0MDQ1qORUZgAZRIWvyxIzIj2sPKiAbe2OVJO9R14tfCXbhHinKs94Jyw
y0tBAtXFLDUUeaTGseCcNplUo4I5gsbsFBUdCLYqPClTSZDxlHwtXT1M+XyFBklXmJhEcsZa7Qli
ryO6X0izEleoGKX4f5DJlPihQUmaKIshzNJaymiikaELVRnzANGp0MQC2k3GLr438MwZpliz1MdE
kWZZhBTx1bNz6mIFlb/M5jSxodJ1Oqahckg2wUlLT3HqbjfVDvjPw+4gSaTijJxQ5fxY0vN+Coah
5DmdFDssUiKAo1X21LqJ0774kpsqi4xpKrIKXJHyzLMxjqoJ5qCmkMqyxXBQzVDxgFG06wIgAOlz
bGgcXZLwQ+S5pkGQ8SNUZk+Vs9PlsUVZW6LJoEsdRK0EelTuWAYi4OPP2SJ/4e5Rk5WmNRUyiH4q
aizNZmqZnIjeRhCpMwFydJ3IPcg4ira9x7J+xZMhrqLN63MeGM6qKaTOstpoWWaSVqpa9w4DsrKp
0jUUuD/MQCRvjPc8oZcizmKnMEtXHmE1RT08dYFAoy51xnQpayai4CaRa+ok3wutBk3DxznNRmop
8z+Ikp458yiSOWimWL5LMTJpJYG2nSR3Ftq5n3EWZcUSVNZlgJhq4oY8wmpFeKJ/KFvcBVezDax6
H63tjHfbgrlJVvyR9XVLQVPxsdZSRVkQ01MaqU+IUi2rTcKShuRddh1vfFTekrK+eSoFUKeqkikq
Pi4nCppDHmKSAt72O2+9rWOH1FlT8SZqcpGZypJRnk/CrCOaVVT5ysaktv5bkliSAeuIuSsl4brK
rWjSQmZXlE6oJI3GxK3v07rbsPTGlKuOTJJ38gamnaoqn0UsNNJCrLKFiAYDpqAOo2sev0xFyP8A
uxitQbInlBmuw7i+5264UrqqmzGTUlRLzb3XkBmKgg9DcfTDZppamYSztK8yreRlhSIWA2JNzuf6
4mkVt9gsmmEHROAB/Cqg3PY7bAnCfNdnVggjbT8xsSu3cAdfYnCUs7Lo5zNFGb+VSWZV3PS2DIY9
LKhdXe2hXcaW27gXviVEbOa8vMR5U0r1INrdupO35YfZdVPRs+o82GoiKtfUq26i4Fr2Iv8A2wyD
iafkzMQFO6K4RL+o7nDuDLa40zzwRw1kUbWZYRqZB6m46dtsD7AiQjaXKAeYRMXiEgR2UMrHpv5r
rv7HBjmZqJoZkjp6eXTqmE0TBJGv3uQQPoBiOLPWPK0K06MTqdEcszf6Gtb07YdrDShY05E9NXFd
gXa4N9ghJPTfCruO+xP0FXGmuorGly6sjcWqKYtyY1OwYEAKQTtudrnC+dVb0VJFT1ldQ1qxuFSX
LqhGYgjuE8xv0NycJ5Xm7/HfD5lya68T/Dy1cbuagd0dbjuQL27YRlzOogaOnlbLzB5TElJGnIgD
AFlJbcAEC972NxiFblt7EJmGVrS5jGHEUgIAlM0Z0wi/W+5B9+vth18XDBWLUVFZIZUReWAGkcn1
OsaQAPv0wareGkFPUZjJDV0cxNjSqFcC4+RmAXqTv7Xvhzn2YrUVcVZRRoKYKAlNmVUZnnAHlFgd
zt9PXEvYr43IfNatZaxowRWKRZrtqAPe2mwY9epxHSSzR1E4g008A2CTyLqI9dv6Xw6zWhlDLK1J
8OZVvcyBQARe7BcNOQOQh5sNUouo5PkGx3JY+vriSqiL5CywinBPLkVQSCysR7nYYbrUs7EBQFA1
IqOFbp9TgTPDDUvEuo3HpqVT63vvhN7w3fSXl9U6j3IxIiGNQxuZY2IAusTtY/oMSMMsFOy/hTPK
6m8ZsUXuLljtiM2kdIzoeTv1NvYk9P0tiVgqJcvElHy56aU/+a7rpO/frdfocJjRNUSPXzR0vPsa
qIGRIWEoTSN/LHuSb+n3xI5dXUtFSRyGjZGilaN5OaIiSBp6MCbdTa2IekpqqjCJS1DckSkK9AA2
phvc9Owv64dnTm7o9RUUjN86yU6BKnWdiCD3HfftitlqHlfns/wFU0VRK8DFOZIyCJpFBJVVNrsA
NtrDEWahhGgmedaKVbcyWnU29w3e3vhOqtGJmgqp6sIvmgr3KEdjt1Ptt1wm+dus8SLUyV8KqLo0
hjijAAGka/8A7bYEuwm+4vJSZazAU9Tz4+XpDqfxgfYg77fXCs8FLl0Ky14ephdSEqWOuRDfa9jf
b1OE0eKnIkZ44UBBEEDBmAI3HTbtuMGRoqIiKGkjrqP5maSMidb+jKbEjAA+pKxKiGNcxeStRPKl
Sz6ANupBBPoehw+aimhooqda2kaBzzAImbSF7avY+vriDizdYKEJHNVZhE89/haxGESj1Dg7Hr2I
wpLnEVOoZ305YekVASy37KSw239BiNMkpLqOBmiZcklKkcaSyDTzoZUqCR12BW9/zx0NBRiVmnkG
Xa11MZSVJPrpN1P1OGcWZokySxoySgnVU1dM8rHawAKsSu23bC0xiZTLCK3NKgnUof8AxNNf/ULb
W99/rh0KyZyCopKeWSrFbQO1Olw0ymLmMBt50BB7Hc22sRhLMU+My85pHeuqTPqkqGolaFLt5XEl
72Hcsott1xG5qaqmmpppoMtoGlWzPSRlyvuI22J/TCFes1PS84ZTEZSxdbwyLIfRzf8AO17b9MKr
dktXQTzGSHMaj/E1E9ZVsokMm02pv4jdd9It223wyzWZEnEaSy1FVG62kJJj0+mlum/YbbYGszGq
mipY6qrLc3yhJ4eSCdV7M6kG1tzuf6YZZrIpmfSqGOO6RyxEzcwqbHTfdQd+g3xYkVuRHSqquFET
O12k1mRVH5H/AGw3mb8IPaWU6iPxANIHrt03w4iHNinWOOS3fS+gX+h3J9sNWjmjZoiDBGSCSx0b
/T+LFqKREFiLsdSkgLdTb7euCu7G+uygdhYYMXFLUgM55gPXufoRhF2Pm1N23sbridEbO1qwITZd
9yNsF2U+brbre9vp6Y7mFwdJBI8uvt9sFAMI0kEEn3ucOiIcRaxrYqFHQE/rgoXUQQBYehvgOQQ9
3KkHt6flji1j5baf5v7dMAfM5nUHyg9d79P0xzsL+Vrg/nfBZBo2FvN6f9ccoNuhAPc98AHDyixN
ve1sGUDT0Bc7mwvgsUetAUB29scCzKVa9+lrgHACBRCzDUbel97YFUEzE+Ur0UDa/wCeAR9PUafr
fHajfRcX/wBPphbhsCSzHQCVVdjcdPbCZcx2XZr9BgwckkIBdR32wJjOrUSFPQAdsPgOQosl2J0k
9SDjlYt8xBUdidjgCQzWJ8v8wG5wZmVFvqF+wte/2wCCyTahoUeb+mFLqI2YMAQOhvgkQTSWN1J3
NhgsgWRtAYlRudsG3AW+RxCpMa9Gv1JwMbFXdQqpYWsuw+2ESQF+Ube9sEj1ModiLkbWHTCqyV8H
qrKs0k/etEtHTwZRWs3lSOskXUN7oY0Ukg6twCQLnFy8Ocuj8KDBX59S5jwtXcTSNHlOVvl8FXl8
cUZOtgZ2ujMRq3UGxJtilcCZk3h3m/DM4p82oZqirhoZayWpgpqaONlJHMqEVmsxHzW+UMBc2ONT
4olFV4kZHncObQZxxBTk64OFoufGrSnVE83NdxcKu2oC4PbpjlS226HZjvv1RtPE/AUXjDwM2VHM
YI81V1ky6py+KprqmgmT/wAxSoRfPupJ6JsdsY/4G5rmOcUHEEGe55l3CeeZVVGjzA5nUxU9THML
gqqRRiTQfP5EDFhYE9DiN4p8X/ETw9zjOc44rqc6z/IsuqxFlwqquTKixeyskkcOxiQsdWk6iLFS
oOLfLW8M5LWZrDkvigK7LpqyKvpMm4Ry45lOlSQWeSWqkRkiJOvU1iWFrKbHFSi1GuSepOVmRcR5
Bk/Hmf0tLwdmUecTZLNVGsY0v7vqYwI20KoqJNUokZfMLG23S+KdnU9XnNdlGTPVR5NS17tBDXSV
6DkTKLFSqFVj8xC3Ow9yMTuVZhl0PG+bxVHD+b5pV57n0lPBxHnGerDS1KsB+BVFWRNW19esBtrj
HeNtRwjlNHPlkPEGUVz0+sJTZLBG1P8AiORZpQwTmLsSQTawN79dCtNRKG7TdifiZwZFlNRHSUFQ
M2yt40ips5gpVo0qAABK7SOLyMp2BXYbXxUsoR8lo5KGnmeD4SVoqLLqmKTVVMFLiqsXK7G99BC3
QXtfEZkXGGa8ZZxltFxTm5hqaOm1UuYV2qeOSNQxvoJAIKqoBW97DY4Wp8ur/FfiXKMjyrNITmKs
7SZrnua8ukiC3a4YKvKQi407k6sWKLXpkypyT9UR5xFBm9JT0WcVkiZNnVIi1FHNSxR0ZOo6TzuX
ZrOCbkm9jt1xnL5jSzQVAiy6ChKy6TCwM8iHb5WP8J3tfoNtzviYg4gR81eV6enaWBwpgqFNS0wU
Wvqa3k9LdgOh6x09PVVNW1XTLz3lVmaJbqptc6T0taxsRf69cWRVbMqk73RGxTS0A/DlMVPI1hO7
BQpHXYDUBvb2vgj0MVQ0f4hMunUDCnyt1Fy3v2waCojzWI8iF5pbfiCGImxPrf773AwlMlTTUqOy
K8MZZDC0gvqsD26m3Yk4t3KdqC07rJUJDUAc03GpSBGB1BBG/wD98OqhTGUNOZGjjGoxohBa9t9Z
HfCLxRV8COqDUVDaUTSp7g3O9/p6YJmUfIpdUrOzOQwYzaiiH1Qe4vcYOodLEzVfEFgzpGR/AIy7
frbDiKtnp6VlEjyFLlfxhGzKdiCoHm/rhNo4GpoFkmNWEteCHUCB381ret98DEwpJFdn+FhLeSVV
DN22ax2P9cGwrHcUkxenjSGOYG7B6dQB0/ibo1j6i+HmW5lV5PWKtZS00iPIYzK7X03FrH1uMNJY
b0c3wJrp5DdpTqEYO46DY2PQgd8GRRVUzQ08dJDIGBSVpC00bA9NyCfyOFySuiczXJ8opaaKvoWq
YKhL82WngYxyk32a9rL0GOqIIo6KkX4NZqyWG0tLd3N7kgh+m43A3FxviLy/MhmeXtBVtVSTX5b/
ABFVZCL72A6Dp64Vo6mHKar4epgblNeWCKnYSMydLaje3TuO53xHcla5RL5xK2bZVTlRPKKWNVp1
rZEeRbN8nLHQet9sQ9ZTuzxU1ZyaFZ10lxABqFri1thc2F74ChqZ1zljl8NNliViAtHmTDTIAeob
re/YWw44gzDNKikSRXp5Yd1K08J7jc3Yknt3+2Cq2G3dsa18VTTxxU5kp3qR5QFUkgdBc3t2PTEJ
U01NLDJI4LTKTeSTyqLG23Y9vXBlBgaNkPLhAHmXa/X5vW3tgagfBTA1cMjJp5iNJbzDsdP8A+uJ
pUVvcbLSStGbqZIbADQoS5P1/wBsdArqoYT8qJhsgbUdu2ElqQ8wcCJhbZGBKn3O+FY5ypX4sCNb
nSqJYfUYluRDui690WOJTYysWcG/0xLpGpjBplCKPK7q4KkAdla1weuItKKorQzIhmKi5jMoRj/y
j/bCmVJHNIStSMvkUhAujmWvsdibDEXwSXJKQ01GImFBmk/xLLzSr/gkEHdRfyk/TthSsKRlZ5Z6
OBdKh6qCpZ3YdL6diTc9B74ZmWpDtLUTy8lFPLSmsV1X7htxf2wNHHcvUUNHzI5SQFkIa576e/Y9
cRJWSuXciqo66aCjpM3igdObVZjJokXrZFsbkHvtf3w1kaGMy6kWOIv5IabUUF/Qm5JxG51U5hV/
Cw1OXR0AW5iZ4RE6gdy4AuMKtn2bZXpoqSqWGCVwXaWmV3J2NwxF2H0wUGpD2lFXBphpyKHzA6uQ
jkL1O9tRw4kqYaS89PVT10jONdPPEYlIv8wIGnY9QR98RMk0VLPIGgSt5psRCxVWPfSB8vrY4kMu
NVC6GGoeGKJi3InClww7KG2v998JoafQfWrZYI6pDEaMDSIoZ05i37aTby/QYSyylC0T1VNGH1Oe
bHKPMBfsL3J9sNTVCkeSaCGpqJbjS7Uocr6gsu35YHVWZ+0MjpFFTC6yOsqRlwdyGY//AO2FQ7Hb
1LgA07RVMLNtS1KPER9VU3AP3GO+OzmlTXLLUZdTvvy6JVKj8hZfriPrWqBKIssheCAHeSRwYJF7
hbf7HA0BlpSZqqvWBfm0sLRAjoDH/F9+mCtgvcfZccynlMmXQHMKNRzHkqisTyv2Ech3Lbnpbvhj
mTUtYRHV5jVEG7DLwpCxNbszEawCD/tgK+orc5q2jjRY4Us3Np42hvcWNx81vpthOCjpo9SClM9z
aV5pzGLkbHe5t3vb79sSRG7Epsxo5MzlFJT1UKQD55SZ7DbYqVsP0wzMh+JBEqTuE1BIAA6qP5iO
39dsKsaPL5JoZZ5Yrk6KSmOuED1J7329MM5M0lrp+WwEjM1h8PZNI6WJ6kWHc4lXYhfcTWqaauLy
oJHXf8cjc+gtsdzhvWTSBlpxrTSQxTXqBPbp6Xw4MCQVSmG89jqDTiyAe3qcJS3UEw6qdLDVLe+t
vSw+9sTXJFjPTylMt0VytrJ1sfrhNlDkGQg9yL2P32wrJMszlviNQQALceYn2wR2cHSzFFPUuL2x
IgA0wUlFUgbX2vbCYaMajqvfctex/LChZEUlGBQWuUNsJGMltTrYfwhh/XDQnYNmkIa3k7EjAs5t
ZR5j0IN/zGCmRoyLnc9ApvgQSt22dz1YG2AAdXLN7i56kG36HBVfWbqTp/K+AcmdtJLaLeY7X+gw
d5LC+xPSxFv6YACyaUUeQrfe7dMckYLgC1j17/1wSMCUl7+UfKurv64O7Mo6E7736fnh+wvcEHc8
uTYGxstjf+mBKnWSQQe5IuMEVAoNr7fynYYKJAZANRP+keX8zhDuuQxJOliVNv4e+OkcECwAI9Rv
jtZVTa577b4ALzLEFVNtwvfDD2BJUfLZm+owCt+Ie56A+ntvgJFCoATv7rjotLKOoH54OgutCjjR
CzDp6WthJIwqi+563GBYqroAb3NgvT74VKncsQQPTe33wuB1bELl3VLEr1IwtIB0ub+pwnASpZmA
LE7BrE2w4kkUixXSfobYHyC4PZfDGQnhHKK7OeJvD2XMtFMKmWs4lkdoXkCOdw+pWv0Urp9MVDg/
iim4gzDNuKsppk4ebM1hZcuyCnSOChnjUBVFzqRbA3a4uSThPhnxDzbPctFfTR0WTxS0tTQNWVmq
UnV8xia7uXVSl9Rudwtrk4yLI88r+Bq9smo3appahpG5lJThqiqBBULpYnSNug373Nsc+MHK0+Tp
ymouLXBs3ipT5xVcAV2b5vk9JRr8RCRmfxTT1dRMtrOrMSSoDAlFAXyi56HFr4bzHhPKIauPLczz
ziOcOlRVSZVLejlC3Gp44diTqYAlxa5+8VHxe+fzZVXVHCFHwfLRn8XMczzydquRFjBKLAiEqXA2
uDqvboDiocH1UmQeI8vCOQZtmmYR104ly2HI4hFPUiUampmU+ZXUhha53G3W+IaW4uL+/wByzUlJ
PuWTxx4Woc3yeuFHl5yytof/AGxFmNW0aq46tG6KdIdri17ny9r2xltBDV8d8PLnmbwyPU1VWUjr
lMNLFeNRqBJuSRdQAoH1x6o488Hsy4rqklzasbw94TlaJKiHNHLVNSypZ2cINBfUthGXcjbck48n
8W8Kf+FnFVJJlk1ZNksk2ipNbRkrAzEqNYYKoZlBYKd7Dr6SwyuOlPcrzRqWprYdZ3wPHHlJo66t
ymlzHLqgukql6pqklQbMw6rfy733v0GG1HnkFfw1OZqrKslm0LqjSEs5dH3U3sqd2Gx1Agb4uuW8
PVdTm8eVU2Y09Xl+Xzc3mTuI6NSpPmURW1WuG1FiL3u1t8ZlxJnkOUce/vnJKuCrrI6kyS1UVMEg
NzuQljpA333PfF0W57MqmtHqC18VRm1VA2VxVtVmCxSTNzgFUREEsANjuN7/AJYPktTFnbBInmZw
Cr07eUFjcWPsB72tiWhyKbLsqnzHMa+olpqxmmi5J0tXydAVJOtUCm5Y7m4AFziqZtPJlcxqcjE1
Ek5IaKCQhSltxc+Yt6sAOu2JKnsVv0+oTzqnlpmlpuXR07RMGdY1aMy7/Lt1H1wOpZYo2o1EFN01
1NiwYgajYbAbbb9MFp8ylrYEFDTQUgWQyKSwMpY7btux6dMNsxpZTMJkqUqJkXaN0FjYbi3cen0x
OujIbcoTWoszCNJqhW3aMIFBP8wt0P1wtTVLVazJHCtFDGLyNYk36aSTt6nAQIyZYs8laoedbLAo
sxsd+v0/TDJ05ZEilpmABIfyhx3BJNyRfa2JVexBsEJKZYxEJJKcsSVZtI+ott9sOaGqkk5gijii
KHSwmA1EH1HcYZrUyPqVQlMtypVrs/69/fBgIjJHzYWmdW+d2+Zf5evTDruJPsPnrpYoTAtakNt1
KtZNQ7Ef0ODU0klVoMsYpA5u79z6nbc/fHQxQV6myQUKEG8arv8A9PrhrNQpKnKiZpHibzGSXyN7
emFtwS35JIVcNFXOain/AHi/L0qY7CO3Ykggk/rhwue/iVD5Y6ZIpUpNBzNTSbdr7gfc4bwSRZP8
NPLSLBShjHLKr8w3PsRa327Yc0+YZbzZXiokzGpuHWSosOWAbgDVsfyxEafQMZVzPKqeKMGaZJA6
VM5AjjKixFiLEe2+G0tbW/EM9fUq3lKiVIwyKfZRYKB6kYNmEsdZzGpmhy2LTramp2aQSMdmOq2x
PtYYRkzfNKxIstCxU6040leUFcgm5Yi9z98CQ29wkgpomIpWkkIW4mv859b/ANMIPHJQRLJUL8TI
Sb+ex+lj1OAnpv3YpmjqSKsrflxWJPrcA+UfrhGozFUKp8IyzEAAH+EDtfDXsRvuKwxNNKzS1HwY
YBQyWtftffe2G0kM1ODzWvENjKpurd7X+mBkgAHMmlWJgAeXGLgbd/XCMdTI0+haxYwQDqv5Tcb3
9PpiQmckHMYPFCSoILazsw/5cPJxzYRTECmKjUeY40kW6AW2PffphJkeBOXF5n6MYzcPvtv2645X
dPwljZZGsLP8rHtv6/TCDgcRGOBYmi/xLDflyWJP0I7e2HFPqzFGWmRKaW2grGSjN9BfcDDB0FMr
XnDX3McagqD9BuPrgzIrpyatSrOgKScwaBv1uoN9uxwqHZIUtXV5RUf4iOXM1YcsxysZNI9F7A+2
OQQzpUMTOsTnVyISDyj6b7+uw6YQpKmdKhYIa5eUwNm0iO3tY3Bv6YDMo1WpBm15gYhpYaQqLf3G
/wCeF1Hew4p81qaqmmpxpqaZLABgEjA7aj1v0P54RqYVo7tVMamJrlYqaYGMg7bC5/r9sIjMJau8
CUcehAE5v+W8Xtq7/TfBIp4qKV48wilZwwKT8wjp9rG/r1w6FdjtaPNHgjamjqqamcAh3fWyr6gL
vb6jC01OtOqTSOmbMQd5Y7Mva9+nW3W5wjU1VTTzJJRfECnmGpWqIyuk7bhu/wCmOFRKHkms5mtd
5ZJRYjvt0/LC3GqFKKpzTMKhloxBQSJ5WTUEL+2m4v8AYYJVLmkCsZZ1mU3V45EAC+y37/TfAMZs
ziEktDr03AklUKtrdQxscK0kVM0a8yuanqbHSWlYWB7Akflg4BfMXhqqippBFpSibTYvMSgPcWQ7
n6ggYZTwS0lMJa2jDU0rH8aQm0jDY79Rb098EqaOqNQkI16QdIqaltOr/kDf1wd1koqyOpeEVJhF
iaqQMgPqCCLHr64dBY2oI53ilejd44S9iFBNyPYbjt1wUPCY/wDGNJFtbTTqCZWt1cnf9MGzrOai
asJkpjAgZuWNYuikbAlbXIHfHBeWsjq4qJWA1Supa1v4VPYE/niW/UjtwiO5sTVDK7vWRj5bNpA9
yMFFQYijXkVwAV22H3/tgZaorUEuiQgC40RhgT2G+OnqHq3d5ZhOG3sq6N/TYWxMrsSJJnV2KuPm
tHtf+2C88atRfb/UL4IzxCN7B9R6WFgPbCzkiJEaJVC72B3F/rh0JMJy203MYBJDEncjfv6YISxN
o2Mh9Lfr9MCweN97xhhezA+bAhrRnVHq3+Zdjb0wAAqherMrkbnBWJJIUgm3XHPKCuxN+w7YMAEG
lCGJ6ki18AHLy0GyEe6nAPplbSGYp/FbBfMLKosT/TA6VVflZDfqcP3D2BJuLEA+3TAag72FwF7d
RfBGkFwNRI6EnAqRpAHT2O5wUKwzMd2YKfW2xwN5FUAgrGBsCL4TXUxK38q7m43wrrCkWJFv5t8H
sHIjc7EvpXvp64OdAUBTdfdcENmdtQ1ljcWG2DSOVTrYdLdMMQBGsKSCB2Ud8C0hUFmAa3UEb4EB
lYbFTfrg0jMyFbqx77b4QwIgW/EIN+wAvYYGQryyRp2+zYTCAsAbrf0wEih3C6gw63b0wVuF0g6D
SpJJ1Eb36YCYMIjpYH2B6YNdlNltfrgjPzGClRbvba/tg6j4VHqZcu4fyuOgmWgrZs1mu14FXQjq
SpKswHlta1gfrjPs3o6+o8Q8g/fWYvlcTh0grMyqQ2hSdtRIIVeu9ji3ZVldRXsDVV1Qs0cpkeBZ
0gWZ/lsrK2o7EdbdcV/jLgJ0o6qooeHKtpyAY6ilaWUI4fykuwtpuD5hYG2xxzotJ7s6k02rSLzH
wTMnxUlNmU9X8IrxxToyU9MDY6lLTspG7jonQGwxVfFDhiOn+CqKbN6WjzTI6czw5jlolkeqm1hx
+IUjCaTcqQD9Tiayjx/zebO6WLNctpqOpo6iNKqSuYCRmYAa5JWDOSTc30kgHri5cR+KFMcnzKCi
SjSqqkErzu6RwQOHKamnrNc05NjtGi+wtiC1wktiX4c4umUThPxUz3irgyWuzCLKaqvMy00eY1kx
aZGCXaazsdMh/wDiX7my9xX+NKhK/K58vzXiNaujqGereHJaMCNpALiRrCzqD5R5gQPbDXJkj8Pe
Mswhzzhmkz6qzOIPQqzSCKNiLswSy3up2JAtbEhnOe51xY1DQ5tJBlGX0TO8UMdJHDDAhIJUHTdh
6A37YtpKVx4Kk241LkgfC9o8wp/3caTM8w4khjZoMqNM9TFVQKC5JS9gFUE7hhtfbDnKc1zeoSWO
rzCnyygo4Zo4aeSJWfcG8Sp0BNz5mIt64gOJ5VealzPKZs4E0Jkhra+OoZyUOygOLAbeUi5uOwG2
JXKspqMypGeBPi3gQJKb80+bprawW53tsx2O218Tkk/V3K4tr09it14fhvNpqUVhqqObk8muiOhI
i3mB3uUJBNwCD3wAGUPlNVzzU1WYalMMsb2QKDupPUrbp7k4DiA1tFB8HFBTUEUixzCnaQSyOVN1
ZuwJNzYi9uuIxs7lrJGQRmllIAsQWue+kbAC9z1sOmLErVoqbUXTCxuaTMU/wU1NTz/+TA1t/a++
4HrhxXV0YPMjEdHtpWNFDFfoPyuSbk4jK7LqydpWditNfymcCMEDobD9MLZTTQcuVZIDUSqtmkF5
ACflAHQX6XOLGlVlSbTqhsoQSEqH8xu6qAD9iP6YNRNGodok0gghGvqKnExUOklPVrFTNSzxNqOq
QEWGxW1rEk7jf1274gxDSoEbnMA7ajdCdX2H5YFugapiqincyO0zyVGnyIylwx7jbp3th4oPw8ki
xrAyC557bn2AHTDSOrmlOmBCpFj2G/8AbDinWFagrVlXYGyi/lN+9zgYL2ApwtVolEazu/lCkC/X
pboMOqigqZ5dNPC0ciXPI03ANh0A2B774Y1M2hXWnUrAxCtPILBfQgD+uJmnzB5KMJUZuTezEKgH
31XviLtbklT2GSVnwVVys0o2r5V+RZn/AIehFhsLeuHLZEc1cstOtC+q8QeQuGX0JO2na1+uI2ok
ed9MMizaW1INGlh9WPUffC0009XIIZqxI4goJZSwDm+6dNj9MPflC26juozAUzpR1JiowgDI9KfK
TbrqO4PTCmumqqaany6gkqVJ1NL/ACta1y5+p2viIzGp+GdqanB+Gvudm1n1J74SdK6nplOk8km8
cJe5P5YNIat6Dmpq8rAi5MbqDpBVhsfc9/r3weWlqGiBnVpgtwLfLf0B3JO/XDZKGWrDGSYja+mH
cX9L4NPCaKmRUqTZjqanBIJ+/fD2+ovnwIrCUl0LEKgk3s920juCB1+uHFJX1YHLhpkWK5sojGm5
Fj1B9sGFeVRYYIyWIvY3uvqCOmG7SSsvmkSAC9whNyf9X5Ye75FxwdaSl1oD5zvy12Uew7jDzLYI
a9xz5gBYkC5Uggd8JLLHG8YlYykkkF10odu2FuZTVcUyPTtPL1RYQW0j1DE2H0tv9sJkkdDKUq2S
jgM5JBt1APrq7/Q3wvUSCtLrUM1LMGtJT6Ain3sBsPv2whUw170YMwKQBdjAFJv/AKt/6Y6nyuNq
eLmTQypKuzzSBQm/8O/9cLbkN+B1Nm0irHTUzU1TGoUCQRgJfp0I6+vXHZfQGlqSaxowgY6G1HlE
9dr7fnhN5jHGIIDDXyMpUOg0MnqpFrN07YRhKSu6CGWYtYiYDRpt1BF7D6nColY4rK6EShYKWOVS
p1iZNgR/EhuCPphOFq3THUxLFUQwnZ5W1iIn1HTCqPDl0o5cSV8ch2NVdY1bvcjb9cHly2MT/Eym
Knl2ZWgBZFN99QPW2DZCpsWgz+tldxCRIq2F421qdrbKdyPphsZqKqWRC0jOG1ORGEWI+3ocGqc0
hklEbRolT8yzUyg6z/yi1r/liIkdJGQmOMknUQF3J/1dvtgS+gN/UfwSy1dUKeCUVcBuxaeQqt/9
TCwJweuinjlWbTKrxjTzh5o1HoPTt0OEkzSOmplp5SlVTlbbruvsF9RhnBHE829RUQUzHyxaiSPr
0GHQmx0mbzVQam+EjqWsQxcAC3qfTB8vp6COKJpaySKYAyKpHkQ/6b4RkQRq6UaI9OdgXkFxfvfY
/wBcNpqz4iHlR6E8ul2ZQNh6YddEK++4tWV00UqolRDO0pHm5d3UX+mGpjiYqiyOlzd2JIue5tgi
2oWIhtK/d2t0wdIo6mNnmqI1A/gS97+lsTqiF2BDTTX1LGzLZrSah0HW1z/32wnOQgKWkDtaw021
A9MGZalVCmSwFjof26DBICzSg1Cl1Hyrqtv9fTDF7AvA5UAovlHRRa2CaiWsgKgWBLHCrv3MgGkG
wYeuCRkKHEynpe4W9/7YQAyqBUuZX+ICmykHqB0wWQpp2uD6XO2Cl1a4QncWUDe5++DAgKqldQ9R
uDhgFOu3t2BwUzSsVVfL29MGaW7WuSxPTHWJYX6C4274PmAFiNnXU3c3vgGkCKet/wCXrgSqgGzf
a+E1F3Lbm2wwxMUjHKB02N+t8FeoKKbDQx7AYM3ltdD9e2Aj3JYhiOi4S7g+yAQllBN1J6sT1wc6
lVmJuAL3vgLXG0gHscEY82TSxCra1xvh8hwHjVW87bMehHpg5TY7hh9cFsy3IKsB/LgjMFtr297W
wh8IGIN5jqN1NrnpgWbWw+U262GCRICgNyCTffBpFNrDc2thvkSug2qOUki6keuCs5U6R5r7C2DR
hOXYOAwPT3wRmtbUv3GEPoEBVQSwYG+1sKawi3Hmvv5u2OVutmNvQ4LJ5gPIDv1G2HyLhG88KSZP
n3h/SPR5JLPn7FoqrM5Z3gSCVbFXMpJ3PWwt6YmuF8y4ho40gfjaehpYpESsemk1vEncdSzD0Nvt
bFN8Asqzeurs3bL6ahmiy4fENVVULzWkB8oRQwUnYka9tvfGl1tdwrnKz1ebV2YT5j8MywLl9BBG
ZXbb8ULZY1sxItqPl3t1xzp+mTXJ1MfqgpcFYq8g4fzfxoy7kyTyUM8Mr1dXHmqSZg7i+mokkI2Z
mKeVBcgEKt7X0jJuBcn/AH1RQS8iGro5ClTBk9FLWV8rhSzSmeqDIH1W/gFrexOMbXMsm4Aq8h4v
4TpZs8zinSaesp6imIoqWIHRE7MgAL6tyBsPLcknFq4g8XfFHxWyNJ4MxpVppk582V5RF8JDAo8q
a3uCxa7eUN3N+uIyjJ1T29xwlGLaa39jvGbLMlyzhetqY1mTimnrBKtTmdYWr4VMjFVK3sSQL7Af
YYqlPnGW5nWUtSaEZ/WF1mqZq2WSpknNhZCAdge/T7YbywZbkOXO/FNfS0NQgI/d2WqJJZrr8t12
A1dSSTfFM4e4xzWkphlVDNJBE8xMFkVHufV9ug9Tbri6EHpopnkWq+LNHzeWszigWpq56aljFQ0J
yymiaZYBoCgjzKhLE/KL2tcnFCoMyk4Pqq6jevq6MNEDTyxOY1cGxIYjfp0t374lBJWZU8cbTlpV
BczAc3UCQRbUukfUA+uIbjSvfMM2fN6isqMyzYTcyeasYy61sADdtj9PbEopcPghOTrUuTpK2jjC
S5dSNWEqrTEqRqJJLBnP2GxJxGzQ5hFXLUVJSnjkB1GKx5ak2F79r4tNRmdHJlyCkq5qmKP5dCNG
lyPMobYnbsB1xASNFUV0tNWnlRjZxzLlTba7HVbtew9sTTroQavqErc2j/EhkqGnjO7O5BeUr8v2
HYDthrDS11QslWsM6xI2hm/yVZgLhB6nv6gHthGPMIKOmjp6WlRKoOSam5OteouLXBBw5nrKrNPh
KSoq3SmQyPGZWKx6yRqKjsTYAnqbYnVFd3yJpBTx0iyTV6Rl/L8NDqZ7emrtv2wpOIFjlSloWWJR
uQPxB0szN237YcvT5blTlY41zWUE6p2ZgOgtbpY3B69sRjrUST86JQwb5hpsluv3wuQqhZcvqoyh
l0xQgAs0RuG979L+2EIpKOlqHL2kdflZjqBBv1Hc/wBsGlklmQo5Cgfwx7A/3w4p5qCG2mjFQSli
pbzH372wwGtNUSyxyiJUESgK7Tnsb28vfCseWU6RLrqipUXEinULnoNOEeUXVZ0jigRWIuj3YfUH
+2HAo5WBOkSD52I2P3bDbrgEr5CGs5l6c07GeMEXJsB7n2w/rMmWKGEV2aRTx6VcRQBiq37DYXI/
LEdLTO6nkjU6dXVhpX2v3+mC6zRVDipRaiQjyBT5N/bbfC+QX3DUlRSUM/KZ+dETdmA8w9j7YcPV
zPIwp4PhVcjz9X09gBgEr5qVXiljFBGuzlYLML7EH64axZiYZGWhjaoiO4LoAVPsfT2wVYXW1ipy
15AwhnewF2YmygkbjDdKYPqMU0SqhtcyDU30J64FjU5jChkLSJfTyl2RDfpb++AkkWGnVGpke4B0
+3r7Ye/AvcDVK6hQyoBuHJt9bDvhFmdCCXVl6GRdz+WFUdYXMnw4lLbIpPQ9rgf74cyVEs1GqTNT
oQxJCCzWPYnDug5CP8LLGjDWz6fxBMQQT/pt027YR/eAUiKnUNc7R2vp/L/fBZaankiBRXVwb6Vb
yMPbvfAxNGIU0xqAL77An2JODYVs6HnVBDTVBVFO8eo6tvbth+lFlMqiP4ipimMg82gMCN73Btv6
dMRywS17uaanZtF7Op1bd9++DLHPKeXWVDwQg2F13J9MD+YJ+1juJ1eY080wE42Xlw6i4HTodj9c
JO8iqGllVipusV/6n/bCstNAiKiMREo/zVWxv69rn2wSGpnkJVUik5eyyNsrA7XIOI+6JbrZhnzO
JlK8wovTRIL/APY9sJRJJWAwQTLTqP4JTpJbud/l+mFaKnp45XNXrM7rdV0gC/exvga/Q0K8ooyx
7agCHRvSx3I29xg2ukG73ZyZBUwI04iaQoLtIvmQD/VhtDWynU7xLNJuCz7IPe/f6YWooJKmZVaY
/Em2mIL5X9Ldif0w/qVnpWbTKFk2eQ8tQoPpbpcd7YLrZgltaIhYJYHabRzWNxqtb62wLPFIoIJl
tu1tlX6D1w6TOqgVSIiwzyxnyOVHLB7Hf/fBYIYGmY5g5WbV/moAyEW2Xbp9cO3yxbdBtTRJU1DN
Nq0Lskbgn8/brth5U0UCRLyHJGshwIrKbfLa5PXe4HTCNXIImBaCGSnFwBC2kn3vvhGjpBXsLyhI
Qeha+ke59MHuLjY4ZnJHFJFHHGkhaxkQgW9hhvrZQFG1x06Mfe/fD55hSKqK8U8ezGExmwsehOGd
TWGqk0kFWNrITcH6YkvZCe3LDUyVdTUMsa+WMamZ+igDue2CyyNJEsbWSHYk26n0wqUaCKVTMCBt
y1vpv9Rhq9QSNAUgnYKTcH74fPAuFuCIrsGuD3BxwYiXRse5bqMAkQji6ktvcqdsBExVraSXJvcd
fW+HyLgH5pCLlSo821iPbCjRtGvzBz2Km4wm8ia2ZtTv11A7k/XBFeUqCWIPoT2wUFoOhEjBmUXO
w7YEg9AfsMFjksGMo1EDSoJ6e+E2VW2F1++CgsMbSaQw0g77+mDaPbSP9OA8xBIW+kC5A6YC+kaj
tt2wxHKhmcxkhQBqO9r+2FChQgBvsemCxkEXPmJ6774BCpvZrezYTGjpDotqjuTsCDjkVVjAYG/U
nqMBymk0tdRY7Ad8CzFbXW9/Q4PYOtnFFA1K1gP5cJr55DqYFQP1wMhTSTuCO2DxKVgXyi7b3B3w
+ELlhrsASCCPfBC3QL5ST0GBsuwXynvcWwBW0w7gC52wkNhtJQGwJH1wmQGHXT7XthTUp2U6Sftg
HjbTYWPucCYNAIsjLqDE39RjmV12IN8GjksqgH2698KGV+41i35YW40lRqnEPHdRw34nZjmPA4q+
DMlzR2aBJHUvFERpdfLtp6i3U98DwtmbZHnUGYZzltTmCuLIcwy8y0zKSd+WCt7Be9xcH0xB8YcN
TUvCNLnjzPI61Cwx2QaCpUm9wTvcWtixZYueeIFFFHXSTcWTpSr8KzPMfh41uzRJEgGs9bk7dT74
yutN/Q2LVqr6ly4z8Zf/ABOpK7L5q/N8yzCaAZfDlXD8BWCaIEMoYWASNSF8ir2vtjNvDSmiruIE
4V4v4rzDhTKCAQlJCsmuQ7AMSwCgKSbkn0A3xd+EPF1+H8igyjhHh2fnLqD1sEKrNqbcoW1Fbe43
tfFG8Q8m4grhTcU8RUENBQmeOkjijXlCVR10AAeUAdRiMFpbhVJ/n+Q5tyWu7a/It+dZr4YZBwxX
5VkWUR5nmDVZNJmNSpNTIoYgBiNWlbb2Xckdh1zLibO84zX93y1MNPTxUgEcMNPAIg1iSWY2u7G5
8xv+mJiqr6epq2bJaaOiokGkTxsYiq7ndySQxHXe+GL55HUPJyhV1+aTF2lamjQx3K6VCki/ff8A
TE4qt+fmQnK9uPkPTmFVxPSpWVVQlNTE6lpoLKVVRawJ9AB+mG3Nqc8kjgp4UjpY/nkc65Co/iZm
6+m1gALD1xCZB8crPRiGOySXZWiDup7gX/phxV1skMHwjzPS06XYg2JY+lhfr6XtibjTpEFK1bGU
NRLSzTRxh6qOLVyZA1kQnp7euGgSRniaZ9ETyASPEDq3O/XbbDmHNJamm5PJleFRa0S2U22BJ++L
Xm+TpQ5alIKuGpjMSTytTjTEikX0BmAZmBNjYAX6X64k3pe6IKOpbMYZ3FkWSwU6U0k80q2Z9cYW
/W/Q3Pbr74YVMc/ECTVEaCKGILqklkCJGCfKqgd9+g9Dg5gpIIBNy0PKseXL5Ywvq1tyd8ESgqQ9
MsjNT0Zu0DuBr0HcEL/ucRW25J7uq2HUkGVwQ6BHPM5j61LhUB/nsOm1tt8QjZlUPBFThUtHdVkH
Vxfa/rbEnWZTBLSkIr8xFJeapcDVb0HqT29B1wwiqJa4IDSl0vbVcKrkdi3oPbDXAnz2EItUs6cy
QlW2BA2vfphaSpDLpDLT2sRpXzNh3FkktUJmrGNOgsAipcE2uq39Lb4a1VGMuK1cUZkCm/nKkEeh
AN8O02KmlbDg/DVUlNKxBYjmCNg77C/zbgD1tfDeriog8T085mvfXCpLBPQ6j1v9NsKJUvVMzHZW
UgiFNIsd7E9xgqzQ0ylBd5Dsiqo/ph8Cq1YtTEfgaZDVVdyBTR3IUH1I9fbAmhTUFqZOTEG8yRgu
xP17YY86opEZ9PJikPmEfY+u2+JDL8omr4XmDrSU9vLU1Gogi9vT+uBqt7BO9qGcywQ1RlqZJWjd
ro0gBP3F8OjX8lYmhhiQE+QEBnI7krgZ6ehom00kjVzsoV2lAGs28wHoP1xGJU/DTlFHL220N09i
cFagvSL65pap5fiFp5GuSwFgfY4Up6d6x5CkZKp5nkkNlA9/7YQetlnKrEAyounUo2/pvg0kammY
zVLNMWFv/h+4t1v74YkK1DU8ChCHKsPM7AXb7A7YaJI5N1jLR9oybkfXCkPKj1BljsQLHa7e98Fq
OSgQpqRiN7te5v8ATb6Ya7Ce+4EazVDK0kghUfKAv9cC0GvYJ8guxYHT98EFSWbSwQeuq+/1wK1d
Xq0Qs8RPW5ubH+uHuLbqLKylWeaVNakXDNYj0sMLNmcE5VTRLUzEWLcxrN9ux98NjSU8YKyuZJTt
v1H3/wBscpNE7xSR64uyyC354WzHv1Ap4JGY6JNCK3+WxNr+g9ThdZU0MGdVjJIZWJBU++GtTOZ5
NMcawR/yBid8JECGcSSXcX2buPqMOr5FdcD6CiXM1kSOemgKi4aol0lrdl26/XApVmnZ4Zo45iW/
zTZpNh2fAVMMThZYCjA/xrtv9O2Gs1a8sJpSoC6gQb2UN3OEt9ht1uOK+RFYKTIy2uFbYqfpgkMa
HX8YJ9HVI0IU7+5GDwCnp4DYGRzsTYHf69vtgkhaJzI5aUHYEm5GD2Q33YrFLBBCE+E+IW4PzlWH
2HXBpszaeOQRwQ00J6RxDzH7nfDNOZOT8NrkKjUXtpC4fUs9LTRW+CL1G/MqJZibk9lAH98DQJsb
00dAtqirZpSx3p4PKU9zcW+2D1KUVSsjUxkiso8rKN2va1h2wSvmaeQPIVSY9W/iP1+3rhKNTMxT
VGkajzS9vy9fYYOdxcbCaw1Bqlp0V5ZybKq7/b64G1kbyqTuG5i+b/phaKWSgiMiGTQ11E8R2Pr1
9jhrI0jhTI50qPKWbpf0xPkhsjpY3jIRGEt97Ib4K5bSQVJc7WYYcUyzRwGcq2i9tasAfy62wWSV
XIPMVwO2+C9wrYOqrBEq8xg9vMLYQEzRsxuVY2sQNrYCWNgD5hqB+X/rgIiUcsx3tZRbvgSC+gd4
2kBIKso733wCrIW0CzG19+wwYoZWJAIsN2wA8kja3LMwsAuEFBQrs2hVuxwJTlmy3t3J74F1Ud7Y
KEN7K3ltv3wwoMraUt07k3wUssg9cBIrMukiw7nA6ARbYjBsG4KaipItpBtv3wUhQpBBJPTBmJij
VRuowQShgRaxGAA5VFUADf8AmvjipBHm1YTUjSTexJ2x2uQHZsFMVgzkFQp3J6AjBvMnlVrexwkr
sZGLHe1gcKA6SdLbnvhggpdg12H3GBjcqrkAWY9cAzut9ha3bHR6uWu4v6YOguoosgYWb9cBIdCF
lPTAiRSSGXSfphOQeU2OxPbCRJ8B430IFfY7knrgwClbo1vocEDKAA1wcG5aNuLH6dcAI0Whl4fy
uGnoOIamozqGImVIMvq9cdz2AsAp9Tc4J4b0c9bm+ZxUs1Ll0MTaTVZhUiIQIxK7XYE7ddKk2v2O
JqPh2qiD1NJUZdUASqp5TLBJ0v8Ah7XCj1FvriN4MyzhfPM5zKqzemkJjk/AoacvJzbrvsTqYg7k
33xktUzbpakjZKbMeDvDVYtObHN8wqY1kWbLqZLtaxv5/wDLU7gbA2UWtfGSeK3EmY8XU5aSZXy+
l8sfxNSZZATdikd2a4Atciw9hh7W5lwjleV1ac5JZYtQp6d41Y3Btdv5didhck+gGKxzDVZJmNZQ
ZXoglRYmq5PIkeo/KAepNr2HTFcI6Xq/ctyT1LQv0I3hbIqfNYllzKaQ0xkssY1bkbbWBv26YsGc
VFJk5jjp8u5Li6x00hbmP6XUb26en1xWuGHgjV0rM1qaKmWZdUdNYMy3851Hpt0ABufpiaz3i/K1
kanyWieCjVz/AIqpYvUyAn+OUWJ2HQWxfJNyM0GlDsV6ozLNaapmKTPSfF+aREYILkaTcDoLbW9M
TlHwrCk8CVE8NXqCkpB/l776SepP0xHplC56yQU0pqajQoWZBogi9VZm/lHU7/friXy/haurZVy+
mlkmzRmSlhp4AYwb3udZ6KBuSbdRgk/oKKd9xauqMuy6A0ysJZTe1Oi9f9IAPT39sQ6LWVcEcAaK
GKYN+DGQ8qopJ3Y7D0vfoMG4qyqlyKOjam0SViSmNlB1CRlNmIt1W+3vjo6mt4hz2moqOngNVVFY
0jkURol/oSFUep6YiltaJN70yJqaajNKfMzzEWQar6R1ux9fYYkMkymszWl+IqbyxRERokklmb0s
OukdzsPfAZtw4MvkqoZa5ayui3tRn/Dp6+Y/N9sJ1/FtdmscbtoUqpDxRRBUv02Ub9Bf64nbkvSQ
2i/UJ5n8NTVM0LyCVCfMqkqhPaw9vfEfDMoQwS1BMUIJhQC4N+u2G6IkoDyzoCTc73YfX0w8jhgI
JjU6Qp1T1GyjfqBidVsQvU7QapzB5qCOni/CgZtd73dtrbnsPbpgq0KieJaSoV5AFHMG3mNr3J9O
m3phiKyGGVtGsxncbDrhwGln+ULEh8xeQ3Y/bBTQJpnSaKYhRVAI72kROq+/0OHMQ+F1gMsfPNj3
lCjf7fXCUogoSOTEKl2W7vL5iPt2GEKWjWomEZf8NgdC3/iPQH2vg2YLZh5KuPRy6VWcC5ZpD5cN
5oqmCmGmVmhf+FCbD7YkJIBDAPinTQl0REIFiDv5Rv8Ac4QUtOH0RqsRFmJJt/1w0+wNXyJRUZVS
KqcRW6R/M36dMPaWanhGiCkMpMZu7qBpN/m67/fEUyGBTrQOl9m/v6YXWOokRVLtHE+4t1b/AKYb
V9SKdcIUn/DdUDrFE9yNJBI+tu2EuVEwJGqQjYX6DCsVIsKMGlQRE+YgXv8A74QcQxuI45w8Z6EA
3++EvYPmLtTxCQionPlBCrBbY22t679cNooSJdDOBJ6sL/lgWaJbmJSx9W6n+2E21M+p72HZTa2J
ITocMkcQuXsAfMCN/thNpVtbzIg3UMLuf+mDwTiCY86IVSMLBmNiPoexwjNKmoFQb+jdcCCwGfW/
y9ug6nCnxskkWiVndAbDUdh98LU+XVtSiyIjJEvR7XI++FGcU76Zx5jcKXS9/t2OE2gSYzaUE/iR
eboGX++DNPHqBYm4/wBNzb/fC6LLUBtFMsp7m3lUYVo40QmIxCIlSTKz7j6j09hgtDpjWjgWbnyC
ORljXW2j5VBNhq+pIGHYqqIxRLNS8wqLExtp1fU7/phtXwil/wAipSoSQBmEQIAPcEEdvyw1h11D
hY1LSH0OHV7ivTsOZjFSsJIZGZL9CtmT0374Ugy6qzRy946SN1vqkbSH+g+2ESoVyXfTKnQ2vv6W
6YK89SsojZ1kNvKOo+2D5B8xaTnZeTTTaCosRpIIHoQRjmDShWMgQ3vYd/fbvhI1DSRiJpAIh5mU
RDbCAAlsA5EY9tyMFdQ1C2tpXKK4WMeYyMu5woIqiJEYL+B1s1jc/wC+EisagI1wL21joB74V/yi
AJNaDoCSAcDBHGoEySGRYw+5bsSb+nQYSip1qZdcSDQBsHNgbddvTCciNIVcxnlne4XrhUT7NoVb
sLHbYD0H98Oq4Fd8ijV7uqRg3K79e+G7ojeZBZgbkk9fthWmWORhzQxsDZRtc4Ql16WKtdAdPXfA
lT2BvuAoLX8vTqR0++DOXksgINz1HQYXW5jGlwBsLDthEyCIkrsfUd8FirY5taXVSSno3XBYhoZj
ISjdBtgy1bAaiu574I7tUOS7EsdyTvh79Q+Qbl37tfsRgSTDEbnvc+uOVAg8rkMezDBX1PIEktYe
mAARIbdz9cBqLtt2F9sGLKwt1HvgthHe19/XCAAu6rdhcdBg6sRGN7E7mw74BXB2Y3tucBbmTKoY
KG6n0wwOMYY9vtghOjptg+lvqB3GAVg00Ya+m+9xgQmGiVTGLvudzgSg3t19RgraGYgX+ox2lgPK
4NsIfAGgtIqEAgne2DXKiwNh0scJ62Mi6t7euBLb9NP9MMQN3TYYLJ57XIvfBgWG/TBSOZID8wHW
2GgYtIVuQNj74TEeo9bH22wcnUTuB7HBWsvynESXJb66fN63M4mo8rrKeQsSKdyzK/0vucR/DUMj
59J8XLWUiqGkkFC2mQ+1+wxZH4lM9RWwVM9Y1e7EBacmRmv/AAl+oUDsMVWiqqyLMqikoJDEKogO
z7bA9/vimN01VF8qTTuy81lXS5JTUFRDwjQ5fGt+XU5pPrM7LuXdb3bqNumKrxR4g5lxLPT/ABkg
lpoAVgpliEUEXqVRbDf164e1OUR0tVqV6evqljIaesIWFLD+AX3P1/LDHiKGtkyuGqqYFWK4WOVC
oVz/AKQO1sQjptXuTm5U62O4V4Rr+Kcxj5UT6Zn0RqiapJG62Vb/AJk7AY2g+B2S8F8OVGYcX5jT
wVcWnTAs1mPdl3HmcqQAFFh33xQ/DLjem4Loaqpy+oqBmzxEFxTGTUP5E62+ptioZ7xDX8U8SCbO
qiVOdKNQ/iVSegHTCkpzlSdIcXjxwtq2yRy7NqiozWvoMqopHpKgtyYwxLUsZa9gTYdNtRw7rc2O
SU5paSVaeUIUmFLIGck7kcy1h72ueu+GVUsV5qWkYwZcGsbDzyWPUnoTgmVZNLmExp6alkqKsqWh
poUDk23LMT0AFzc4NuQV8EKlNPDOszpKYGIDSG+3oNR6DE4/ENLltJPHTQR0tbLcVFQGJk0W3WPs
qnYHufYYJm8lbm+iGoq4RTw2VooWuOncj5iLbkYSrct5uXxzPDBTQmM6Iw1mYD+InqT9cTtOrK0n
G9IiYps0iNe7JTI6qltWp22OwHbYdum2GtXl6STBaecmPSDJMRoAPoB3HviNo6ipgPkP4Ra9m6G3
bD0RRPTaqqrLO0ljGFIU7dSe/pbE6aZBO0JLHT/vGM0o+JVN35myG3U39MdDST5tVRwLaolkayRI
dgWO2FailOV1SB4JYaSYAskhAJB6H2BGAkr4qanZKVPxGNwV/vh2+gkl1OOUtNDP5lRYfKXJAF72
A/Q4QoqhUjMDhUKsWaYm5IA2HphBw0kaM7K+pt4kuD9TjpIBOmpAsekW0DYfn64fsyPW0g9RUFwE
iVHvuxQk/ng0NKGkDyz8oDcaAb39AP8AfBkliEaaAG0qQFbYA+vucIzvrbXNMWLdD12w/ZB7sPS8
mnmPObUVN0LLdTfvbDioqxKGRamSVB/CqaFPpt6YZvTs4WQDQL+UMbk/2wgqOzNclVU779MFJ7iU
mlQ5QF20Kukkbn19rYJJUyooSUeYDZj3++FIY7KzaSf5WJ6e+COwZSu5YbqfQ4W1knsjqagedg8t
1iAJO4BP0GDJAWGkAKOwbBRUrMXnmJklY/L0HuTjhKsagR6nkIvYDp98SdsiqCpeGwQ7Xtrte1+2
FZixupeJmBtZbavtgqxicgSSKrdAoFl++E2jMDlDZUJtqtuMIOBVaWV0dtRK/wAQW9h9ThMoKY8z
SWfYrr30/XA62p18shU32Ubj74IkxJN2vq6m18NWDoVWrlcMTKUHorEAY6askmQCY8wX2JHnI+uC
GMLp5bq2HAijkca3IlIvuRpOFsh7vYbvI9g0aFFUWtc2GOadrFmIkY9S++FLKxVnu5PyqpHXCSUg
kjleWS1v4RuScPbqLfoGpqaqzE/hRNo7iMdf74VlyqaGIuytCgPWay3+nrhsHlXyXPtp2vg7U8vM
vKTpUXYE3267YNwVBVlRgRJ5SBs2m5xxZSqxIheQ9+h/6YVmanqIVjjDpLr3kdrqFt0Ate+Oo6uK
jmeN05sbbNIoGoj2v0wxCgpQYwk9S6TbWjZDp9rtgkUkcblZIlZhcWI2Pa4wLyPJAWB8qN5RqFh9
r7YSlrC0ARkjte4IUagfY4W7Hsg8klMiFbSh16Nq8p+oOEqd41JLgtt5YyfL98OqSmURGSWSN3I2
jZdR+/p9cIzU3OlJ1KhG9ye2C1wFPkEza/MG0N00gW2+uG+nTcrYegvtgFkkjVlZVN/5h/TB1YS2
Xy3PXSNwMOqFdgBp5xykBNhv7DBkLIgZZLMDbljr9cDYRhhGWK9weuErahaxBHpg5Dg4sWJLKQTv
cd8FVLsCxuvthRQSU17Rk2JXrhzZHBYLZBt5mH2wXQVY2La7XAsNtha2OS63KNb6DAOo30dB+WCl
7Dy7HAK+4dp5CWD+f1IwmX6Ko6/fCvN5cSLpBe5LMRgpKhrj5vW2GgB5YNzcjBCbbb/Xtg2qwOq4
H6YBnJv6e2AGAyjSgBHTfAopjJI3JFhfBuSAo/m7jAnSLa/KPbBYUF1MRbZfrgrsNhffBpHGggHV
fbAPEoYHcWHfAgYBjsRY9tycdbe/Q47UPXBhcnY3wAFDXJJ6WtgSCN+uOfyqSdrdxgSNNjY3OADg
d8cCA9geo7Y4aWbf8jjo0VpHJW6gbYQwbC2++CEb9SB74EgE7XU4HcHfce2ARZo8xFXFPSvMMop4
4SU5dPqlne4sjEEWvc7nYWxX6eolpa7nRXZlPlxMxjLopVFUZ6qfvFEQtmvuC53P2xPZfmVTCKrK
qejNFSTqsk0NHT82d1XcAsRe29ydhim9K2Ro0uT3YXJM8qc9p6qmWlp4nkASWskTU6Le+mNelz3w
fMc1yygzFXmop67MEsgfMiskSBRsFjQAEn06Yg8gzGoo6ithpKmOisHdmlZRqA6Akjc9gB1OHkH7
1hjhq4oYqskrIKtSQwIF9IJ6AG1yB12xBpJklJte4/pqHMM+roVzHMjlFE7qDzj8NBGCfNZVBNh6
AE7YhRw1X13ELrktM2YU0dQVhqQjCOQKet27Eb2O++JCDiSrz6rqanOJp81zJvIsbKAoHTtbYemw
9cTFfxvPQ0sccckEbxHTFDALIht3PVj+mC5RY6hJb/8AoxrsqrQ0dTnVXDQwy6iIKa2u4/hVR9Ri
uNPUZLmbGjaSFKhOXd23IPUH+2F3zhGqZKiV5KuoOpnZ1IQE9hvcfU/bB3qaOoplnJaokUaliRCs
cbHqMNWuSMqlwJZc7q4TkiqdiTpZtKi3v3w2r3XMpZJKqseonMhukYJVR7H/AG9sP5C9TTx08kUU
MRILl3uSbfMSBsAOww3zGrpKWMNTMpjSSyKg0Me97dhiS52E+NxKiaVatI5SWFNdFhKfw9dx298F
WVCY53kMgibyRjZQev2H64byucxk+JAETlbPpJJY73Lel/TDymgWgjWWXSgN2jjbzuzAbbdhfEmq
ILgY1fPzCoaSQySSyEkuQSWPthemrVWO0MCiEAK+qxJOFhmMkcaiCnJPmEkkp2JPa+GEiMxZ2cNY
geQWWww+VQrp2h1UMou7BIY2Fgmq7bev1wjA01Qtoo440JsHk6A+2CGkEhEolEpUFiFW429B6W7n
C0E5EgLoQpW4L98KqHdsb1dIKJmaOoWVlazjT39fTCnKip6fmiQSyk6VuNlHrhJszd4zHYcvcEAb
nCN5Vj5LKbKdQU9cT3rchaT2HsZ1nVcaLW827XwhPJAZ1N9CmwdVudx3w3QvNdVGlR1YC+2HaUlO
qqy3II0lj1J9bdh0GFSQW3wEq60yhY1toUbADfAUxSwaUsBq0jTsF+pwURpDKUFpEP8AGO/thSep
VQFW6aFIAC2uT64KXCHbe7BrKJFBY1EXoojF9Xv7YJBQsWI8wIPmHTCDSCQLdbHp5RucLjVyRJGH
Ei7MpN7j1w90qFtYm4Ak0kk/8uBERLC7nSOoPU+2EgxdiV3P8x2thRdKkaVJJFjfqcMQCxltBY6k
O+nuMGQHmEIoC+hPb64BZWSTWdz0sP6Y6SXlnVGNCublOtsG4cDhIZZF1aFKgfS2GkhJccokueqq
N8c7tUb9FJ3Y4XhhMAvHIUfuwNjhLbkb34AhkSJDdgjdyRc4RFQwcnY37HB3HPOm5Zxtq/vhN7RX
FwzXsAv+2GkhWcZFK+bp6emA5TgASllU7jDyLKXqYRUNNAoB86FrMn1H9sKtPS3fVDzASdIvYn03
wtVbIFFvdjcRoFWw8rbDb/fBZmLaVkYsi7Lt0xzM8AIUqVbtcG3scIyO7KVsLf0wKx3sHSQxNpQ7
+vr7HBjokfVcK/8AMPlH2wWkqBBchVJIIYuAd8K81YYiUUsDtrZepw3sJcCU01RFILsyN2N+uOVp
YmIbysRuT1tgiyM4KsNQ7X7YXgy6arDNzFWK9uY/+2B0uQ3fAnfnuDZUitfrvYY5mRrCNCijpvvg
XphTllLCRempcCUBFls56C21sFroFPqJCQ38x6d8GZtiTfAyQnUeYLMOotuMclOGXmG4QHYE2Jwb
BuGWIuAWXy9h/vgvI0tsyna+k4TkJF9/LgVm7Wtb0wU+gbdQQS76QNP32wry9ZO11VfyxzlFhC3G
q974SV2va5KnvhchsuTilz5D9jjtSnZvKw9Mc7Lay2B6XGBIUKE07jq3rhiCkLzVW+pfXBmCRkFS
QQcJmPQbjrhUi/YHbcnACCNMWO4+5x2onYi+OFmFibYFY7IWLdOm18MNwr2C302I6WwJuvXfAHVf
UQAt+oGDkjWTa9+hwCADA9QPqRgrkDddjgzEs3mCkeowVkvsD+YwIZzKzRAkjc4MxLMbnfHSNcKo
I0r2xyqDubj2wWAU27jHRr5mCt2vgSd+v2wCEq8h9rDAI7U3QjHawegwaEnV7EY4hXI6jAMna+qy
vK85mOWz1FXQqCqyVSCOR/U6d7YdZHJnGfV3Ly+peiSb8KSrkkKAj+Vm7jFbjihjqysoLKg3uep/
tifzjN8uiq2TLOe1FywqxSPpJa27NbbrfYe2Kmq2W5cpXu9i5cI8BcPZdVNNxTX09OkUgdgz8wvG
LklQD5ifTtiJ4244yWoq5KfhrK0y/Ko/LEWvzpf9ch9T1sNhij09JU5vUCNLvIbkam2sBc9cL0mW
xCthp6uQ00b7tIF1MB7DEPLWq5u2S8x6dMFSHOWZpaCo1R6izawqre59zh7yPLqmpksBzCIV33HR
m9BiXrMlp15U0scVHRhAI4oWAdwBYM5ubE9ThhT1ETETPXw0yxKQdcRJJv6d/qfywrT3RJRpVIYv
UmcCOSRSijTHFCvlHv7/AFOI+GokgpZYVkQxl7adN2w6zxsxhqnWVJqcN5vxF5bMDuDbqAR2w/yu
iymiyOKuqZ5WrDMwNJ0DqALH1Auf0xPhWQ5dIZ0tHXV7CNFNLCN9xYtb1wbMXy6mjiiphHNMFvPU
Oukux32uT0vbtfCWZ55V17KplZY1ARFTyKqgkgD8ziMgpZKiqWKKNp5WP+WBc4aTfJFyS2W4sKoU
UhWJy0b2Ybbg4mqZIqiolnqmkWCw0QRqNTexYdNrknFeqKWeJhLJEQvXr0GH8q0y04mWQxryjqQP
5mc9v+XDaT4IxbWzD5zn371quYsSQxxgJBAi+SJB2A9+p9ycMj5YRJKAzSX0Rg729bDpgaKllrRM
6BY1RdTSv2A6Ae56YOU0S6oxpY9y1/174ey2C292JUdf8GxDK+4KyKraSy/y39D3wZaOWsleaReV
E5BIG2x6Ae2E6mML51DNp8rMR3w5zPNjmDqyxLBHpVREnTYWv9cP5EV2YSZoo5WFJESqj5m64SZ0
nCmV9TJ1t3X/AKYaSSs3c29sHhjkclVAS/Uttth6a3FqskFniRQibr9N79sISVDRao2CljuSRv8A
QYQlj+HIBIdbbMp2OOSnMylywTfYE7nCUVyS1NijSKraIo3eRhuCOn0AwmQYyC+rm9y3Ye3rhxDI
1KX5b8praWN9/uRhIzS1DEuTJoGxt+mGI7TD8wdiT7WOCLVGBhyiS3t64RLNJ8oIXucHEeg/hnf+
Y4lXcjfYUbnajIQdZ3O2AWTmE3ewt174P8bMpVWCnT01DDimpxm9THBTxCJ23cj5QO5xHjkkleyG
r6FNtRsey9b4FBpsWUOe4Y7fTDiWKnpJ5SkvMQMQjEeZvf2w11Kzb3JPQnpgW4VXIIOhlLNdVO1t
7DC88nkuFJS+xwgZFRSpAv30nBE176b6SLEnBV7hdbA62caQuodgP98HEbU9nIF+gI6jAlkgI0uS
bb2Ft8OopaaoAWXUHOwktsPthN10GkMtbadRba9hgY5wuq+598HqqMwlmQM0Y67WthsFLnYWHriS
pibaD3aRtN7DubYcxNTW0iEu6ja52J9ThuZJICyDyg+owTmMBp3sftgqxWLMkb6dcyxk9gtx+mEb
kkKSbdr9MGRgCCbkd7YEqtTIqqTvsS3bD4Biakjyg+W/bvhd6qWTSuo2XYAdhg7UZlISIq1vTt98
Jz0klKwSWysRfZgf6YVphTQpCVCMsofS38pwEx+DKtTz8wEbgixXCTK0Qsb39L3wmhBfzbC1zbBQ
WLMJZ05zkhCfzOOMjSKBq2GwVu30x0kxldQPIijZD0GDFoxAQe56d8IApVb730jqcDJCsWhx5l74
SMpHqB3HbCkICyh2OlF8wHrh8BswrHnzWClF9O+FFhKwl9QFjYJffCbWILFtzgVlYIQRdfXC+QfM
CRQlibauu3THMUZr2tfByA59F9MDI6rT6AoO9yx64LCghKqoF7n3wEXnbrYeuChPJcm5Pb0waEqi
2K3a/fD6Cu2A1xfTuR3wZWIjC7A3vgSLW6/bBb3BI6+uAfAIY2tYWxx2F+p9sBYqBqwBVexwAArC
/wDvgWNrm+DRWKsSRcdMEL+a/Qjv64OougKwkgXxzalHUH2wczsQCVAFu2AtcbYN+o6XQICt/Q46
5aXy9QMCem9jgqA8zYdt8MRxBXrtf0wXcdTfCocdNx9cF0hvXBYxdKKeoeQomtb213sPzxOZPw2D
E0slM9U8Z8wLaIgPdvXDrRSTZFTfDiOOZd5CSdX0UH+uFIq+mp6S9bzqlIWDLFMw0fl3OKJTb2Rf
GCW7JCCuyqKqi1ASjlcsQUaiJEcja8hBJAPW259cV3Oo2psyp3qFWmXe2xbbtsd8IVnEh1OlFGIF
1h1kHzgjpY9hjqCl+OIq6yczSFtla7fc4Sjp9TG5avSh9kdPmfEOujpRBTw6tT1dSQtj0G52HX/r
h9mWW5RwukVPBUQ53mpk/GniOuOH/SnZj6nEeuUV+ZF0Vnig+dwxCoqg+nc79BhkUjyrUmsyS9Ee
Jh5b+v2wc7IOOUFzepNXNNJNNLLUyMSySMWK+hY9ziNZlcFpJWZhsF9cTwrIHiFGqJR05Fmlkj1S
ub7n/vtiMrxSQTK9Jd0Vh55R8x+nYYnF9KKZLrYaDLWlh5tQ5poT8gbd3+noPfEtl9VBlVJK8boj
aSFjT5zf+Y4arLSiE1VVM8kpHkjHU/XsAPTDeFKnOnYU0aLGh6mwJv8A1wncueCaqPHIlWVAkDkh
UuLD1whTtTx02p1MlSxsAwuAP74kJaShSWzSW8oBJ81279On0xHRlKSqkuCxFzHbb6HfElTVIhK7
tjmarYhooiVjYrdQNzbpf1w2kq1hY6QdQ6lj3wRmkllVEHOmJvZRe5wUUzO133c9R2X64lpXUVt8
AGpnmjMakiIm5UdDgASyi9yB6DErDClGnMV0ecdAx2Fx6YY1UlpA+q4cb6dgD3wKSbpA4tbthGoJ
UZQ9rkatIPQe+Dx6L3mVpB0ABtgNLKoLb7XGAZrHY3t3PTBuwWwpUyvVIEMaRqmyIO2El0yAE3ve
xscJtNpB2uxOBMb072dLM4va/TDoVihaJ7IqsCDt74KY5SpjjJaw1NpOwx0MLSHc8tevucKyNEYy
Fl0KP4AOp/3wcBzuIGPkqtnDKTY27HBygRC3b3wCW0tvqjPUdLYIEZnEZbYfr6YORcC/MSVFIW0i
jc32+uOXXTxsY5Spk8rAGxt7+2EZICg0sdLdlwaJ5IASQrL0swvgrsO9xOwW3W19vbBi4II2j9O9
8GnkAQAqFJ3tbfAwwaCssiiRRuUv298HS2L2QQDmgC4Vext1xwbcIT06Ed8LGT4g67BWW4sv6bYb
lPNa/wBMCDgMzgC1txjlmePpsTjkYBzqXzDscDpWY3N1X2wDvsCjtICXYlOlifmOFVbl77M1th2G
EHCRsdIYx9rncYJzLjcffBVhdDpWEu0m6+4vhFpjHJ5CdI6atyMJmQkWG2OOqZrWHufQYaVA2CA0
iswXYdSOgwZFWwGoWPXBzHyCAWDAi4AwQkblTv3GFd8CFUcRHURdT7YATqS55YJYdOo+uC83mixu
bCyjAFih9GPRRhUOwgQnyhvL1J9MGSOMC4JuelxgYzcAHa/zYNzwhuEHoL4bsSSAdmjARrAHuBvj
n0ntYAdQb4NTAtIXYawBffCT7v5Rb2wdR+5y3cWB3ODkoxA6gfxWwGnlBgzAuwsQO2ClCAADcnrb
AIUCLfydP9WAadSpGnScJsNI32PpgYrFrt0UXtgrqFnRowUtay++BaQvpQdPQjBi3OYkj9cDyQ3T
Y264L7hXYLIDH1FidxbCZYt8w2wdkdACw1Idgb4KR009DhoAUZgLjfHDzEAduuDNqRN9vtgsTtpY
gAW6k98L3D2O6EG+BcDcnYncWxwa42A++AJN98AHLpA8xN+1sHVNXcEYTEZdlUEb/pgxjF/KbnAw
QoVUgAnSB64SZdDAq1xgQhvZjYd74LJpAOk3wIbB1kmxNvrgUb8WwN9sDGF5Sl73v3xyoI21KbYB
bhS/qN8AtwdrWwYncBgMc4AFgN8Az//Z
Author
======
This is the work of Emil Persson, aka Humus.
http://www.humus.name
humus@comhem.se
Legal stuff
===========
This work is free and may be used by anyone for any purpose
and may be distributed freely to anyone using any distribution
media or distribution method as long as this file is included.
Distribution without this file is allowed if it's distributed
with free non-commercial software; however, fair credit of the
original author is expected.
Any commercial distribution of this software requires the written
approval of Emil Persson.
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
AAM3MAAAkpEAAgAAAAM3MAAAkpIAAgAAAAM3MAAAoAAABwAAAAQwMTAwoAEAAwAAAAH//wAAoAIA
BAAAAAEAAAIAoAMABAAAAAEAAAIAoAUABAAAAAEAAAPYohcAAwAAAAEAAgAAowAABwAAAAEDAAAA
owEABwAAAAEBAAAAowIABwAAAAgAAAO+pAEAAwAAAAEAAAAApAIAAwAAAAEAAAAApAMAAwAAAAEA
AAAApAQABQAAAAEAAAPGpAUAAwAAAAEAHgAApAYAAwAAAAEAAAAApAcAAwAAAAEAAAAApAgAAwAA
AAEAAAAApAkAAwAAAAEAAQAApAoAAwAAAAEAAAAApAwAAwAAAAEAAAAApQAABQAAAAEAAAPOAAAA
AAAAAAoAAB9AAAAAZAAAAAoyMDA3OjAzOjAzIDEyOjUwOjQxADIwMDc6MDM6MDMgMTI6NTA6NDEA
AAAABAAAAAEAAAAAAAAABgAAAB4AAAAKAAAAyAAAAApBU0NJSQAAACAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAACAAICAQEAAAAAAQAAAAEAAAAWAAAACgAAAAIAAQACAAAABFIw
MwAAAgAHAAAABDAxMDAAAAAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAAERgEbAAUAAAABAAAE
TgEoAAMAAAABAAIAAAIBAAQAAAABAAAEVgICAAQAAAABAABBpAAAAAAAAABIAAAAAQAAAEgAAAAB
/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwI
CAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
DAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDP/AABEIAKAAoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAA
AAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggF
AwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNU
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
trZ7fT35fqX22fZ/RUMOXz4/SY+2a9VS+cfv/u8MOJnhkxmPFQl+jpp/6E//2f/tR45QaG90b3No
b3AgMy4wADhCSU0EBAAAAAAABxwCAAACAAIAOEJJTQQlAAAAAAAQRgzyiSa4VtqwnAGhsKeQdzhC
SU0D7QAAAAAAEAEsAAAAAQACASwAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0E
DQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0ECgAA
AAAAAQAAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAA
AQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThC
SU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP//////////////////////
//////8D6AAAAAD/////////////////////////////A+gAAAAA////////////////////////
/////wPoAAA4QklNBAgAAAAAABUAAAABAAACQAAAAkAAAAAB///8rQEAOEJJTQQeAAAAAAAEAAAA
ADhCSU0EGgAAAAADRQAAAAYAAAAAAAAAAAAAAgAAAAIAAAAACABsAGEAdgBhAHQAaQBsAGUAAAAB
AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAAA
AAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAA
AFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAIA
AAAAAFJnaHRsb25nAAACAAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAAS
AAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxF
U2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAA
AEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAA
TGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAACAAAAAABSZ2h0bG9uZwAAAgAAAAADdXJsVEVYVAAA
AAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAA
AQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpB
bGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAA
AA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNl
QkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9u
ZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklN
BCgAAAAAAAwAAAABP/AAAAAAAAA4QklNBBQAAAAAAAQAAAAJOEJJTQQMAAAAAEHAAAAAAQAAAKAA
AACgAAAB4AABLAAAAEGkABgAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/7gAO
QWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM
DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAKADASIAAhEBAxEB/90ABAAK
/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUG
BwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLR
QwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZm
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
fo6af+hP/9k4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABv
AHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADIAAAABADhCSU0EBgAA
AAAABwAIAAAAAQEA/+FGYWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJl
Z2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxu
czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iMy4xLjEtMTExIj4KICAgPHJkZjpSREYgeG1s
bnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAg
ICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0i
aHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlv
bj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZQ2JDclBvc2l0aW9uaW5nPjI8
L3RpZmY6WUNiQ3JQb3NpdGlvbmluZz4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MzAwMDAw
MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MzAw
MDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVu
aXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6V2hpdGVQb2ludD4KICAg
ICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGk+MzEzLzEwMDA8L3JkZjps
aT4KICAgICAgICAgICAgICAgPHJkZjpsaT4zMjkvMTAwMDwvcmRmOmxpPgogICAgICAgICAgICA8
L3JkZjpTZXE+CiAgICAgICAgIDwvdGlmZjpXaGl0ZVBvaW50PgogICAgICAgICA8dGlmZjpQcmlt
YXJ5Q2hyb21hdGljaXRpZXM+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8
cmRmOmxpPjY0LzEwMDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjMzLzEwMDwvcmRm
OmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjIxLzEwMDwvcmRmOmxpPgogICAgICAgICAgICAg
ICA8cmRmOmxpPjcxLzEwMDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjE1LzEwMDwv
cmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjYvMTAwPC9yZGY6bGk+CiAgICAgICAgICAg
IDwvcmRmOlNlcT4KICAgICAgICAgPC90aWZmOlByaW1hcnlDaHJvbWF0aWNpdGllcz4KICAgICAg
ICAgPHRpZmY6WUNiQ3JDb2VmZmljaWVudHM+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAg
ICAgICAgICA8cmRmOmxpPjI5OS8xMDAwPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+
NTg3LzEwMDA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT4xMTQvMTAwMDwvcmRmOmxp
PgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwvdGlmZjpZQ2JDckNvZWZmaWNpZW50
cz4KICAgICAgICAgPHRpZmY6TWFrZT5OSUtPTiBDT1JQT1JBVElPTjwvdGlmZjpNYWtlPgogICAg
ICAgICA8dGlmZjpNb2RlbD5OSUtPTiBENzA8L3RpZmY6TW9kZWw+CiAgICAgICAgIDx0aWZmOk5h
dGl2ZURpZ2VzdD4yNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4
MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjsw
M0QyMjg4NDBFNjc2NTI0RjQxODNDNEQzMEY5MEQ5MjwvdGlmZjpOYXRpdmVEaWdlc3Q+CiAgICAg
IDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgog
ICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAg
ICAgICA8eGFwOk1vZGlmeURhdGU+MjAwNy0wNS0wMVQxNjowNzoyNSswMjowMDwveGFwOk1vZGlm
eURhdGU+CiAgICAgICAgIDx4YXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENTMiBXaW5k
b3dzPC94YXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4YXA6Q3JlYXRlRGF0ZT4yMDA3LTA1LTAx
VDE2OjA3OjI1KzAyOjAwPC94YXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURh
dGU+MjAwNy0wNS0wMVQxNjowNzoyNSswMjowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgPC9y
ZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg
ICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAg
ICAgPGV4aWY6RXhpZlZlcnNpb24+MDIyMTwvZXhpZjpFeGlmVmVyc2lvbj4KICAgICAgICAgPGV4
aWY6Rmxhc2hwaXhWZXJzaW9uPjAxMDA8L2V4aWY6Rmxhc2hwaXhWZXJzaW9uPgogICAgICAgICA8
ZXhpZjpDb2xvclNwYWNlPi0xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOkNvbXBv
bmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAg
PHJkZjpsaT4xPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+MjwvcmRmOmxpPgogICAg
ICAgICAgICAgICA8cmRmOmxpPjM8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT4wPC9y
ZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9leGlmOkNvbXBvbmVudHND
b25maWd1cmF0aW9uPgogICAgICAgICA8ZXhpZjpDb21wcmVzc2VkQml0c1BlclBpeGVsPjQvMTwv
ZXhpZjpDb21wcmVzc2VkQml0c1BlclBpeGVsPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNp
b24+NTEyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5z
aW9uPjUxMjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkRhdGVUaW1lT3Jp
Z2luYWw+MjAwNy0wMy0wM1QxMjo1MDo0MSswMTowMDwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPgog
ICAgICAgICA8ZXhpZjpEYXRlVGltZURpZ2l0aXplZD4yMDA3LTAzLTAzVDEyOjUwOjQxKzAxOjAw
PC9leGlmOkRhdGVUaW1lRGlnaXRpemVkPgogICAgICAgICA8ZXhpZjpFeHBvc3VyZVRpbWU+MTAv
ODAwMDwvZXhpZjpFeHBvc3VyZVRpbWU+CiAgICAgICAgIDxleGlmOkZOdW1iZXI+MTAwLzEwPC9l
eGlmOkZOdW1iZXI+CiAgICAgICAgIDxleGlmOkV4cG9zdXJlUHJvZ3JhbT40PC9leGlmOkV4cG9z
dXJlUHJvZ3JhbT4KICAgICAgICAgPGV4aWY6RXhwb3N1cmVCaWFzVmFsdWU+MC82PC9leGlmOkV4
cG9zdXJlQmlhc1ZhbHVlPgogICAgICAgICA8ZXhpZjpNYXhBcGVydHVyZVZhbHVlPjMwLzEwPC9l
eGlmOk1heEFwZXJ0dXJlVmFsdWU+CiAgICAgICAgIDxleGlmOk1ldGVyaW5nTW9kZT41PC9leGlm
Ok1ldGVyaW5nTW9kZT4KICAgICAgICAgPGV4aWY6TGlnaHRTb3VyY2U+MDwvZXhpZjpMaWdodFNv
dXJjZT4KICAgICAgICAgPGV4aWY6Rmxhc2ggcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAg
ICAgICAgICA8ZXhpZjpGaXJlZD5GYWxzZTwvZXhpZjpGaXJlZD4KICAgICAgICAgICAgPGV4aWY6
UmV0dXJuPjA8L2V4aWY6UmV0dXJuPgogICAgICAgICAgICA8ZXhpZjpNb2RlPjA8L2V4aWY6TW9k
ZT4KICAgICAgICAgICAgPGV4aWY6RnVuY3Rpb24+RmFsc2U8L2V4aWY6RnVuY3Rpb24+CiAgICAg
ICAgICAgIDxleGlmOlJlZEV5ZU1vZGU+RmFsc2U8L2V4aWY6UmVkRXllTW9kZT4KICAgICAgICAg
PC9leGlmOkZsYXNoPgogICAgICAgICA8ZXhpZjpGb2NhbExlbmd0aD4yMDAvMTA8L2V4aWY6Rm9j
YWxMZW5ndGg+CiAgICAgICAgIDxleGlmOlNlbnNpbmdNZXRob2Q+MjwvZXhpZjpTZW5zaW5nTWV0
aG9kPgogICAgICAgICA8ZXhpZjpGaWxlU291cmNlPjM8L2V4aWY6RmlsZVNvdXJjZT4KICAgICAg
ICAgPGV4aWY6U2NlbmVUeXBlPjE8L2V4aWY6U2NlbmVUeXBlPgogICAgICAgICA8ZXhpZjpDdXN0
b21SZW5kZXJlZD4wPC9leGlmOkN1c3RvbVJlbmRlcmVkPgogICAgICAgICA8ZXhpZjpFeHBvc3Vy
ZU1vZGU+MDwvZXhpZjpFeHBvc3VyZU1vZGU+CiAgICAgICAgIDxleGlmOldoaXRlQmFsYW5jZT4w
PC9leGlmOldoaXRlQmFsYW5jZT4KICAgICAgICAgPGV4aWY6RGlnaXRhbFpvb21SYXRpbz4xLzE8
L2V4aWY6RGlnaXRhbFpvb21SYXRpbz4KICAgICAgICAgPGV4aWY6Rm9jYWxMZW5ndGhJbjM1bW1G
aWxtPjMwPC9leGlmOkZvY2FsTGVuZ3RoSW4zNW1tRmlsbT4KICAgICAgICAgPGV4aWY6U2NlbmVD
YXB0dXJlVHlwZT4wPC9leGlmOlNjZW5lQ2FwdHVyZVR5cGU+CiAgICAgICAgIDxleGlmOkdhaW5D
b250cm9sPjA8L2V4aWY6R2FpbkNvbnRyb2w+CiAgICAgICAgIDxleGlmOkNvbnRyYXN0PjA8L2V4
aWY6Q29udHJhc3Q+CiAgICAgICAgIDxleGlmOlNhdHVyYXRpb24+MTwvZXhpZjpTYXR1cmF0aW9u
PgogICAgICAgICA8ZXhpZjpTaGFycG5lc3M+MDwvZXhpZjpTaGFycG5lc3M+CiAgICAgICAgIDxl
eGlmOlN1YmplY3REaXN0YW5jZVJhbmdlPjA8L2V4aWY6U3ViamVjdERpc3RhbmNlUmFuZ2U+CiAg
ICAgICAgIDxleGlmOk5hdGl2ZURpZ2VzdD4zNjg2NCw0MDk2MCw0MDk2MSwzNzEyMSwzNzEyMiw0
MDk2Miw0MDk2MywzNzUxMCw0MDk2NCwzNjg2NywzNjg2OCwzMzQzNCwzMzQzNywzNDg1MCwzNDg1
MiwzNDg1NSwzNDg1NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4Mywz
NzM4NCwzNzM4NSwzNzM4NiwzNzM5Niw0MTQ4Myw0MTQ4NCw0MTQ4Niw0MTQ4Nyw0MTQ4OCw0MTQ5
Miw0MTQ5Myw0MTQ5NSw0MTcyOCw0MTcyOSw0MTczMCw0MTk4NSw0MTk4Niw0MTk4Nyw0MTk4OCw0
MTk4OSw0MTk5MCw0MTk5MSw0MTk5Miw0MTk5Myw0MTk5NCw0MTk5NSw0MTk5Niw0MjAxNiwwLDIs
NCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMjAsMjIsMjMsMjQsMjUsMjYs
MjcsMjgsMzA7OEYxMzJBQ0YyQzREMjFCOUVGNTNBNERFQjIxODdFRjc8L2V4aWY6TmF0aXZlRGln
ZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6
YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eGFwTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFw
LzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh
cC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIj4KICAgICAgICAgPHhhcE1NOkRvY3VtZW50SUQ+dXVp
ZDo5NEU2NTgxMkVERjdEQjExQTk2NzlFM0Y4RkZBREE1RDwveGFwTU06RG9jdW1lbnRJRD4KICAg
ICAgICAgPHhhcE1NOkluc3RhbmNlSUQ+dXVpZDo5NUU2NTgxMkVERjdEQjExQTk2NzlFM0Y4RkZB
REE1RDwveGFwTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhhcE1NOkRlcml2ZWRGcm9tIHJkZjpw
YXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+dXVpZDpC
NEQ4NzFEQjFFRjdEQjExOEU3NUFENzExNUJCOUFDNjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAg
ICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+dXVpZDo0Njg0RDcxNjU1RjZEQjExOEUwNEQ4MUVGMkVD
MTEyNTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgPC94YXBNTTpEZXJpdmVkRnJvbT4KICAg
ICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIi
CiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+
CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvanBlZzwvZGM6Zm9ybWF0PgogICAgICA8L3JkZjpE
ZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAg
ICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIj4K
ICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAg
ICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPkFkb2JlIFJHQiAoMTk5OCk8L3Bob3Rvc2hvcDpJ
Q0NQcm9maWxlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNj
cmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
PD94cGFja2V0IGVuZD0idyI/Pv/iAkBJQ0NfUFJPRklMRQABAQAAAjBBREJFAhAAAG1udHJSR0Ig
WFlaIAfPAAYAAwAAAAAAAGFjc3BBUFBMAAAAAG5vbmUAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAA
ANMtQURCRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmNw
cnQAAAD8AAAAMmRlc2MAAAEwAAAAa3d0cHQAAAGcAAAAFGJrcHQAAAGwAAAAFHJUUkMAAAHEAAAA
DmdUUkMAAAHUAAAADmJUUkMAAAHkAAAADnJYWVoAAAH0AAAAFGdYWVoAAAIIAAAAFGJYWVoAAAIc
AAAAFHRleHQAAAAAQ29weXJpZ2h0IDE5OTkgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQAAABk
ZXNjAAAAAAAAABFBZG9iZSBSR0IgKDE5OTgpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAA
AAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAY3VydgAAAAAAAAABAjMAAGN1cnYAAAAA
AAAAAQIzAABjdXJ2AAAAAAAAAAECMwAAWFlaIAAAAAAAAJwYAABPpQAABPxYWVogAAAAAAAANI0A
AKAsAAAPlVhZWiAAAAAAAAAmMQAAEC8AAL6c/+4ADkFkb2JlAGRAAAAAAf/bAIQAAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEB
AQEBAQEBAQEBAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
AwMDAwMD/8AAEQgCAAIAAwERAAIRAQMRAf/dAAQAQP/EAaIAAAAGAgMBAAAAAAAAAAAAAAcIBgUE
CQMKAgEACwEAAAYDAQEBAAAAAAAAAAAABgUEAwcCCAEJAAoLEAACAQMEAQMDAgMDAwIGCXUBAgME
EQUSBiEHEyIACDEUQTIjFQlRQhZhJDMXUnGBGGKRJUOhsfAmNHIKGcHRNSfhUzaC8ZKiRFRzRUY3
R2MoVVZXGrLC0uLyZIN0k4Rlo7PD0+MpOGbzdSo5OkhJSlhZWmdoaWp2d3h5eoWGh4iJipSVlpeY
mZqkpaanqKmqtLW2t7i5usTFxsfIycrU1dbX2Nna5OXm5+jp6vT19vf4+foRAAIBAwIEBAMFBAQE
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
GrpMdWybP2Z4Nux7rxrw3rUkeYKy6UNj7nD3h3fkr2o9n/6se1fJcnL2/wC/y2rS7gkrTPLEXVnQ
XN1WY271/SKhag1YVHQT2zlreIr2735+aElhjlSKJUWngzSSJ+pLqeSsmjUpWV5AhYFFUivWtR35
27V777E7ixOMrqaTGZLfGZjFUMRDt2nipqKvmg+2gxsDyJR20W0aix+p5Pvqt7cclW/L3LPI15dQ
OLuHb4jp8QzEl0DajIQC1a1rSg6xN9wOdzzNzDzxtm3XqPZPfyIWMYhA8NiunQuARTy4nPR+v5Lf
xkPZnfNb2LltyY7Z+D67p2hxVblcJXbiOa3Q7LJR0dHt2BWjyqog1N5rU6Ly/HHvHL7+PuwOUvbq
35Xsttlvdw3N6yJHKkHhW4wztMfgqcLp7ycL0PPu28pXNtc7zzkNskubWzT6YR+IIdbSAhnLuyhU
jSpBB1FiNPdToBf5w/WlTF8/MtioVY7g33T7ap61VpoKHHDN1ssVC0mMgp1Skp6WTWH8cShEJtb3
If3IuaYW+7dZ3shH7u29pylWLuYkBcCRmJYtxGompAqT1Gn3seU7DdPeTlU7O0ujdtvtoxrLNoao
SoZyWYqtSSTViKmvV1/Yf8nPqrCdCdZ7W+OvYoqe29nbW2/kOwMbnZMJvXr3L9gZukhrM6m8cNgo
qrc2KraeOdY6ZiHWGH6qOT7wM5b+/DzfuHuLzXu/uZywU5KvruZLN4hLa3sVnEzLEbWWUrbyISCz
jBdvM8Osj+WfaKxPKkfLuwta7f8Au2SRYPqUYx3bgCs92rqA7yUbSQ4KLpCoePVBPdvx57w+JuWy
LdvdZYyk27W7glpcLlsPXtNs3K5hmMmjF1I8OVaOO2oU8qDSOCB76O8g+5vt/wC81lbDknmuaTdY
7UNKkqUuY4uFZFzHXy1qTU5HUJc1cmc2+2DNe808u242qaYeE8UlbZ3fICkd614iNgaDoKajuXeG
4HioMxnNWBglhFbQUEKq8NNApMGNpkazRaF+jqRY+xnFyJse3LJcWO303FlOh5DxYnLsRxr6cOiC
Xnve9y02u4blWwRxrWMZVQMRD0p6jzNehj3D8hk3Li8Rg8Fsijo8ZTUNPivtM1lanNTV6oVX7qsr
qz1QTMRcopCqPYG2z2wbabu93LceYHkuXlaTXFGsQQkfCqLxHo3E9DTdfc3962Vlt+3bCi2qxiML
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
duv/2Q==
/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZMAAAAAB/9sAhAABAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMDAwMDAQEBAQEBAQIB
AQICAgECAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwP/
wAARCAQABAADAREAAhEBAxEB/8QBogAAAAYCAwEAAAAAAAAAAAAABwgGBQQJAwoCAQALAQAABgMB
AQEAAAAAAAAAAAAGBQQDBwIIAQkACgsQAAIBAwQBAwMCAwMDAgYJdQECAwQRBRIGIQcTIgAIMRRB
MiMVCVFCFmEkMxdScYEYYpElQ6Gx8CY0cgoZwdE1J+FTNoLxkqJEVHNFRjdHYyhVVlcassLS4vJk
g3SThGWjs8PT4yk4ZvN1Kjk6SElKWFlaZ2hpanZ3eHl6hYaHiImKlJWWl5iZmqSlpqeoqaq0tba3
uLm6xMXGx8jJytTV1tfY2drk5ebn6Onq9PX29/j5+hEAAgEDAgQEAwUEBAQGBgVtAQIDEQQhEgUx
BgAiE0FRBzJhFHEIQoEjkRVSoWIWMwmxJMHRQ3LwF+GCNCWSUxhjRPGisiY1GVQ2RWQnCnODk0Z0
wtLi8lVldVY3hIWjs8PT4/MpGpSktMTU5PSVpbXF1eX1KEdXZjh2hpamtsbW5vZnd4eXp7fH1+f3
SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwATvlZ8
rPlFgPlF8ksFgvkl35hMHhO/O4cRhsNiO4ew8bisRisb2HuKjx2MxmOo9xQ0dBj6CjhSKGGJEjij
QKoCgD3i9v2/b5Fvl7FFe3axLdzAATSAACRgAAGoABgAYA67ze03tN7V7h7V8s39/wAs8vz30/L+
3SSSSbdZvJJI9nCzu7tCWd3YlmZiWZiSSSegD/2cP5b/APeUvyM/9Hd2Z/8AZP7Kv6w8wf8AKdef
85pP+gupA/1mvaD/AKZTlv8A7lll/wBaOnFfl/8ALT+EzSf7NF8ivIMjTIJP9NnZesI1NVsyBv7z
agpZQSPpce7/ANYd/wDDr9deVr/v6T0P9LpOfZz2h+sC/wBVeW9Phk0/dllSupf+EdN3+zh/Lf8A
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
GrgkkcOv/9k=
This is the place to get rboue's plugins for [[TiddlyWiki (TW5)|http://tiddlywiki.com/]].
''Plugins : ''
[[SocialCalc|SocialCalc/introduction]]
[[Three.js|Three.js/introduction]]